前言

Mathematica 是一款符号计算软件。为什么要学习Mathematica?在一些科研工作中,「敏捷」是非常重要的。有的时候,一个点子想出来了,如果觉得自己半个小时就能验证,那大多数人就会立刻去做;而若是觉得这个点子需要大量的时间来验证,心生畏惧,可能就会拖着、甚至不做。这样就会产生非常大的效率差异。(有研究证实,Mathematica的平均代码量,正比于C语言代码量的开根号)

关于为什么要使用 Mathematica,可以参考这篇文章:

《Paper 已经过时——计算机时代科学传播方式的变革》

Mathema tica 视频教程

Mathematica 概述(6分钟,免费)

本文视频教程(24分钟,免费)

作者在集智AI学园开设的 Mathematica 系列课程已经上线,持续更新中。课程视频教程中会有更多细节,建议以视频为主,文稿为辅

教程文字版
目录:
1+1
帮助文档
表达式与输入
绘图微分方程/函数
科研层级的 Mathematica 工程

大家好,这是我们的第一节Mathematica课程。在每一节课程中,我都会用一个完整的例子,来教大家学习Mathematica的常用操作。

我们知道,在风雨、雷电,这些自然现象的背后,可能存在着非常简洁的物理学规律。但精确的天气预报却一直是一个难题,在四十年前,七天天气预报的准确度在40%左右徘徊,时至今日,准确度也刚刚超过了「及格线」——60%。

而预报的困难,来自于「混沌」。一个「混沌系统」,对于初值非常敏感,而由于计算技术的限制,误差总是不可避免,因此,我们对混沌系统,是无法作出长期、精确的预测的。而气象体系,恰恰是一个混沌、复杂的系统。

在近六十年之前,Lorenz在研究大气对流的时候,发现自己列出的方程组,对初值非常敏感,一点点扰动,就会在后期,产生巨大的差异。这就是著名的「洛伦兹系统(Lorenz System)」。而要能研究这类系统,就需要使用计算机去处理微分方程,对计算结果进行可视化处理。而Mathematica,则是进行这些工作的绝佳选择。

这是我们的第一节Mathematica课程,我想以洛伦兹系统为引子,来介绍基本的Mathematica操作。包括软件的基本操作与设置,常用的代码。同时,我会介绍在实际的科学研究中,如何管理一个Mathematica工程。

如何获取正版的Mathematica软件:国内的用户,一般推荐从中科院软件中心购买(邮件联系:mathematica@sec.ac.cn, xmi@sec.ac.cn),会有很大的优惠。

1+1

Mathematica拥有非常先进的符号计算系统,以及强大的数值计算系统。但在一开始,我先演示一下最基本的计算操作。

欢迎界面

在欢迎界面,直接点击左上角的「新文档」,就可以新建一个「笔记本」。「笔记本」(notebook),是Mathematica中最常用也最便捷的文档格式。

笔记本

这里可以看到一个横向的光标,可以直接输入代码,输入之后,就会变为常见的纵向光标。我们首先进行最为基本的计算:1+1

输入:1+1,按下Shift+Enter,就会在下面得到计算结果:2

注意下面会出现一个「建议栏」。建议栏的作用,就是根据输出的结果,提示一些相关的操作。这在初期阶段,是非常有用的学习资源,建议开启。

比如说,我们做另一个计算:1234+4321,得到:

直接点击「质因数分解」,就会自动生成新的计算单元:

那么借这个机会,我们就可以了解质因数分解需要什么函数来处理。而要深入学习的话,则可以点击这个函数,按F1,或者右键点击「获取帮助」,来查看Mathematica的帮助文档。Mathematica的帮助文档写的非常好,非常容易理解。

帮助文档

Mathematica的帮助文档是Mathematica的创始人,Stephen Wolfram亲自写作的。Wolfram的经历非常传奇,他在15岁的时候就发表了第一篇粒子物理学论文,并发表在学术期刊上(http://www.stephenwolfram....hadronic-electrons.pdf)。而后来,他转向对元胞自动机的研究,也「顺便」开发了Mathematica语言(现在叫 Wolfram Language)。

作为自己亲手缔造的语言,Wolfram自然在帮助文档上下足了功夫。比如,在帮助文档下面,会有「参见」栏,会列出相关的函数。很多时候,如果你觉得应该有某个函数,但又不知道的时候,就可以利用「参见」栏,跳跃式的查找相应的函数。

举个例子:我们想找到「给出下一个素数」的函数。当我们熟悉了Mathematica之后,其实在直觉上可以判断,某个功能的函数是否存在。以我的经验,这个函数是大概率存在的。那么,我们从素数Prime开始查找,可以看到,「参见」栏中,有一个叫做「NextPrime」的函数,很明显,就是我们要找的函数。

顺便说一句,建议栏还存在一些bug,当输出数据非常庞大的时候,可能会引起内核崩溃。即使是我们使用分号关闭显式的输出时,建议栏也可能引发崩溃。所以在熟悉了Mathematica之后,反而会建议大家关闭。

好,参考文档暂时打住,我们回到一开始的主要目标:构造洛伦兹系统。

表达式与输入

我们知道,公式是数学、物理研究的基石之一。所以在一开始,我们就要学会基本的表达式输入。最基本的表达式,就是单个的符号。比如说,a, b, c这样的代数式。我们试着计算(a+b)/b:

这里我们用control+/键,可以输入手写形式的表达式。非常直观,后面在使用的时候,会一一演示。大家也可以直接看屏幕左下角的键位记录。

可以看到,Mathematica似乎就是按照原式直接输出了,没有进行化简。实际上如果我们输入a-a的话,可以看到,Mathematica是进行了最基本的化简的:

想要化解前面的式子,我们可以使用Simplify函数:

这里还是没有任何变化。这是因为Mathematica认为这样的表达式比a/b+1还要简洁一些。我们试一试其他表达式:

在表达式的后面,我们加上一些限制条件。Mathematica默认代数符号是属于复数域的,想要化简为下面的形式,就必须制定a,b是实数。

对于一些特殊的符号,比如 α、β ,可以用ESC+a+ESC, ESC+b+ESC来输入,这在后面也会逐步介绍。

绘图

学会输入表达式之后,我们就可以进行函数的可视化输出了。

使用Plot函数进行绘图。Plot函数的格式非常简洁:Plot[函数,{变量,变量最小值,变量最大值}]

进一步的,有Plot3D函数:

Mathematica中,绘图函数基本都是这样的格式:函数名[表达式/数据,范围]。所以就不赘述了,在视频教程中,有详细的解读。

微分方程/函数

前面说到,洛伦兹系统是由微分方程表示的。Mathematica中,使用DSolve解符号微分方程,使用NDSolve解数值微分方程。先从DSolve开始说:

其中C[1],表示第一个待定系数,而且任意一个C[1]都是上面微分方程的解。如果有多个表达式,可以使用花括号括起来。上面解的方程,其实就是:

可以引入边界条件:

我们来尝试一下解洛伦兹方程:

可以看到,Mathematica并没有解这个方程,而是直接把输入代码直接输出了。这是因为这类方程通常都没有解析解,自然也无法直接表达出来。

这个时候,我们就需要使用数值方法来解方程。Mathematica提供了NDSolve来解数值微分方程。

其给出了一个替换列表,即将x,y,z分别替换为对应的插值函数。

这个时候,我们就可以进行可视化操作了:

上图中,{x[t],y[t],z[t]}/.ans的意思是,使用ans中定义的x,y,z,来替换/.之前的xyz,这样就可以将图像绘制出来。

这里有很多这些,可以通过修改PlotPoints来获得更加平滑的图像:

我们可以看到,这个方程的系数都是在代码中给定的,如果我们想要修改系数的话,就需要回到前面的代码中手动去改。这样就很不方便,我们定义一个函数来返回计算结果:

函数在本质上,是一个「替换规则」。比如上图中的,就是要将 ρ、σ、β 替换为后来调用时的数值。而在调用函数时,Mathematica使用的是「模式识别」。只要符合L[{., ., .}, {., ., .}, .]的形式,都会使用后面的定义。而若是有差别,则不会报错,而是原样输出。

由于这个性质,我们可以定义很多有意思的函数,比如说:

可以直接在Mathematica中按照这样的格式定义,非常形象。(具体参见视频教程)

科研层级的Mathematica工程

如果你处理过大规模的Mathematica程序,就会发现,每一次关闭、再打开的时候,都要重新运行之前定义过的函数。有时候有几十个函数层层嵌套,处理起来很费时间。有时在函数中间,还会夹杂一些其他的代码,会使得人在处理的时候,非常难受。

这个时候,就要引入Mathematica的程序包。在重新打开程序的时候,直接导入程序包,就可以导入所有需要的函数,效率会非常高。

而更重要的是,使用程序包将代码打包,会在分享程序的时候非常有用。别人不清楚你代码的结构,如果直接一个notebook文件发过去,他通常无法正确使用。而用程序包打包之后,问题就引刃而解了。

程序包的使用细节,参见视频教程。

本文视频教程:Mathematica 从1+1到混沌(24分钟,免费)

系列直播课上线

小伙伴组队学习折上折:

3人组团959,5人组团899,10人及以上团799

在校学生特惠:5人组团即可享受799的10人团购价

学生组团学习交流群,进群组队学习

数据科学家,21世纪最性感的职业!

关注集智AI学园公众号

获取更多更有趣的AI教程吧!

搜索微信公众号:swarmAI

集智AI学园QQ群:426390994

学园网站:campus.swarma.org

商务合作|zhangqian@swarma.org

投稿转载|wangjiannan@swarma.org