
系列课程“Wolfram科学计算:思维与技能”,包括基础篇、数据篇、模拟篇以及实验篇,课程建设历经三个阶段,2008-2012青铜时代,2013-2016白银时代,2017-2022黄金时代。
何为“计算思维”?综合运用模型、算法以及编程,实施计算,解决问题。这是课程对“计算思维”的定义。
提升一门课的“高阶性”不等于单纯地甚至无谓地增加课程的难度。学生学习兴趣被持续激励,学生主动探索解决过程的底层逻辑,学生有机会直面复杂工程问题,这些应是“高阶性”的内核。
系列课程“Wolfram科学计算:思维与技能”,包括基础篇、数据篇和模拟篇,课程以“范例教学”理念为指引,全程案例驱动,沿着“算法”和“编程”两条主线打通学生教养性学习的任督二脉。
课程进行了周密的目标设计,为每一场讲座制定了“小目标”,而且所有学习目标都是可以测量的;仅“Wolfram科学计算:思维与技能”(基础篇)就包括27次编程复演练习和5次大作业,这些是达成目标的保障,请务必认真对待。
一开始你就需要知晓,Wolfram语言是一门标准的计算机高级语言,而且主要支持函数式编程范式。从这个意义上讲,可以将Mathematica视作Wolfram语言的IDE。除此之外,我们还可以在Wolfram Egine + Jupyter notebook平台上使用Wolfram语言编写程序。这节课结束后,需要您前往Wolfram Research的官网下载Mathematica的试用版,并安装。
Wolfram Research是Mathematica的开发商,它的logo是一个带有修饰的双曲十二面体,这个Spikey会出现在Mathematica的欢迎界面中。我从https://mathworld.wolfram.com/Spikey.html上下载了包含各个版本的Spikey的Mathematica笔记本文档,注意它是以.nb作为扩展名的。通过这个文档,你可以一览Mathematica极具极简主义精神的界面。在这节课上,你需要完成一个“复演”练习,新建一个Mathematica笔记本文档,命名并存盘。
让我们从动手实践开始。打开在1.2节创建的以.nb结尾的文档。首先认识Mathematica笔记本最基本的结构——单元。在“输入单元”In[1]中键入1+1,联击Shift键+Enter键,执行指令,在“输出单元”Out[2]中查看计算结果。请认真完成复演No.2的实操练习。
Wolfram语言支持自然书写风格,这一点在2*3、2^3这样的简单指令中便有所体现。对于初学者,“基本数学输入面板”是一个非常友好的工具,借助它可以高效快捷地书写Wolfram指令。请认真完成复演No.3的实操练习。
当你使用Wolfram语言计算分式(除法)的时候,你就会注意到Wolfram语言特有的精度设计。Mathematica默认返回绝对精确的计算结果。对比“机器精度”,Wolfram语言的“无穷精度”设计在科学计算方面具有极大的优势,特别是对于一心关注于问题本身的科研人员或工程师。请认真完成复演No.4的实操练习。
函数N是我向你介绍的第一个Wolfram函数。它很简单,只需要在中括号内键入一个变元。数值化函数N的一个重要应用是将Wolfram指令的返回值从无穷精度转换至机器精度之下。以此作为我们学习Wolfram语言函数式编程范式的起点。请认真完成复演No.5的练习以及第一章节的作业。
“符号计算”是一种智能化的计算,处理的对象是符号。符号可以是有理数、复数,也可以是多项式、函数,还可以是数学结构,如群、代数式等等。在你以往的学习中,用笔和纸进行的数学推演多为符号运算。“符号计算”是Wolfram语言的强项,因此Mathematica也被称作“计算机代数系统”。
用于计算偏微分的函数D是非常实用的。其调用格式有多种,兼顾各式各样的求导运算。该函数非常能够体现函数式范式,它是以另一个函数作为变元的。通过“参考资料中心”学习Wolfram函数的用法是条捷径。
计算函数的导数有两种方式:其一,使用Wolfram函数D;其二,使用基本数学输入面板上的算符。使用函数D时,请体会“自动语法着色机制”为正确无误地调用函数所起的作用。请认真完成复演No. 6、No. 7的实操练习。
面对像固体热容的爱因斯坦模型这般复杂的函数,我们都期望着能够直观地查看函数曲线。而Mathematica恰恰在这方面非常“在行”。在调用Plot函数时,应该关注“列表”这一Wolfram语言中最重要的数据结构的用法。单词的首字母须用大写,这是Wolfram函数的命名规则。
掌握绘图函数Plot的用法后,我们就可以直观地查看手边的公式、模型的图像了。函数的调用格式是值得关注的:
Plot是以Sin、Exp等其它函数作为变元的,这是函数式范式的又一个示例;
Plot的第二个变元是一个列表,被用来封装第一个变元函数的自变量及其上下限;
“自动语法着色”将第一个变元与第二个变元中的自变量x进行了统一涂色;
再次强调借助于Wolfram语言的参考资料中心是学习Wolfram函数用法的捷径。请认真完成复演No. 8、No. 9的练习以及第二章节的作业。
Wolfram语言支持多种编程范式,但主要支持函数式编程范式,即“万物皆函数”的编程风格或方式。
借由“一维无限深势阱中电子的量子化度”一案,把握设计与自定义函数的实质,即将问题的解决抽象为函数的输入及输出。此案例取材自量子力学,但你并不需要知晓薛定谔方程及其求解方法。请参考实验项目No. 1中对案例背景的描述。
在使用Wolfram语言自定义函数之前,需要先搞懂“延时赋值”和“模式”这两个规则。借由“约化普朗克常数”的一案,你会深刻理解“延时赋值”意味何在。请认真完成复演No. 10的实操练习。
“模式”代表各类表达式。例如,模式f[x_]表示形如f[anything]的一族表达式。模式的主要功能在于 Wolfram 语言中的许多操作不仅可以对单个表达式实现,也可以对代表某类表达式的模式进行操作。请认真完成复演No. 11的实操练习。
出现在上一章节“符号计算:求导及绘图”中的自拟范例,其取材自一本经典教材——Donald A. Neamen编著的《半导体物理与器件》。在这一节里,我将深入浅出地向你讲解一些与PN结相关的半导体物理学,并在“自定义函数”的基础上重新解决这一实际问题。请认真完成复演No. 12的实操练习,并体会“自定义函数”的好处。在课后,请认真完成第三章节的作业。
回到符号计算、计算机代数这一主题,这次我们关注积分运算。Mathematica解析积分的方式非常灵活,可以借助于“基本数学输入面板”上的算符,也可以调用函数Integrate。在计算一个具体的积分之前,建议你对被积函数作自定义。Wolfram语言默认返回的是符号积分的解析表达式,它具有无穷精度。请认真完成复演No. 13的实操练习。
再次强调:Wolfram语言参考资料中心是学习函数的首选。在Integrate页面下,包含了不定积分、定积分等符号积分的调用格式以及1号、2号入门范例。请认真完成复演No. 14的实操练习。
在大多数情况下,我们期望得到的是某个积分的数值结果。这需要我们回顾此前介绍过的Wolfram函数N。数值化函数N将一个无穷精度下的精确的符号表达式转化为一个机器精度下的近似数值。符号积分的数值化不等同于我即将在下一章节向你介绍的“数值积分”。不过,函数Plot、Integrate与数值积分函数NIntegrate的调用格式是完全相同的。请认真完成复演No. 15的实操练习。
较之于基本数学输入面板上的算符,我更建议你调用Wolfram函数进行符号积分运算。Wolfram函数Integrate是多态的,输入不同的变元,就可以计算定积分或不定积分、一元函数积分或多元函数积分等等。不仅如此,Wolfram函数还可以通过“选项”作功能上的拓展。当你不想以一个“条件表达式”作为返回值时,可以在函数的中括号内添加选项Assumptions,规定积分条件,最终令Integrate返回一个解析式。请认真完成复演No. 16的实操练习。
在正式计算一个积分问题之前,预测该积分的敛散性是必要的。这节课提出了一种快捷的预测手段,即调用Plot函数绘图。被积函数的曲线一旦在积分区间内被绘制出来,其敛散性便一目了然。强大的Mathematica提供了一种更灵活、直观的交互式操作界面,允许我们在一个GUI下,查看敛散性对被积函数内部不确定参数的响应。请认真完成复演No. 17的实操练习。
Wolfram函数Integrate尽管非常强大,但也受限于符号计算固有的瓶颈。与工程实际问题相关的积分通常是无法解析的,Integrate函数对于这些积分是失效的。当无法获得一个积分的解析结果且被积函数又具有很好的连续性,甚至单调性时,可以调用Wolfram函数NIntegrate开展近似的数值计算,这将是下一章节的主题。请认真完成复演No. 18的实操练习。在课后,请认真完成第四章节的作业。
在工程实际中会经常遇到无法解析的积分、非线性方程等等,符号计算对此是无能为力的,必须求助于数值计算。数值计算的核心是算法,二分法、梯形法则、牛顿法、高斯消元法,……这些古典数值算法在今天仍然被广泛应用着。将困难的积分、方程求解转换为大规模的加减乘除计算,这是计算机最擅长的作业。
搜索3的平方根(sqrt(3))是一个典型的数值计算问题。古老的二分法对于该问题依然适用。二分法的计算效率很低,但其计算精确度是可控的。3的平方根是一个无限不循环小数,二分法能否给出一个同样无限不循环的数值吗?
二分法搜索sqrt(3)的深层逻辑是“迭代”。每一步计算都在重复着上一步,且每一步计算都基于上一步的计算结果。而较之于上一步,当前的计算将向着问题的解析解更逼近一步。“迭代”是最常用的程序设计算法之一。这里,可以借助于Wolfram语言的Do循环结构来实现。请认真完成复演No. 20的实操练习,不仅调整迭代次数,还应该调整搜索区间的上下限。
数值积分梯形法则的算法原理是一目了然的——被积函数曲线所挟的面被近似地划分为若干个小梯形。自定义函数trapz使用了Wolfram语言的诸多特性,当你在研究这段程序的时候,请特别关注“模式”、Module的应用。调用Plot函数预测、分析积分的敛散性仍然是必要的手续。不迷信,不盲从,坚持验证;严谨不仅是一种态度,更是一种习惯。请认真完成复演No. 21的实操练习。
数值积分所提供的是一个近似值。以可视化的方式分析其误差是十分必要的,这将有助于你在计算成本、效率与精确度之间寻求某种平衡。梯形法则实质上是以一系列分段线性函数去逼近被积函数。在本课程的“数据篇”,我将介绍一种函数逼近的算法,即“插值法”。届时你才会真正理解数值积分的梯形算法。请认真完成复演No. 22的实操练习以及本章节的作业。
作为Wolfram语言最重要的组织结构之一,模块为自定义函数提供了充足的“空间”。此前所展示的二分法、梯形法则法的代码分别被封装于两个模块之中。通过默写梯形法则的Wolfram程序代码(复演No. 23)将有助于你迅速掌握Module函数的用法。当我们再次谈及函数式编程范式时,便不难理解模块之于Wolfram语言的重要意义。
掌握Module函数的用法以及函数式范式编程最好的途径就是动手复演范例。“一维无限深势阱中电子的量子化度”一案取材自量子力学,但你可以不去了解如何解析薛定谔方程。我们的任务在于依据能量量子化度的公式作简单的算术运算。关于该案例的深刻内涵待到“实验篇”时再作深入介绍。请认真完成复演No. 24的实操练习。
滥用全局变量往往会给程序带来潜在的风险。模块(Module)的另一个功能在于局域化变量。借由案例——不同单位制下的玻尔兹曼常数,你将深刻理解局域化变量的必要性。请认真完成复演No. 25的实操练习。
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。没有什么比这个数列更能够体现递归算法的思想了。请尝试自行归纳出斐波那契数列的通项公式。
理解递归的关键在于:你永远可以在一个函数的定义中使用(调用)这个函数本身,只要这种使用(调用)是针对相对较小的变元值。更重要的一点,我们必须最终要遇到某一无需递归便可计算出来的值,即递归基。至此,这门课程向你介绍了程序设计的两类基本算法——迭代、递归。请认真完成复演No. 26、No. 27的实操练习。
人类已经进入了工业互联网时代,大数据、人工智能、数字孪生体与各个工程技术领域之间正在进行着深度的融合,计算机不仅仅是解决问题的效率工具,它深刻影响了人们的作业方式、认知方式。“计算思维”不再是计算机专家和程序员的专属能力,而成为了一种普遍的认识和一类普适的技能,每一名学生都应该热心于它的学习和运用。君不见,当下所有复杂工程问题的解决都离不开计算思维的助力。这一切为非计算机专业的理工科学生提出了更高的要求:深谙计算机工作原理,精通一门高级编程语言,掌握必备的数值算法,开发或应用计算机模拟程序,……
“Wolfram科学计算:思维与技能”系列课程旨在启发计算思维、磨练计算技能。课程的总体设计以德国教育实践家瓦根舍因创立的“范例教学理论”作为指导思想。面向一门交叉学科的课程,放弃百科全书式授课思路,大胆地实施“缺漏”教学,教授最根本的、最基础的、最本质性的范例内容,以培养学生学习的主动性和创造性为目标。从科学计算、数据分析、基于方程的计算机模拟、仿真等方向上精选教学范例。沿着“算法”(积分梯形法则-迭代与递归-插值法-最小二乘法-牛顿法-有限差分法-有限单元法)和“编程”(命令式范式-面向过程-函数式范式-迭代式开发-增量式开发)两条主线打通学生“教养性”学习的任督二脉。
本课程是“Wolfram科学计算:思维与技能”系列课程的第一篇,基于“全球现代技术计算权威系统”Wolfram Mathematica学习计算机最根本的应用——科学计算,让几乎没有编程经验的学习者通过开发Wolfram程序解决复杂工程问题。基础篇课程涵盖六个专题,全程案例驱动,其中不乏“固体热容的爱因斯坦模型”、“PN结内部扩散电流”等复杂工程问题。