01 / 导读
导读
引用
Moler, C. B. (2008). Numerical Computing with MATLAB (revised reprint; electronic edition updated September 2013). Society for Industrial and Applied Mathematics. Free official edition: https://www.mathworks.com/moler/index_ncm.html
章节概要
第1章:MATLAB 入门
第一章通过一些探讨初等而有趣问题的小程序来教授 MATLAB:黄金比、斐波那契数、由随机仿射映射生成的分形蕨、幻方、一个简单的加密方案以及 3n + 1 序列。本章最后有一节较完整的 IEEE 浮点运算内容——机器精度、舍入误差、下溢和上溢——序言指出,无论 MATLAB 经验如何,每位读者都应学习这一节。
第2章:线性方程组
本章说明 MATLAB 的反斜杠运算符如何用高斯消元法求解 Ax = b。它通过一个 3×3 例子演示计算,引入置换矩阵、三角矩阵和 LU 分解,说明为什么需要部分选主元,并用范数和条件数分析舍入误差的影响。后面几节讨论稀疏矩阵和带状矩阵,并以谷歌的 PageRank 说明马尔可夫链和大型稀疏方程组。正文配有算法的教学版本(lutx、bslashtx)和图形演示。
第3章:插值
本章从插值多项式及其在点数较多时的剧烈振荡出发,转向分段方法:分段线性插值、分段三次埃尔米特插值、保形的"pchip"插值以及三次样条。它比较后两者在同一组数据上的表现,并提供教学版实现和交互式插值演示。
第4章:零点与根
本章依次介绍二分法、牛顿法(附有一个故意让其失败的"反常"例子)、割线法和逆二次插值,然后把它们组合成 MATLAB 中 fzero 所依据的稳健算法"zeroin"。本章还讨论如何求函数取给定值的点,最后介绍用黄金分割搜索和抛物线插值进行一维极小化(fmintx)。
第5章:最小二乘
本章以曲线拟合引出线性最小二乘,并用美国人口普查数据(已更新至包含 2010 年数据)加以说明。它介绍向量范数、豪斯霍尔德反射以及作为稳定求解最小二乘问题方法的 QR 分解,进而讨论伪逆、秩亏和可分离的非线性最小二乘。
第6章:数值积分
本章通过自适应积分来讲解定积分的数值计算,即把函数求值集中在被积函数难以逼近的地方。它推导基本公式(中点公式、梯形公式、辛普森公式),在一个教学版自适应程序中加以组合,然后讨论如何指定被积函数、计算性能以及离散数据的积分。
第7章:常微分方程
在建立初值问题和方程组之后,本章研究单步法,在教学版求解器(ode23tx)中展开 Bogacki–Shampine 的 BS23 算法,并讨论包括洛伦兹吸引子在内的例子。它解释刚性以及为何需要刚性求解器,还讨论事件定位、多步法、MATLAB 的常微分方程求解器系列、误差控制和性能。
第8章:傅里叶分析
本章以按键电话拨号引入有限傅里叶变换。它以交互方式探索该变换,分析太阳黑子数据和其他周期性时间序列,推导快速有限傅里叶变换算法并给出教学版实现,并把 FFT 与其他傅里叶变换和级数联系起来。
第9章:随机数
本章解释为什么计算机生成的随机数是伪随机数,介绍莱默的线性同余生成器以及后来的均匀分布生成器,并用马尔萨利亚的金字塔(ziggurat)算法生成正态分布的数。最后简短的一节介绍 MATLAB 均匀分布生成器所使用的梅森旋转算法。
第10章:特征值与奇异值
本章借助小例子和交互式演示(eigshow)引入特征值分解和奇异值分解,讨论为什么特征多项式不是好的计算途径、对称矩阵与埃尔米特矩阵、计算所得特征值和奇异值的敏感性与精度、若尔当形与舒尔形,以及 QR 算法。应用包括主成分分析和一个"画圆生成器"的例子。
第11章:偏微分方程
本章只讨论涉及拉普拉斯算子的三个模型问题——泊松方程、热方程和波动方程——展开有限差分方法、它们的矩阵表示和数值稳定性条件。最后讨论 L 形膜的特征值,其第一特征函数正是 MathWorks 标志的来源。
核心概念
第1章:MATLAB 入门
- 浮点运算:按照 IEEE 标准,用有限个二进制数进行的计算。
- 机器精度:1 与下一个更大浮点数之间的间隔,决定了舍入误差的量级。
第2章:线性方程组
- 带部分选主元的 LU 分解:把行置换后的矩阵写成下三角因子与上三角因子之积,是反斜杠运算符的基础。
- 条件数:衡量数据中的相对误差在解中可能被放大多少的指标。
- PageRank:由网页链接结构定义的马尔可夫链的平稳分布。
第3章:插值
- 插值多项式:通过 n 个数据点、次数小于 n 的唯一多项式,可能出现剧烈振荡。
- 保形三次插值(pchip):选取斜率以避免过冲的分段三次埃尔米特插值。
- 三次样条:二阶导数连续的分段三次函数,比 pchip 更光滑,但可能过冲。
第4章:零点与根
- 牛顿法:利用切线的迭代法,在单根附近二次收敛,但并不总是全局收敛。
- zeroin:把二分法的可靠性与割线法和逆二次插值的速度结合起来的混合方法。
第5章:最小二乘
- 最小二乘拟合:选取模型参数,使残差平方和最小。
- 用豪斯霍尔德反射做 QR 分解:一种能稳定求解最小二乘问题的正交分解。
- 伪逆:给出最小范数最小二乘解的广义逆,在矩阵秩亏时尤为重要。
第6章:数值积分
- 自适应积分:递归细分区间,直到局部误差估计满足容差。
- 辛普森公式:能精确积分二次函数的基本公式,在自适应方案中配合误差估计使用。
第7章:常微分方程
- 带误差估计的单步法:像 BS23 这样比较两个阶数来选择步长的龙格–库塔型方法。
- 刚性:时间尺度差别悬殊的问题所具有的性质,迫使显式方法采用极小的步长。
第8章:傅里叶分析
- 有限傅里叶变换:把样本向量表示为复指数函数组合的变换。
- FFT:当长度可分解为小素数之积时快速计算有限傅里叶变换的算法。
第9章:随机数
- 伪随机数生成器:输出能通过随机性统计检验的确定性算法。
- 金字塔算法:利用一叠矩形快速生成正态分布随机数的方法。
第10章:特征值与奇异值
- 奇异值分解:把任意矩阵分解为正交因子和非负奇异值。
- 特征值敏感性:矩阵扰动对特征值的影响,在非对称矩阵中最为严重。
- QR 算法:基于反复 QR 分解、用于计算特征值的迭代方法。
第11章:偏微分方程
- 有限差分:在网格上近似导数,把偏微分方程化为矩阵问题。
- 数值稳定性条件:显式格式中时间步长相对于网格间距所受的限制。
评析
优点
- 软件是正文的一部分。 由 70 多个 M 文件组成的 NCM 程序集包含交互式图形演示,以及 MATLAB 自身函数的"tx"教学版本(lutx、pchiptx、fzerotx、quadtx、ode23tx、ffttx 等)。对照讲解阅读简短易读的实现,可以准确看清内置程序在做什么、该如何修改。
- 注重"明智地使用"。 序言指出目标是正确使用数学软件、理解其局限,并在需要时加以改造。各章从精度和效率角度比较方法,例如比较 pchip 与样条,或比较 MATLAB 各常微分方程求解器在刚性与非刚性问题上的表现。
- 例子生动、贴近实际。 按键拨号、太阳黑子周期、人口普查数据、PageRank、洛伦兹吸引子和 L 形膜,把算法与人们熟悉的应用联系起来。
- 大量基于代码的习题。 序言提到有 200 多道习题,其中许多要求修改或扩展 NCM 程序,适合经常上机的课程。
局限
- 理论和证明较少。 收敛结果和误差界以非正式方式说明,几乎没有证明,因此不能替代理论性的数值分析教材。
- 与 MATLAB 绑定。 代码、演示和习题都使用 MATLAB(有些习题还提到符号工具箱或偏微分方程工具箱);使用 Python 或其他语言的学生需要自行转换,部分界面细节反映的是 2013 年版软件。
- 部分内容过时。 最近一次更新在 2013 年,因此关于 MATLAB 函数、性能以及某些应用(如 PageRank 的计算方式)的讨论反映的是当时的情况。
- 覆盖面有所取舍。 序言承认内容超过一个学期,但大型线性方程组的迭代解法、一维以上的数值优化和有限元方法等主题几乎没有涉及。
书中的应用
应用贯穿每一章:黄金比、斐波那契数、分形蕨、幻方和简单密码(第1章);PageRank 与马尔可夫链(第2章);美国人口普查数据拟合(第5章);洛伦兹吸引子等常微分方程例子(第7章);按键拨号、太阳黑子周期性和周期性时间序列(第8章);用于模拟的随机数生成(第9章);主成分分析和画圆算法(第10章);以及热传导、波动和作为 MathWorks 标志来源的振动 L 形膜(第11章)。
在课程中的定位
Moler 的书与 Kong、Siauw、Bayen 所著 Python Programming and Numerical Methods 并列。两者都是以软件为先导的入门书;Python 那本书用一半篇幅先教编程再讲数值方法,而 Moler 假定读者已有一定编程经验,很快进入算法,对库函数如何工作讲得更深入。可按语言选择:用 MATLAB 的课程选 Moler,用 Python 的选 Kong 等人。
Burden、Faires、Burden 的 Numerical Analysis 和 Süli 与 Mayers 的 An Introduction to Numerical Analysis 是本科教材,一般被描述为带误差分析和证明、更偏数学的教材;对于想理解 Moler 书中算法为何有效的学生,它们是自然的配套读物或后续读物。Trefethen 与 Bau 的 Numerical Linear Algebra 和 Stoer 与 Bulirsch 的 Introduction to Numerical Analysis 是研究生层次的教材;Moler 关于 LU、QR 和特征值算法的第2、5、10章是学习 Trefethen 与 Bau 的有益准备。
如何使用本书
本书为数值方法与科学计算的入门课程而写。序言列出的先修要求是微积分、对常微分方程和矩阵有一定了解,以及一些编程经验;不需要使用过 MATLAB。
开始前先从本书网站安装 NCM 文件,并在每个演示出现时运行它。所有人都应阅读 1.7 节的浮点运算。作者建议先讲前几章(线性方程组、插值、零点、最小二乘、数值积分和常微分方程),再根据兴趣从最后四章(傅里叶分析、随机数、特征值、偏微分方程)中选择。多做修改"tx"程序的习题,把输出与 MATLAB 内置函数比较,需要误差界或收敛证明时,再查阅书单中更偏理论的教材。
版本与来源
本导读依据 MathWorks 网站上 Numerical Computing with MATLAB 的免费电子版(2013 年 9 月更新的分章 PDF,已包含 SIAM 印刷版 2008 年修订重印的内容),https://www.mathworks.com/moler/index_ncm.html。导读参考了序言(目标、先修要求、NCM 软件、课程建议和修订历史)、全部十一章的引言和所有小节标题,以及更仔细阅读的若干小节——浮点运算(1.7 节)、PageRank(2.11 节)、刚性(7.9 节)、金字塔算法与梅森旋转(第9章)和 L 形膜(11.5 节)——以及部分习题。
