做科学计算一直以来是我的兴趣之一。
我目前正在用空余时间开发一个科学运算系统和一个面向科学的编程语言。
我知道桌面端已有像 MATLAB、Mathematica 这样功能极其丰富的软件了
移动端也可以用像 Symbolab、Wolfram Alpha 这样的软件了
我感觉它们确实很强大,但我感觉它们总有缺陷
所以我正在试图自己做一个让自己满意的科学运算系统,做着做着发现已经可以变成一个编程语言了
Plotter 的实现原理其实也没大家想的那么复杂,因为站在了巨人的肩膀上
其特点是轻量级(软件包应该不会超过50 Mib)、完全本地运行、全平台支持
内置了大量函数,自认为用来科学运算操作比较方便
下面是我写的一个简单的策划

Plotter: 面向科学的计算系统&程序设计语言(Developing)

Plotter 是一个轻量级、完全本地运行、全平台的科学计算系统,也是一个面向科学运算的程序设计语言。

其组成分为以下几个部分:

  • 数值运算系统
  • 符号代数系统
  • 计算几何系统
  • 单位运算系统
  • 几何、数值、符号、数据可视化系统
  • Plotter 语言的编译器
  • 全平台 GUI

上述系统的一部分工作已经完成了,未完成的部分我会打括号标注。

下面我将一一解释上述组成部分。

组成部分

数值运算系统

基本的算数与函数(复数域内)

基本的四则运算、三角函数以及其反函数、双曲三角函数以及其反函数、指数函数、对数函数、一些积分函数(如 $Γ$ 函数,黎曼 $ζ$ 函数,高斯误差函数 $\mathrm{erf}$ 等)和一些超几何函数、累加Σ、累乘Π、Prime、isPrime 以及其它更多。

数值微积分:导数值、定积分(黎曼积分)

向量和矩阵运算:MATLAB 中的大部分矩阵运算均支持

同时支持稠密矩阵和稀疏矩阵的运算

矩阵的数乘、矩阵的加减、矩阵之间的左乘右乘、指数运算、点乘、叉乘、差分、转置、复共轭转置、行列式、特征值、求逆、张量积、秩、迹、reshape、resize、rotate、sort、squeeze、transpose 以及更多

组合学和概率函数

组合数、排列数、阶乘、伽马函数、KL距离、随机数、多项式分布(超几何分布)、高斯分布(正态分布)

复数(支持绝大多数函数):四则运算、幂、实部、虚部、共轭、辐角

数列、迭代式的数值运算

任意精度支持的大数运算(支持绝大多数函数):例如 9999999 的阶乘

符号代数系统

符号的四则运算、幂、指数、对数、偏导、全微分、符号积分(暂未实现<并且很难实现好>)

数值和符号的分数支持

集合运算:去重、广义交、广义并、差集、对称差、补集、子集、幂集、笛卡尔乘积、multiplicity

统计学运算:列表或者矩阵的绝对中位差、最大、最小、平均数、中位数、众数、方差、标准差、卡方检验(独立性检验)、以及其它更多。

组合函数:贝尔数、卡特兰数、第二类Stirling数、素数函数以及其它。

位运算:按位与、或、非、异或、算数(或逻辑)左移、算数(或逻辑)右移。

逻辑运算:逻辑与、或、非、异或。(只实现了逻辑运算的数值运算、符号运算暂未实现

计算几何系统(待完善)

二维或三维上的

两点间距离、两直线交点、两平面交线(暂未实现)、以及其他。

单位运算系统

单位运算系统与数值计算系统和符号代数系统兼容。

支持各种数值和符号带单位的运算和转换、甚至支持矩阵(向量)和复数带单位进行运算。

单位运算系统支持声光热力电、时间、空间、能量、化学、信息等各种属性的单位

包含了公制单位和非公制单位总共数百种

以及百余种不同学科(数学、物理学、化学、信息学等)的常数(数学常数和物理常数)

几何、数值、图、数据可视化系统

考虑使用 WebGL 和 Shader 来进行图形的计算和渲染(未实现)

几何可视化:

基础几何的创建和绘制:点、线、多边形、椭圆等。

三维图形的创建和绘制:多面体、球、线、平面等。(暂未实现)

数值可视化:

直角坐标系下以及极坐标系下的(二维已实现,三维暂未实现)

函数绘图、隐函数绘图、参数方程绘图、区域绘制

图可视化:(暂未实现)

例如:连通图的可视化、抽象语法树的可视化(暂未实现)

数据可视化:(暂未实现)

散点图、柱状图、直方图、折线图、扇形图等(暂未实现)

Plotter 语言的编译器

这是一个专门为数学以及科学运算所设计的脚本语言,可以将 Plotter 语言编译为 Javascript 代码,能够在几乎所有平台被 Javascript 引擎解释执行。

同时支持面向函数式编程、面向过程式编程和面向对象编程(待完善)。

全平台 GUI

使用三维游戏引擎开发GUI,能够支持几乎所有平台(Android、IOS、Windows、OS X、Linux、Web 浏览器、甚至各种小程序平台)

一些说明

为什么选用 Typescript 为开发语言?

首先 Typescript 是 Javascript 的超集,Javascript 的优势是语法非常灵活。Node.js 可以很方便的使用大量开源的 npm 包,避免自己造轮子。

Javascript 使得 Plotter 里面的所有数据都可以非常容易的序列化,并且将 Plotter 语言编译为 Javascript 语言很容易。Javascript 语言又可以在几乎所有平台运行,现在有各种 Javascript 引擎的优化(如 V8 的 JIT),Javascript 的运行效率还是挺不错的。

Javascript 不支持多线程怎么办?

大部分并发都可以通过 Javascript 的异步实现,但在进行同步的复杂运算时不可避免的需要用到多线程

可以通过 Web Worker 或者调用原生平台的 API 来实现多线程。(暂未实现)

Javascript 怎么做高性能运算?

在遇到大稠密矩阵的运算时,可以考虑使用 WebGL 来调用 GPU 进行运算。(暂未实现)

补充说明:

轻量级:安装包不会超过50Mib改成200Mib
当前安卓系统的安装包为10Mib,使用使用C++ WinAPI 的 Windows 系统的安装包为21Mib。
如果后期Plotter要使用完整的 DOM 和 Node.js ,就得使用Electron进行打包桌面版本,软件本体必定超过100Mib

关于Plotter语言的执行(未实现)
分为两种:

  • 全部编译为JavaScript之后被JavaScript引擎解释执行 (类似于静态编译,只不过是编译为JavaScript而不是机器码)
  • 运行到哪一语句,就把当前语句编译为JavaScript代码执行,已经编译过的语句不重复编译(类似于JIT)

我非常支持你的想法,同时提几点意见供你参考。
首先,既然你认为MatLab等已有的软件有缺陷,请说明它们的缺陷是什么。
其次,你所谓“让自己满意”的系统到底针对什么用户,满足什么需求,达到什么目标,说清楚这些有助于你下一步的工作。
第三,我推荐SageMath,开源软件,你可以看看它能干什么,是否满足自己的需求,或者有什么缺陷。

SageMath是开源软件,它也是站在巨人的肩膀上,把很多开源的计算系统融合进自己的系统中。它提供的是一种类Python语言。关于站在巨人的肩膀上,至少有几点值得注意:什么是巨人?有哪些巨人?巨人的肩膀是不是说爬就爬得上呢?如果你的系统希望长久地开发运行,那么你需要考虑未来的巨人,即在未来可以轻易地把新出现的开源代码融合进来。

最后,你以上的表述显示你开发技术懂得比”计算“要多,建议找本计算代数系统的书先看看,因为我个人认为,做这种系统,懂得”计算“是更本质的要求。最后的最后,你的想法让我想起清华大学09年一批本科生做的计算代数系统:math-mu系统。我不能说他们失败了,只能说他们的系统至今没有人在用。他们的系统有没有人继续坚持做呢?估计是没有。

祝你好运!

    Bintou 谢谢,Math-μ 我也关注过,他们仿照Mathematica的原理,还出了一本计算机代数系统的书籍,真的很厉害。

    Bintou 个人认为现有的软件如:MATLAB、Mathematica,它们软件体积巨大,没有移动平台的支持。像Wolfram Alpha,Symbol Lab这样的软件无法脱机运行,必须联网才能够使用。而Plotter特点是轻量级,全平台,本地运行。上面的那个策划有些确实太难了,对于我目前的工作来说,暂时先实现一些基本的运算和可视化就够了。

    上述优势,例如轻量级和全平台,使得这个软件能够更好的被推广使用,而且对于科学科普、教育还是有一定意义的。
    希望这种软件,能够使得科学计算更加容易,让科学更加触手可及。
    记得Wolfram曾经提到计算是一种新的科学,或许计算变的更容易能够使得科学发展吧。
    说实话,科学与计算从来都是我的兴趣。做这样一种东西刚好能够结合我的这两个兴趣。
    不过我也只是闲着的时候把玩把玩,不会耗费我太多精力。

    Plotter其实已经完成一小部分了,如果有兴趣我会再发一些进度 🙂

    Plotter制作的初衷是为了方便在移动平台上进行科学计算,所以我先制作了移动平台的 GUI,实际上Plotter的预期是全平台的。

    仅凭个人喜好,Plotter的默认色调为暗黑色,键盘为亮色,目的是加强对比度。

    动效是GUI的特点之一,它可能对科学计算来说没什么作用,但是看起来就是爽呀。

    设计原则是在不影响阅读、操作效率的前提下制作合适自然的动效。

    ptgif1.mp4
    1MB

    Plotter目前的主界面非常简单。

    上方是一个储存器,储存了目前已经定义过了的变量和值的列表。

    中间是一个可以缩放和移动的直角坐标系。

    下方是一个输入框和Caculate按钮,以及一个上拉或者点击可以拖拽出来的键盘。

    ptgif2.mp4
    2MB

    输入表达式就会立刻被计算,无须点击按钮。

    点击Caculate按钮的作用是将计算结果作为历史记录,储存到ans变量中,并在上方的储存器列表中显示出来。

    因为篇幅有限,我下面只简单列举几个Plotter支持的功能或者函数。

    • 大部分函数都支持复数的运算。
    • 支持稠密矩阵和稀疏矩阵的创建

    • 矩阵的运算

    • 单位的运算


    • 矩阵也可以带单位运算

    • 百种科学常数带单位支持

    例如阿伏伽德罗常数 $N_A$

    里德伯常量 $R_{\infty}$

    • 基本的符号运算

    • 简单的化简

    • 有理化(展开多项式或者分数通分)

    • 分数

    • 无限循环小数转分数

    • 偏导

    • 导数值

    • 创建一个对象

    • 对象的属性访问

    • 创建一个函数

    • 对象属性的赋值和函数的调用

    • 创建一个集合

    • 大数的计算

    • 范围创建矩阵

    • 间隔

    • 矩阵的切片

    • 生成LaTeX代码

    • 顺序执行
    a = {};          # 创建一个空对象
    a.f = (x,y)=>x^y;# 为对象添加一个属性,其为一个匿名二元函数
    f = d(sin(x)/dx; # 对sin(x)求偏导
    a.b = f;         # 为对象添加一个属性b,其为对f的引用
    a.b(0)           # 输出结果

    执行结果:Number: 1

    使用 # 进行代码的注释

    使用 => 创建匿名函数

    标识符(...)=... 创建一个带名字的函数

    $(表达式) 使得表达式保持原样,不被计算。类似于 Mathematica 的 Hold 或者 MATLAB Mupad 里的 hold

    以分号结尾的语句,计算结果不被输出。

    没有分号结尾的语句,计算结果将会被输出。

    • 累加、累乘、导数值和黎曼积分

    Σ(1,100,f(i)=Σ(1,i,f(j)=(i+j)^2))
    Π(1,2,f(i)=Σ(i,2,f(j)=i^j))
    Diff(f(x)=gamma(x),10)
    Integ(1,10,f(x)=x^2)
    Integ(0,10,f(x)=Integ(0,x,f(y)=(x-y)^2,100),100)

    输出结果

    60014200
    8
    817116.058897227
    332.9955450128241
    862.8770874999964

    渲染生成的LaTeX

    fuko123456 这个还是很抱歉哈,因为自己目前做的工作并不是很多,功能仍然还是很不完善,所以GitHub仓库现在还是设置为私有,并不公开。

    7 天 后

    这个和 Julia / Python / R 比起来优势又在哪呢?
    如果希望在移动平台上使用,结合一个 Jupyter-Notebook 是否能满足?

    目前来说的话,Plotter还是极其不完善的,没有办法比得过那些编程语言。
    这个语言是科学运算的副产物,并不是为大型项目和软件开发设计的。
    比较类似于MATLAB和MMA那种语言。
    Plotter目标是尽量让科学计算变的更加简单
    类似Jupyter-Notebook那样的笔记本形式其实非常不错,我也挺希望可以实现的

    2 年 后

    © 2018-2025 0xFFFF