索引 / 001 ZH-CN
Numerical Recipes: The Art of Scientific Computing(数值方法:科学计算的艺术) cover

物理学

物理学

Numerical Recipes: The Art of Scientific Computing(数值方法:科学计算的艺术)

William H. Press; Saul A. Teukolsky; William T. Vetterling; Brian P. Flannery

英文原名: Numerical Recipes: The Art of Scientific Computing

普雷斯(William Press)、特科尔斯基(Saul Teukolsky)、维特林(William Vetterling)与弗兰纳里(Brian Flannery)合著、面向科研人员的数值方法参考书。每个主题都以通俗的方式解释相关数学及其陷阱,并给出可直接运行的完整C++程序,涵盖物理、工程与数据分析中最常用的算法。

需要的基础: 需有编程经验,最好熟悉C++,并掌握微积分、线性代数和一定的概率知识;修过计算物理入门课程会有帮助。

难度等级
高级
学术层次
研究生
numerical methodsscientific computing算法c++data analysis参考书

01 / 导读

导读

引用

Press, W. H., Teukolsky, S. A., Vetterling, W. T., & Flannery, B. P. (2007). Numerical Recipes: The Art of Scientific Computing (3rd ed.). Cambridge University Press.

章节概要

第三版共22章,索引始于第1195页,全书使用C++代码。第1章确立各项约定;第2至13章覆盖科学计算的经典核心;第14至16章转向数据、建模与推断;第17至20章处理微分方程与积分方程;第21、22章则加入计算几何与非数值算法。每章都以编号为0的一节介绍该主题,然后依次讲解各个编号的方法。

第1章:预备知识

引言、误差、精度与稳定性、C系语法、对象、类与继承、向量与矩阵对象,以及另外一些约定。序言指引读者阅读第1.3至1.5节,了解本书所采用的面向对象风格。

第2章:线性代数方程组的求解

高斯–若尔当消元与高斯消元、LU分解、三对角与带状方程组、解的迭代改进、奇异值分解、稀疏方程组、范德蒙矩阵与托普利茨矩阵、乔列斯基分解与QR分解,最后一节问矩阵求逆是否为N³过程。

第3–5章:插值与外推;函数的积分;函数的求值

在有序表中搜索、多项式插值、样条插值与有理插值、网格与散乱数据上的插值,以及拉普拉斯插值(第3章)。经典求积公式、龙贝格积分、反常积分、变量替换、高斯求积、自适应求积与多维积分(第4章)。多项式、连分式、级数及其收敛、递推关系、数值导数、切比雪夫逼近、帕德逼近与有理切比雪夫逼近(第5章)。

第6章:特殊函数

Gamma函数、Beta函数与误差函数,指数积分,贝塞尔函数与艾里函数,球谐函数,菲涅耳积分,道森积分,费米–狄拉克积分,椭圆积分,超几何函数与统计函数。

第7章:随机数

均匀偏差、其他分布的偏差、多元正态偏差、线性反馈移位寄存器、哈希表与哈希存储器、简单蒙特卡罗积分、准随机序列,以及自适应与递归蒙特卡罗方法。

第8–10章:排序与选择;求根与非线性方程组;函数的极小化或极大化

排序、排名与选择算法(第8章)。区间包围、二分法、割线法与布伦特法、牛顿–拉弗森法、多项式求根与非线性方程组(第9章)。一维与多维极小化(黄金分割、布伦特法、下山单纯形法、鲍威尔法、共轭梯度法与拟牛顿法)、单纯形法与内点法线性规划、模拟退火与动态规划(第10章)。

第11章:本征系统

雅可比变换、用吉文斯与豪斯霍尔德方法化为三对角形式、对称矩阵、厄米矩阵与实非对称矩阵的本征值、QR算法与逆迭代。

第12–13章:快速傅里叶变换;傅里叶与谱方法的应用

采样数据的傅里叶变换、FFT及其实数据变体、正弦与余弦变换以及更高维情形(第12章)。卷积、相关、维纳滤波、功率谱估计、数字滤波、线性预测、最大熵谱、不等间隔采样数据、傅里叶积分、小波变换与采样定理(第13章)。

第14–16章:数据的统计描述;数据建模;分类与推断

矩、判断分布是否不同的检验、列联表、相关、信息论性质与Savitzky–Golay平滑(第14章)。作为最大似然估计的最小二乘、直线拟合与一般线性拟合、非线性模型、置信限、稳健估计、马尔可夫链蒙特卡罗与高斯过程回归(第15章)。高斯混合模型与k均值、维特比译码、隐马尔可夫模型、层次聚类与支持向量机(第16章)。

第17–20章:常微分方程的积分;两点边值问题;积分方程与反演理论;偏微分方程

龙格–库塔法、自适应步长、Bulirsch–Stoer法、刚性方程组、多步法与化学反应网络的随机模拟(第17章)。打靶法与松弛法,并以椭球谐函数为例(第18章)。弗雷德霍姆方程与沃尔泰拉方程、奇异核、正则化、Backus–Gilbert方法与最大熵图像复原(第19章)。通量守恒与扩散型初值问题,傅里叶、循环约化、松弛、多重网格与谱方法(第20章)。

第21–22章:计算几何;非数值性较弱的算法

点与盒、KD树、三角形、多边形、德劳内三角剖分与四叉树(第21章)。简单图形的绘制、机器参数、格雷码、校验和、霍夫曼编码与算术编码,以及任意精度算术(第22章)。

核心概念

第1–5章:基础

  • 误差、精度与稳定性:为何看似等价的算法在计算机上表现不同。
  • 矩阵分解:LU、乔列斯基、QR与奇异值分解是线性代数计算的基础。
  • 求积与插值:在经典公式、高斯求积与样条之间作选择。

第6–11章:核心数值方法

  • 随机偏差与蒙特卡罗积分:产生样本并用于计算积分。
  • 求根与极小化:区间包围、牛顿型迭代与多维搜索。
  • 本征系统:化为三对角形式与QR算法。

第12–16章:信号、数据与推断

  • FFT与谱估计:采样、卷积、滤波与功率谱。
  • 最小二乘与最大似然:带置信限的模型拟合。
  • 马尔可夫链蒙特卡罗:对后验分布采样。

第17–22章:方程与算法

  • 自适应步长与刚性:积分常微分方程的核心问题。
  • 松弛与多重网格方法:求解边值问题。
  • 德劳内三角剖分与KD树:几何数据结构。

评析

优点

  • 讲解与可运行代码并重。 序言说明,第二版越来越因文字讲解、简明推导、批判性判断和建议而受重视,作者保留代码,是为了让读者能判断这些建议是否诚实、可实现、实用。因此每个主题都把讨论与一段程序结合在一起。
  • 一册涵盖广泛。 目录从线性代数和特殊函数一直到谱分析、统计、微分方程和计算几何,一本书就可成为处理多种任务的第一站。
  • 大幅修订的版本。 序言列出数百页新内容,包括分类与推断、计算几何两章,扩充的随机数与分布部分,内点法线性规划、动态规划、马尔可夫链蒙特卡罗和高斯过程回归。
  • 有主见、重实用的口吻。 第二版序言把目标描述为一本非正式、有编辑立场、实用的书;第三版序言补充说,它写给的是已经知道多数算法的代码可以找到、想要弄懂其原理以及它好不好用的读者。

局限

  • 是参考书,而非循序渐进的课程。 目录按方法族而非单一进程组织,因此更适合查找某个主题,而不适合逐步学习数值分析。
  • 与其自身的C++风格绑定。 代码使用作者的面向对象约定,由第1章加以说明;使用Python或其他语言的读者需要把它翻译过来或另行处理。
  • 许可事项。 本书开头有一节“许可与法律信息”,涉及代码的使用;在自己的项目中复用程序之前应先阅读。
  • 广度限制深度。 许多方法只占几页,因此对偏微分方程或最优化等专门主题,专著会讲得更深。

在课程中的定位

在这份计算物理书单中,Numerical Recipes是综合性的方法参考书。Newman的 Computational Physics 与Landau、Páez和Bordeianu的 Computational Physics: Problem Solving with Python 是用Python通过物理问题讲授数值方法的教材,更适合作为第一门课程;Kinder与Nelson的 A Student's Guide to Python for Physical Modeling 提供语言方面的基础。Taylor的 An Introduction to Error Analysis 讲实验测量中不确定度的处理,与数值误差是不同的主题。Thijssen的 Computational Physics 则是对凝聚态物理研究方法的研究生层次论述。

可将Numerical Recipes与课程教材搭配使用:当教材中提到的某个方法需要更完整的解释,或需要一个稳健的实现作比较时,本书相应的章节是不错的去处。

如何使用本书

本书适合会编程(代码为C++)、具备微积分、线性代数和一些概率知识,并需要选择、理解和实现数值方法的学生与研究人员。

实用的学习安排:

  • 起点: 第1章讲误差与稳定性以及编码约定,第2章讲线性代数。
  • 按需查阅: 第3至5章讲插值、积分与函数求值,第9、10章讲求根与最优化,第11章讲本征值,第17章讲常微分方程。
  • 数据工作: 第7、14、15、16章讲随机数、统计、建模与推断;信号处理则看第12、13章。
  • 专门章节: 当项目涉及边值问题、反问题、偏微分方程、几何或编码算法时,读第18至22章。
  • 方法: 选择方法之前先读该章的第0节引言,然后在一个测试问题上把推荐的程序与自己的实现作比较。