序言
在处理很多数学问题的时,有时候需要利用一些数学软件来检验或者是测试自己的想法、处理方式是否正确,而这里就大致简单总结一下常用的数学软件。数学软件是用来建模、分析、计算各种数学资料,包括数值、符号、几何资料等之电脑软件。
以下是我们总结的一些常用的数学软件,至于那些少许专业用户的数学软件,我会在最后略微有点说说吧。
Julia
![e1107e93-e320-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/e1107e93-e320-eb11-8da9-e4434bdf6706.png)
Julia 是一种高级通用动态编程语言,它最初是为了满足高性能数值分析和计算科学的需要而设计的,不需要编译器速度快,也可用于客户端和服务器的Web用途、低级系统编程或用作规约语言。
Julia设计的独特之处包括,参数多态的类型系统,完全动态语言中的类型,以及它多分派的核心编程范型。它允许并发、并行和分布式计算,并直接调用C和Fortran库而不使用粘合代码。
Julia拥有垃圾回收机制,使用及早求值,包含了用于浮点计算、线性代数、随机数生成和正则表达式匹配的高效库。有许多库可以使用,其中一些(如用于快速傅里叶变换的库)已经预先捆绑在Julia里。
鉴于大家想要一个不要钱的数学软件,没错的,这个Julia就是不要钱,而且她的源程序都在 [github](https://github.com/JuliaLang/julia)上,你可以自己浏览,以及自己编译。因为,Julia是免费的、开源的!
主要用于数值计算
- 核心语言非常小。标准库用的是Julia语言本身写的
- 调用许多其它成熟的高性能基础代码。如线性代数、随机数生成、快速傅里叶变换、字符串处理。
- 丰富的用于创建或描述对象的类型语法
- 高性能,接近于静态编译型语言。包括用户自定义类型等
- 为并行计算和分布式计算而设计
- 轻量级协程
- 优雅的可扩展的类型转换/提升
- 支持Unicode,包括但不限于UTF-8
- 可直接调用C函数(不需要包装或是借助特殊的API)
- 有类似shell的进程管理能力
- 有类似Lisp的宏以及其它元编程工具
- 可与jupyter notebook 一起使用
为什么我们要创造Julia
简短来讲,是因为我们很贪婪。
我们之中有些是使用MATLAB的重量级用户,有些是来自Lisp的极客,还有一些是来自Python和Ruby的魔法师,甚至还有来自Perl社区的大魔法师。我们之中还有从胡子都没长齐时就开始使用Mathematica的。其中的有些人现在都没长胡子!我们像是疯了一样用R画了越来越多的图,而C是我们的硬核摇滚(也有大杀器之意)。
我们热爱所有这些语言,他们实在很好很强大。在我们从事的领域(科学计算,机器学习,数据挖掘,大规模线性代数计算,分布式和并行计算)中,每一种语言都对某一项工作的一项特定需求非常完美,但是却无法胜任其它需求。于是使用什么语言都需要我们去权衡。
而我们很贪婪,我们还想要更多。
我们想要的是一个自由开源的语言,并且它同时拥有C的速度和Ruby的动态性;我们想要一个具有同像性(可以将语言的脚本本身当作数据进行处理)的语言,它有着真正的和lisp一样的宏,但是却像Matlab一样有着显然的,类似于数学表达式的标记;我们想要一个既可以像Python一样作为通用编程语言的工具,又可以像R那样适用于统计分析,能像Perl那样自然地处理字符串,能像Matlab那样给力地处理矩阵运算,它还要能像shell一样作为胶水将各种程序粘合在一起;我们想要一个简单易学的语言,同时它还能让最苛刻的魔法师们(hackers)开心。我们希望它是交互式的,但我们也希望它能被编译。
(我们刚刚有提它要和C一样快嘛?!)
当我们在构思这些需求的时候,我们发现它还得有Hadoop这样强大的分布式能力,却不想要Hadoop里面那些冗长Jave和XML模板,更不想被被迫在几个GB的日志文件和几百台机器里找bug。我们不想要那些令人费解的层次结构。我们想让简单的标量循环能被编译成仅用寄存器和一块CPU的干净的机器码。我们希望简单地写下A*B就能够在成千上万的机器上用成千上万地运算来计算这个庞大的矩阵乘法。
如无必要,那就不用声明类型。但当我们需要多态函数(polymorphic functions)时,我们也想要用泛型编程(generic programming)仅仅书写一次算法,就能够在无限多的类型上使用。我们想要多重派发(multiple dispatch)来为一个函数所有可能的参数选出最佳的执行方法。这些参数可能有着不同定义,不同类型,但是却有着相同功能。在拥有以上能力的同时,我们还希望这种语言简单,干净。
要求有点多,是不是?
尽管我们意识到了自己有多贪心,我们还是想要拥有这些功能。大概在两年半之前,我们开始创造这种能满足我们贪念的语言。它还没有完工——但是已经可以发布一个1.0版本了(其实等了6年才要发布)——我们创造的这个语言叫做Julia。它已经实现了我们这次乱七八糟需求的90%,而现在她需要来自更多人的乱七八糟的需求,来让她走得更远。
R语言
![e2107e93-e320-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/e2107e93-e320-eb11-8da9-e4434bdf6706.png)
一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的罗斯·伊哈卡和罗伯特·杰特曼开发(也因此称为R),现在由“R开发核心团队”负责开发。R基于S语言的一个GNU计划项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作修改的在R环境下运行。R的语法是来自Scheme。
R的源代码可自由下载使用,亦有已编译的可执行文件版本可以下载,可在多种平台下运行,包括UNIX(也包括FreeBSD和Linux)、Windows和MacOS。R主要是以命令行操作,同时有人开发了几种图形用户界面,其中RStudio是最为广泛使用的集成开发环境。
功能的包
- R内置多种统计学及数字分析功能。R的功能也可以透过安装包(Packages,用户撰写的功能)增强。因为S的血缘关系,R比其他统计学或数学专用的编程语言有更强的面向对象(面向对象程序设计, S3, S4等)功能。
- R的另一强项是绘图功能,制图具有印刷的素质,也可加入数学符号。
- 虽然R主要用于统计分析或者开发统计相关的软件,但也有人用作矩阵计算。其分析速度可媲美专用于矩阵计算的自由软件GNU Octave和商业软件MATLAB
- R的功能能够透过由用户撰写的包增强。增加的功能有特殊的统计技术、绘图功能,以及编程接口和数据输出/输入功能。这些软件包是由R语言、LaTeX、Java及最常用C语言和Fortran撰写。下载的可执行文件版本会连同一批核心功能的软件包,而根据CRAN记录有七千多种不同的软件包。其中有几款较为常用,例如用于经济计量、财经分析、人文科学与社会科学研究以及人工智能
GNU Octave
![e4107e93-e320-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/e4107e93-e320-eb11-8da9-e4434bdf6706.png)
GNU Octave是一种采用高级编程语言的主要用于数值分析的软件。Octave有助于以数值方式解决线性和非线性问题,并使用与MATLAB兼容的语言进行其他数值实验。它也可以作为面向批处理的语言使用。因为它是GNU计划的一部分,所以它是GNU通用公共许可证条款下的自由软件。
Octave是MATLAB的主要自由替代品之一,其他还有Scilab和FreeMat。然而,与Octave相比,Scilab更少强调与MATLAB的(双向)句法兼容性
产品功能
- Octave语言是直译式及结构化(类于第二代的BASIC)的编程语言,支持许多C语言风格的标准函数功能,同时可以使用UNIX的系统调用以进行扩展增进功能,但不支持以引用的方式传递参数。
- Octave的核心由一组内置的(built-in)矩阵运算语言(如四则运算)和可加载函数(Loadable Function)组成(例如求矩阵逆inv),其余能在核心语言之上实现而且性能开销不会显著增加的函数调用则一般以Octave脚本的形式存在(例如求解方程组的fsolve函数)。Octave 解释器会自动处理各种不同类型的调用。
- Octave支持数据建构,也支持基本的面向对象编程,但通常仍把它当作面向过程的程序设计语言来看待。
- 它的语法基本上与Matlab一致,严谨编写的代码应同时可在Matlab及Octave运行。但若调用了Matlab工具包,则一般不能直接在Octave上运行,因为Octave附带的工具包与Matlab并不兼容。
- 由于Octave是以GNU通用公共许可证许可,所以可以自由地复制、流通与使用。Octave可在大部分的类Unix操作系统中运行,亦可在Microsoft Windows中运行。在MacOS中运行也是可能的,但设置较为复杂。
以上三个是免费的、不要钱的数学软件,偏向于工程计算和数据分析方向,符号处理几乎没有的,另外我强烈推荐那个Julia,现在还在学习中的。下一期我继续推荐其他一些在比如优化建模、数据分析、金融数学、群论等领域,比较特殊的数学软件。