◎李 旭 (兰州理工大学理学院,甘肃 兰州 730050)
计算科学已经成为科学研究和工程设计的第三种重要手段,被广泛使用.航空航天、汽车、生物、化学、半导体等很多工业领域,越来越多地依靠数值模拟来提供技术决策支持.
19世纪末以来,许多物理现象已经得到了很好的解释,并有精确的模型来描述它们.但在计算机广泛使用之前,科学家和工程师被迫在模型中做出许多简化假设,以便用笔算方法来求解它们.然而,随着计算能力的提高,人们可以使用高效的数值方法处理完整的模型,而无须简化它们.尽管如此,每种方法都有其局限之处,为了高效使用它们,人们必须了解它们是如何工作的.
计算方法是许多高校工科专业开设的一门重要而实用的课程.本课程旨在教学生如何运用数学和计算机来解决各种实际应用问题.数值计算被认为是数学理论与实际领域目标之间的桥梁.因此,本课程的教学应使学生掌握解决实际工程应用问题的各种计算方法.
计算方法是一门数学类型课程,但又与在修学生已学完的数学课(例如微积分、线性代数)不同.从基本的思想方法和思维方式,到课程的学习方法,它都有重大的变化.学生所熟悉的大部分数学课的共同特点应该是抽象和严格的演绎,思维逻辑严密.而计算方法这门课,除了保持上述的特点之外,“归纳”成为不容忽视的思维方法,讨论的核心问题是“误差”.在以往的数学课程中,课后认真阅读教科书和做一定数量的习题十分重要;现在学生除了读书和做习题外,使用计算机进行计算变得同样重要.
当前,我们必须考虑如何向以技术为导向的工科专业学生教授计算方法.计算科学在研究领域的知名度越来越高,这意味着教师在计算方法教学中应该提供具体的编程示范,使学生能够回到他们的具体的“计算农场”,做出实际的工作.为此,本文探讨了一些利用MATLAB 软件对工科专业学生进行计算方法课程教学的若干具体操环节.
MATLAB 是一个用于数值计算的交互式系统.20世纪70年代末,数值分析大师Cleve Moler 编写了MATLAB 最初的Fortran 版本.此版本随后在教学和研究中很受欢迎,并演变成了一个用C 语言编写的商业软件包.多年来,MATLAB在科研和工业领域中得到了广泛的应用.
与传统的数值计算方法(例如编写Fortran 或C 程序并调用数值库)相比,MATLAB 有以下优势:
1.它允许用非常高级的语言快速、轻松地编写代码;
2.数据结构不需太多关注;特别是,在首次使用之前,不需要声明数组;
3.交互式界面允许快速实验和轻松调试;
4.提供高质量的图形和可视化设施;
5.MATLAB 的M 文件可在多种平台上完全移植;
6.可以添加工具箱来扩展系统,例如,提供专门的信号处理设施和符号操作能力;
7.在互联网上可以免费获得用户提供的各种M 文件.
此外,MATLAB 是一种现代编程语言和问题解决环境.它具有复杂的数据结构,包含内置的编辑和调试工具,并支持面向对象编程.这些因素使MATLAB 成为一种优秀的教学语言,也是研究和解决实际问题的有力工具.与编译语言相比,MATLAB 不可避免地会损失一些效率,但内置的性能加速技术提升了效率,用户还可以使用MEX 文件链接到编译的Fortran 或C 代码.
随着MATLAB 软件的发展,它为科学计算开创了一个新时代.现在,人们可以非常简洁地、完整详细地利用MATLAB 软件实现高级数值算法,从而提供很多实际应用问题的解决方案.对于求解应用数学中的某些问题,现在仅几页纸所覆盖的内容甚至比几十年前的一本书的内容都要多.与一些基础计算语言(如Fortran 语言或C 语言)相比,MATLAB 软件在修改已有程序或者编写新程序方面具有更显著的工作效率.在编程解决一些新问题方面,利用MATLAB 软件能够获得前所未有的轻松.
我们使用MATLAB 环境,是因为它对初学者来说比较容易上手,而且它支持通过实验来处理计算思想.这是发展计算直觉的核心,也就是说通过编写程序可以建立计算直觉.如果直觉是一种方向感,那么计算直觉就是一种计算方向感.虽然培养良好的计算直觉是一个明确的优先事项,但我们的首要目标是将计算的兴奋感与对其约束条件及其与其他方法的联系的欣赏关联起来.计算、理论和实验之间的相互作用尤为重要.
通过教授计算机编程范例,我们可以促进学生上述计算直觉的发展.在教学、写作和研究过程中,没有比精心挑选的算例更能解释问题的了.另外,除了解释作用,例子也能引起学生的兴趣,学生的积极性与学习成绩之间一般存在正相关关系.在每一节课中,如果在每一个抽象的算法表述和收敛性结论之后出现算例,那么就能生动地说明问题.无论学生的之前掌握的程度如何,例子能让他们真正参与课堂学习.当计算方法课程完成后,详细的、恰当定位的例子可以让这门课程令人难忘.
首先,教师在算法实现之前,应该教给学生基本的MATLAB 操作、常用命令和代码.
教师运用MATLAB 程序设计,让学生用在理论课学到的各种数值算法来解决典型的数值计算问题.在具体程序设计环节,教师应该通过演示编程过程和程序运行结果,使得学生进一步熟悉所学算法,同时能教给学生一些编程思路和程序语言的编写规范.在此过程中,我们最好将所有算法编辑为MATLAB 函数文件,这样方便修改,还可以使得程序的适用性和普及性更广.在程序实现过程中,我们对求解同一问题的各种不同算法在CPU 运算时间、所需迭代次数、误差和残差等方面进行比较.
最后,教师可以对学生布置一些同类型的程序设计作业,并且完成实验报告,以测试他们掌握新算法的程度.
以常微分方程初值问题的数值解为例,说明三种数值算法的实现过程.
例用Euler 法、改进Euler 法与四阶经典Runge-Kutta法分别求解如下常微分方程初值问题:
与精确解比较,其中精确解为y=x(ex-e),计算过程中小数点后保留4 位.
Euler 法的具体格式为:
yn+1=yn+hf(xn,yn)
Euler 法的具体M 文件代码为:
取h=0.1,计算结果见表1.
表1 Euler 法的计算结果
改进Euler 法的具体格式为:
改进Euler 法的具体M 文件代码为:
取h=0.1,计算结果见表2.
表2 改进Euler 法的计算结果
四阶经典Runge-Kutta 法的具体格式为:
四阶经典Runge-Kutta 法的具体M 文件代码为:
取h=0.1,计算结果见表3.
表3 四阶经典Runge-Kutta 法的计算结果
我们通过比较三种方法的计算结果,让学生观察到改进Euler 法的精度高于Euler 法的精度,而四阶经典Runge-Kutta 法的精度明显高于Euler 法与改进Euler 法的精度.在理论分析上,我们已经证明Euler 法、改进Euler 法与四阶经典Runge-Kutta 法的精度分别是一阶、二阶与四阶.通过对比,学生观察到数值结果和理论分析的一致性.
此算例很好地展示了为解决同一问题所构造的不同算法的MATLAB 程序语言之间的差别,使学生认识到计算方法的核心任务就是设计、分析和用高效的算法去解决各种重要的数学问题.教师通过让学生自己编写程序、检查计算结果,使他们进一步熟悉算法格式.
本文讨论了在计算方法教学中通过具体算例使用MATLAB 进行编程实现的教学方法.由于计算方法是工科专业的一门重要的核心课程,我们通过这种教学手段可以很好地发展学生利用数值计算方法解决实际应用问题的能力.