
系列课程“Wolfram科学计算:思维与技能”,包括基础篇、数据篇、模拟篇以及实验篇,课程建设历经三个阶段,2008-2012青铜时代,2013-2016白银时代,2017-2022黄金时代。
何为“计算思维”?综合运用模型、算法以及编程,实施计算,解决问题。这是课程对“计算思维”的定义。
提升一门课的“高阶性”不等于单纯地甚至无谓地增加课程的难度。学生学习兴趣被持续激励,学生主动探索解决过程的底层逻辑,学生有机会直面复杂工程问题,这些应是“高阶性”的内核。
系列课程“Wolfram科学计算:思维与技能”,包括基础篇、数据篇和模拟篇,课程以“范例教学”理念为指引,全程案例驱动,沿着“算法”和“编程”两条主线打通学生教养性学习的任督二脉。
课程进行了周密的目标设计,为每一场讲座制定了“小目标”,而且所有学习目标都是可以测量的;仅“Wolfram科学计算:思维与技能”(基础篇)就包括27次编程复演练习和5次大作业,这些是达成目标的保障,请务必认真对待。
本篇(或单元)的标题为“方程-模拟-仿真”,这有着怎样的含义呢?
一开始,你将向“非线性方程”发起挑战。我将给出一个不严谨但易于理解的定义,何为“非线性方程”。而你的出发点在于,将一个求解方程的问题转换为探寻一个函数的零点的问题。
此外,本章节是系列课程“Wolfram科学计算:思维与技能”的第三篇的第一个专题,其在系列课程内部的编号是11,因此你会看到“§3.1 非线性方程”、“§11 非线性方程”、“11.1 导引”等标题。以后的章节也会采用这种排序方式。
牛顿法的实质在于:将一个非线性方程转换为一个线性方程。在此,将借助于一阶泰勒展开近似来导出这个线性方程。当然,问题不会如此简单。你将反复求解这个线性方程,而奇妙之处在于,线性方程的解将按照某种底层机制向着正根步步逼近。
以一个一元二次方程作为示例践行牛顿法。你将看到,如何将该一元二次方程转换为一个线性方程?如何调用Solve函数反复求解线性方程?线性方程的解又是怎样一步一步逼近正根的?
在图解策略下,可以直观地观察牛顿法算法的演绎。线性方程的解是怎样步步逼近正根的?显然,并非以一致的步调去逼近。从一开始的“豪迈”步伐,到后来的“谨小慎微”,在Mathematica交互式操作界面中被清晰地刻画出来。请深刻理解“牛顿法”,并认真完成复演No.55的实操练习。
求解该一元二次方程的问题,等价于搜索√3的数值。也可以用“二分法”来处理。无论是牛顿法,还是二分法,在实现上都需要借助于计算机最擅长的作业方式,也是最常用的程序设计方法,迭代。如果你对迭代、递归这样的算法一无所知,那么我建议你去学习系列课程“Wolfram科学计算:思维与技能”的基础篇。在计算机实现牛顿法之前,需要建立该问题的迭代格式。此外,还要用到Do循环,甚至While循环。请认真完成复演No.56的实操练习。
你将学会一个新的Wolfram函数FindRoot。函数名称由两个单词组成,切记首字母都要被大写。一旦掌握了这个函数,你就可以轻松地求解复杂的非线性方程、超越方程。然而,规范的计算手续在任何情况下都是不可或缺的。请找寻出精准、高效求解非线性方程的秘诀。请认真完成复演No.57的实操练习。
(偏)微分方程是一个强大的工具、一把能够开启自然科学的密钥。在Wolfram语言的助力下,你将更高效地、更精准地运用这个利器。
此外,本章节是系列课程“Wolfram科学计算:思维与技能”的第三篇的第二个专题,其在系列课程内部的编号是12,因此你会看到“§3.2 常微分方程”、“§12 常微分方程”、“12.1 导引”等标题。以后的章节也会采用这种排序方式。
“室温下PN结内建电场”一案将贯穿整个章节。案例取材自Dona H. Neamen著述的半导体物理与器件(第三版)。你将会看到围绕着一个降阶的泊松方程,即一个一阶线性非齐次常微分方程(ODE)开展的一系列计算作业。
在动用大型自动化的工具DSolve、DSolveValue函数之前,以准手工的方式施行分离变量法等算法,求解一阶线性非齐次ODE的通解。这一经历会加深你对求解ODE的流程、算法的认识。知其然亦知其所以然,才可能合理、正确地解决问题。请认真完成复演No.58的实操练习。
拒绝盲从、迷信,坚持检验,是你面对计算机及其程序时应有的态度。在每一次求解ODE之后,我都会向你介绍相应的检验方法、技巧。在这些检验程序中,你还将学习到“规则变换嵌套”、“纯函数”等Wolfram语言中的高级程序结构。请认真完成复演No.59的实操练习。
一旦边界条件给定,那么就可以求得常微分问题的特解。在Wolfram语言的语境下,以准手工方式解得问题的特解,并形成程序,须要谨慎而灵活地运用规则、变换规则甚至多层嵌套的变换规则。以规则替换赋值,这样做的原因需要你慢慢体会。请认真完成复演No.60的实操练习。
案例“室温下PN结内建电场”的背景是发轫于上世纪四十年代的半导体器件的计算机模拟。整合前面若干条相对独立的、交互式的Wolfram语句,可得到一个最初级的器件模拟Mini App。这当中,你也有机会体会以规则、变换规则替代赋值的理由何在。请认真完成复演No.61的实操练习。
DSolve函数以及与求解(偏)微分方程相关的其余三个函数的自动化程度之高,堪比一个小型软件。DSolve函数的返回值是一个指向纯函数的规则。如何引用这个返回值,相比掌握调用格式,需要你投入更多的精力去学习。请认真完成复演No.62的实操练习。
“计算机模拟”是一个宏大的概念,你可能对此很感兴趣。但在这个课堂上对“计算机模拟”是有所界定的。我们仍旧会从一个案例着手来探究概念——提拉法晶体生长工艺的计算机模拟。
此外,本章节是系列课程“Wolfram科学计算:思维与技能”的第三篇的第三个专题,其在系列课程内部的编号是13,因此你会看到“§3.3 计算机模拟”、“§13 计算机模拟”、“13.1 导引”等标题。以后的章节也会采用这种排序方式。
一开始,你会建模并模拟一个表面绝热近似下的极简系统。如果你对这个案例不感兴趣也无所谓,因为方程本身是通用的,用于求解二阶线性齐次常微分方程(ODE)的特征根法也是通用。这一经历会进一步加深你对求解ODE的流程、算法的认识。坚持检验,依然是不可或缺的手续。请认真完成复演No.63的实操练习。
对比着DSolve函数来学习这个新的函数是十分必要的。两个函数具有相同的调用格式,其实二者的底层算法也是一模一样的。DSolve函数返回一个指向纯函数的规则,而DSolveValue函数则直接返回一个纯函数。这或许是DSolveValue更为常用的原因。一个表面绝热近似下极简系统的边值问题将被完美解答。请认真完成复演No.64的实操练习。
提拉法晶体生长工艺的计算机模拟一案有着深厚的研究基础,从1970年代至今已发表的文献多达上百篇。在Wolfram语言特有的函数式编程范式下,将若干条相对独立的、交互式的Wolfram语句封装在一个模块中,开发一个最初级的Mini App。这当中,一种“迭代式”开发模式被使用。请认真完成复演No.65的实操练习。
让CZ法晶体生长工艺的极简系统逐步向真实逼近。在这个过程中,你会遇到越来越困难的挑战,与此同时你将掌握越来越高超的技术。从准手工分析的特征根法,到集成工具DSolve、DSolveValue函数。我非常推崇这样一种循序渐进的学习模式。请认真完成复演No.66的实操练习。
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 图形用户界面是一种人与计算机通信的界面显示格式。从命令行界面(Command-line Interface,简称CLI)过渡到GUI,想必是你所喜闻乐见的。请认真完成复演No.67的实操练习。
在详细介绍数值算法之前,请你先目睹一例无法解析的微分方程,一个二阶非线性非齐次ODE。现实工程问题所涉及的微分方程通常是无法解析的。这也是你掌握有限差分法、有限单元法的理由。
此外,本章节是系列课程“Wolfram科学计算:思维与技能”的第三篇的第四个专题,其在系列课程内部的编号是14,因此你会看到“§3.4 有限差分法”、“§14 有限差分法”、“14.1 导引”等标题。以后的章节也会采用这种排序方式。
用于计算无法解析的(偏)微分方程的Wolfram内部函数NDSolve,又是一个被高度集成化的工具。你先掌握它,以及检验计算精确度的方法。至于其底层的算法,将会在未来的几个章节中被逐步澄清。请认真完成复演No.69的实操练习。
函数NDSolve的返回值是一个InterpolatingFunction对象。学会使用并深刻理解这一重要的Wolfram程序结构,不仅有助于合理地引用数值解,更有助于理解数值计算的本质属性。请认真完成复演No.70的实操练习。
以可视化的方式检验数值计算的精确度是一种非常受欢迎的做法,但同时也是必须履行的手续。当你看到即使采用Wolfram内部函数,依然存在这如此之大的误差,你是否有所警觉。如何提升计算精确度?这需要你在理解底层的算法之后,方能达成。请认真完成复演No.71的实操练习。
在掌握了NDSolveValue函数这类集成化工具之后,是时候让你了解作业于底层的数值算法了。让我们先来领会有限差分法的算法思想。在此,又一个绝佳的案例被提出——表面绝热近似下,CZ法晶体颈肩处的温度分布。依循傅里叶定律,我们将面对一个一阶线性非齐次、变系数ODE。有限差分法(FDM)将一显身手。
在领会了有限差分法的算法思想之后,你需要动手编写Wolfram程序。是选择“迭代”,还是选择“递归”,这很能反映一个人的思维方式。是采用“迭代式”开发,还是采用“增量式”开发,也能够反映一个人的工作习惯。我建议你采用后一种开发模式。请认真完成复演No.72的实操练习。
以绘图的形式来检验数值计算的精确度是最直观的。在改进计算精确度的过程里,你不难发现“步长”与精确度之间的正相关关系。步长越短,精确度越高;在精确度达到某一要求后,继续缩短步长则是无谓之举了。面对这个原则,你是否有似曾相识之感。认真完成复演No.73, No.74的实操练习以及本章的作业。
仿真不再只是工业设计的专属工具,而是参与到产品数据全生命周期的管理中,从产品设计、性能分析到加工工艺、维修维护……,遍历所有环节。有限元仿真是以有限单元法作为求解底层模型的求解器的。在这一章里,你将深入学习有限元仿真,从底层算法思想到Wolfram程序设计。
此外,本章节是系列课程“Wolfram科学计算:思维与技能”的第三篇的第五个专题,其在系列课程内部的编号是15,因此你会看到“§3.5 计算机模拟”、“§15 计算机模拟”、“15.1 导引”等标题。以后的章节也会采用这种排序方式。
让我们从一个有限元仿真实验(Finite Element Solution of 1D Poisson Equation ...)入手,在“苦学”有限元仿真技术之前,领略其强大的魅力——兴趣是最好的老师。这个仿真实验来自于Wolfram示范项目,建议你浏览这个网站上的所有项目,并使用免费的Wolfram Player打开你所感兴趣的项目。
完成了仿平行板电容器的有限元仿真实验(Finite Element Solution of 1D Poisson Equation ...),我们可以一同来分析、比较“模拟”与“仿真”的异同。“数值仿真等价于虚拟现实情景下的计算机模拟”是我个人的意见,当然,你也可以反对这个观点,并提出你的见解。
从这一节开始,我们进入掌握具体的有限元计算及其Wolfram程序实现的环节。在“圆域上的二维边值问题”一案中,你将面对一个拉普拉斯方程以及迪利克雷边界条件。首先,你需要在Wolfram语言的“语境”下定义这个迪利克雷问题。理解并学会调用DirichletCondition函数是这节课的重中之重,如何理解其第二个变元:True?认真完成复演No.76的实操练习。
此次运行的函数NDSolveValue的底层的算法是有限单元法(FEM),这是因为DirichletCondition函数是有限单元法的一个触发器。分别对上一节定义好的偏微分方程(pde),DirichletCondition边界条件(Γ),求解域(Ω)作赋值,会使得NDSolveValue语句获得大幅精简。认真完成复演No.77的实操练习。
NDSolveValue函数将返回一个插值函数对象。InterpolatingFunction对象可以作为一个纯函数来使用,但之所以称其为“对象”,就因为它不仅仅是一个函数。一个对象与一个函数最大的区别在于,对象拥有可用于查看的诸多属性。在这里,借助于“Grid”、“Values O你Grid”这两属性,可视化有限元解。而通过查看“ElementMesh”对象可了解底层算法的信息。认真完成复演No.78的实操练习。
Neumann问题中Dirichlet边界条件与Neumann边界条件共存,故须并用DirichletCondition函数与NeumannValue函数。如何理解两个函数的第二个变元依然是个关键问题,其决定了将边界条件准确地加载到指定边界上。在最后,引用InterpolatingFunction对象绘制有限元解的“彩虹图”,这或许是你非常感兴趣的一个内容。认真完成复演No.79的实操练习。
一旦掌握了NDSolveValue函数,你就具备了解决复杂工程问题的能力。然而,与有限单元法相关的算法——单元与网格的理论——仍然值得你投入精力学习,这是你正确使用NDSolveValue函数这一“暗盒”工具的保证。尝试以ToElementMesh函数手工创建网格,查看ElementMesh对象以便了解网格精度并寻求改进,这些看似是无用之功,但会有效提升计算作业的可靠性。
人类已经进入了工业互联网时代,大数据、人工智能、数字孪生体与各个工程技术领域之间正在进行着深度的融合,计算机不仅仅是解决问题的效率工具,它深刻影响了人们的作业方式、认知方式。“计算思维”不再是计算机专家和程序员的专属能力,而成为了一种普遍的认识和一类普适的技能,每一名学生都应该热心于它的学习和运用。君不见,当下所有复杂工程问题的解决都离不开计算思维的助力。这一切为非计算机专业的理工科学生提出了更高的要求:深谙计算机工作原理,精通一门高级编程语言,掌握必备的数值算法,开发或应用计算机模拟程序,……
“Wolfram科学计算:思维与技能”系列课程旨在启发计算思维、磨练计算技能。课程的总体设计以德国教育实践家瓦根舍因创立的“范例教学理论”作为指导思想。面向一门交叉学科的课程,放弃百科全书式授课思路,大胆地实施“缺漏”教学,教授最根本的、最基础的、最本质性的范例内容,以培养学生学习的主动性和创造性为目标。从科学计算、数据分析、基于方程的计算机模拟、仿真等方向上精选教学范例。沿着“算法”(积分梯形法则-迭代与递归-插值法-最小二乘法-牛顿法-有限差分法-有限单元法)和“编程”(命令式范式-面向过程-函数式范式-迭代式开发-增量式开发)两条主线打通学生“教养性”学习的任督二脉。
本课程是“Wolfram科学计算:思维与技能”系列课程的第三篇,基于“全球现代技术计算权威系统”Wolfram Mathematica高效、准确地求解微分方程,并进行计算机模拟及仿真,让几乎没有编程经验的学习者通过开发Wolfram程序解决复杂工程问题。模拟篇课程涵盖五个专题,全程案例驱动,其中不乏“计算PN结内建电场”、“模拟CZ法晶体生长工艺”等复杂工程问题。