做科学计算一直以来是我的兴趣之一。
我目前正在用空余时间开发一个科学运算系统和一个面向科学的编程语言。
我知道桌面端已有像 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 进行运算。(暂未实现)