索引 / 001 ZH-CN
Python Programming and Numerical Methods: A Guide for Engineers and Scientists(Python 编程与数值方法:工程师与科学家指南) cover

数学

数学

Python Programming and Numerical Methods: A Guide for Engineers and Scientists(Python 编程与数值方法:工程师与科学家指南)

Qingkai Kong; Timmy Siauw; Alexandre M. Bayen

英文原名: Python Programming and Numerical Methods: A Guide for Engineers and Scientists

一本把 Python 编程与科学和工程中常用的基本数值方法结合起来的入门书。第一部分从零开始讲授 Python;第二部分将其应用于求根、插值、数值微分与积分、线性方程组和微分方程求解等标准数值计算主题。

需要的基础: 高中代数和三角函数以及入门微积分;不要求有编程经验,所需的线性代数在书中讲授。

难度等级
入门
学术层次
本科
numerical methodspythonscientific computingnumerical analysisengineering mathematics教科书

01 / 导读

导读

引用

Kong, Q., Siauw, T., & Bayen, A. M. (2020). Python Programming and Numerical Methods: A Guide for Engineers and Scientists. Academic Press (Elsevier). Free official edition: https://pythonnumericalmethods.berkeley.edu/notebooks/Index.html

章节概要

本书分为两部分:第一部分(第1–13章)讲授编程,第二部分(第14–24章)介绍数值方法。关于机器学习的第25章是只在在线版中提供的扩展内容。

第1章:Python 基础

开篇一章让学生尽快上手:安装 Python、把它当计算器使用、管理软件包,以及在 Jupyter Notebook 中工作。本章介绍基本数据类型(整数、浮点数、复数、字符串和布尔值)以及逻辑表达式和运算符。

第2章:变量与基本数据结构

在变量与赋值之后,本章介绍 Python 的内置容器——字符串、列表、元组、集合和字典——以及 NumPy 数组;章末总结特别指出 NumPy 数组是科学计算的核心对象。

第3–4章:函数;分支语句

第3章讲解如何定义函数、每个函数拥有自己的内存空间(局部变量与全局变量)、嵌套函数、lambda 函数以及把函数作为参数传递。第4章加入 if-else 分支和单行的三元运算符。

第5–6章:迭代;递归

第5章把 for 循环、while 循环和推导式作为构造迭代解法的工具。第6章介绍递归函数和分治策略,例子包括斐波那契数、汉诺塔和快速排序。

第7章:面向对象编程(OOP)

本章对比面向过程编程与面向对象编程,介绍类、对象以及继承、封装和多态的思想。

第8–9章:复杂度;数的表示

第8章定义算法复杂度和大 O 记号,通过例子说明复杂度为何重要,并演示用性能分析器找出运行缓慢的代码。第9章解释 N 进制与二进制表示、IEEE 754 浮点数和舍入误差。

第10–11章:错误、良好的编程习惯与调试;数据的读写

第10章区分语法错误、异常和逻辑错误,推荐避免错误的习惯,并讲解 try/except、类型检查和调试器。第11章说明如何读写文本、CSV、pickle、JSON 和 HDF5 文件。

第12–13章:可视化与绘图;Python 并行化

第12章介绍用 Matplotlib 绘制二维和三维图形、用 Cartopy 绘制地图,以及制作动画和视频。第13章解释进程、线程和 Python 的全局解释器锁,然后使用 multiprocessing 包和 joblib 在多个核心上运行任务。

第14章:线性代数与线性方程组

第二部分以线性代数速成开篇:向量、范数、线性无关、具有行列式、秩和逆的矩阵,以及线性变换。本章把方程组表示为 Ax = y,把解的个数与秩联系起来,并用高斯消元法、高斯–若尔当消元法、LU 分解和高斯–赛德尔迭代求解方程组,然后介绍 NumPy 和 SciPy 的求解器以及矩阵求逆。

第15章:特征值与特征向量

在陈述特征值问题之后,本章介绍求最大特征值的幂法、反幂法和带位移的幂法,以及求全部特征值的 QR 方法,并说明如何用 NumPy 计算它们。

第16章:最小二乘回归

最小二乘法被推导两次——一次用线性代数,一次用多元微积分——由此得到参数的正规方程公式。本章用 Python 拟合数据,并通过对数变换、多项式回归和 SciPy 的 curve_fit 处理非线性模型。

第17章:插值

本章陈述插值问题,介绍线性插值、三次样条以及拉格朗日和牛顿多项式插值,并给出 SciPy 实现。

第18章:级数

本章用泰勒级数表示和逼近函数,讨论线性近似,用泰勒余项估计截断误差,并提醒注意级数求和时的舍入误差。

第19章:求根

在定义问题和容差概念之后,本章介绍二分法(稳定但较慢)和牛顿–拉弗森法(在根附近收敛快但可能不稳定),并展示 SciPy 的求根函数。

第20–21章:数值微分;数值积分

第20章用前向、后向和中心有限差分近似导数,推广到高阶导数,并说明含噪声数据带来的困难。第21章用黎曼和、梯形公式和辛普森公式近似积分,比较它们的精度阶数,并使用 SciPy 的积分程序。

第22–23章:常微分方程——初值问题;常微分方程——边值问题

第22章把高阶常微分方程化为一阶方程组,讲解显式、隐式和梯形欧拉法、数值误差与稳定性、预测–校正法和龙格–库塔法、SciPy 的 solve_ivp,并简要介绍多步法和刚性等进阶主题。第23章用打靶法和有限差分法求解边值问题,并讨论它们的精度和稳定性。

第24章:傅里叶变换

本章从波的基本性质(频率、周期、振幅、波长)出发,定义离散傅里叶变换,解释快速傅里叶变换如何利用对称性,并把 NumPy 和 SciPy 的 FFT 函数应用于信号。

第25章:机器学习导论

这一在线扩展章节介绍监督学习和无监督学习,以鸢尾花数据集为例,用 scikit-learn 演示支持向量机分类、回归和 k 均值聚类。

核心概念

第1章:Python 基础

  • Jupyter Notebook:把代码、输出和文字混合在一起的交互式环境,全书都在使用。
  • 数据类型:int、float、complex、字符串和布尔值,各有其运算。

第2章:变量与基本数据结构

  • 可变与不可变容器:列表和字典可以修改,字符串和元组则不能。
  • NumPy 数组:类型固定的多维数组,支持快速的逐元素运算。

第3–4章:函数;分支语句

  • 函数作用域:每个函数有自己的内存块,只能通过输入接收信息,通过输出返回信息。
  • lambda 函数:匿名的单行函数,常作为参数传递。
  • 分支:让代码在不同条件下执行不同操作的 if-elif-else 语句。

第5–6章:迭代;递归

  • 循环:重复执行指令的 for 或 while 结构。
  • 递归与分治:通过让函数调用自身处理更小规模的问题来求解。

第7章:面向对象编程(OOP)

  • 类与对象:把数据和方法组合在一起的蓝图,以及由它创建的实例。
  • 继承:在子类中复用父类的属性和方法。

第8–9章:复杂度;数的表示

  • 大 O 记号:与机器无关地描述运行时间如何随输入规模增长。
  • IEEE 754:标准二进制浮点格式,它限制了精度并导致舍入误差。

第10–11章:错误、良好的编程习惯与调试;数据的读写

  • 异常处理:在不中断程序的情况下响应运行时错误的 try/except 代码块。
  • 文件格式:用于存储和交换数据的文本、CSV、pickle、JSON 和 HDF5。

第12–13章:可视化与绘图;Python 并行化

  • Matplotlib 绘图:绘制二维和三维图形来展示结果。
  • 基于进程的并行:通过多个进程(multiprocessing 或 joblib)利用多个 CPU 核心。

第14章:线性代数与线性方程组

  • 秩与解:比较 rank(A) 与 rank([A, y]) 可以判断方程组有零个、一个还是无穷多个解。
  • LU 分解:把 A 分解为下三角矩阵和上三角矩阵,以高效求解方程组。
  • 高斯–赛德尔迭代:逐个更新未知量的迭代方法。

第15章:特征值与特征向量

  • 幂法:反复乘以 A,求出主特征值及其特征向量。
  • QR 方法:基于 QR 分解的迭代,用来求出全部特征值。

第16章:最小二乘回归

  • 正规方程:给出最小二乘参数的公式 β = (AᵀA)⁻¹AᵀY。
  • 线性化变换:通过取对数,用线性最小二乘拟合指数模型或幂律模型。

第17章:插值

  • 三次样条:一阶和二阶导数都连续的分段三次插值。
  • 拉格朗日多项式与牛顿多项式:通过所有数据点的唯一多项式的两种表示形式。

第18章:级数

  • 泰勒级数:在某点附近把函数表示为多项式项的无穷和。
  • 截断误差:截断级数带来的误差,用泰勒余项估计。

第19章:求根

  • 二分法:反复把函数变号的区间一分为二。
  • 牛顿–拉弗森法:利用切线迭代,在根附近收敛很快。

第20–21章:数值微分;数值积分

  • 有限差分:用网格上函数值之差的比值近似导数,精度取决于格式的阶数。
  • 辛普森公式:用二次近似进行积分,对光滑函数比梯形公式更精确。

第22–23章:常微分方程初值问题与边值问题

  • 欧拉法与龙格–库塔法:阶数逐步提高的、逐步推进求解初值问题的格式。
  • 稳定性:数值误差是否增长,取决于方程、方法和步长。
  • 打靶法:把边值问题转化为结合求根的初值问题。

第24章:傅里叶变换

  • 离散傅里叶变换:把采样信号从时域转换到频域。
  • 快速傅里叶变换:利用对称性高效计算 DFT 的算法。

第25章:机器学习导论

  • 监督学习与无监督学习:从带标签的数据中学习(分类、回归),或在无标签数据中寻找结构(聚类)。
  • 支持向量机:用最大间隔边界区分类别的分类器。

评析

优点

  • 真正面向零基础的编程教学。 序言不要求任何编程经验,只要求高中代数和三角以及大学入门微积分。第一部分从计算器和数据类型开始,逐步讲到函数、面向对象、调试、文件格式、绘图和并行计算,让工科学生在接触数值方法之前先掌握一套实用工具。
  • 交互式、可运行。 在线版是一组 Jupyter 笔记本,鼓励读者运行其中的代码;频繁出现的"TRY IT!"模块(全站超过 200 个),以及 TIP、WARNING、WHAT IS HAPPENING? 和 CONSTRUCTION 等提示框,引导读者动手实践。代码采用 MIT 许可证发布。
  • 方法与库工具相结合。 第二部分的大多数章节先从零实现一种方法,再介绍对应的 NumPy 或 SciPy 函数,使学生既理解算法本身,也熟悉专业工具。
  • 有意追求宽而简的覆盖。 每章设计为不超过两个课时,因此一门课就能概览线性代数、特征值、回归、插值、级数、求根、微分、积分、常微分方程和傅里叶分析。

局限

  • 有意保持浅显。 序言说明没有任何主题讲得很深;误差分析和收敛证明极少,需要理论的学生必须求助于数值分析教材。
  • 代码依赖特定版本。 书中列出的是 2019 年前后的软件包版本(例如 NumPy 1.16、SciPy 1.2),一些函数和输出在当前版本中可能有所不同。
  • 各主题深浅不一。 有些小节(例如多步法和刚性)只是简短的"进阶主题",机器学习一章也只是简短的在线扩展。
  • 在线文本与印刷版的区别。 网站注明本书版权属于 Elsevier,并把这些笔记本描述为印刷版的节选;机器学习一章是在线扩展,在线提供的唯一附录介绍在 Windows 上安装 Python。

书中的应用

应用以例题和习题的形式出现,而不是单独成章:用 Cartopy 绘制地理数据地图、制作动画(第12章),对计算计时并进行并行化(第8章和第13章),用线性与非线性最小二乘拟合实验数据(第16章),用自编程序和 SciPy 求解单摆以及火箭发射边值问题等常微分方程模型(第22–23章),用 FFT 分析信号(第24章),以及对鸢尾花数据集进行分类和聚类(第25章)。

在课程中的定位

本书与 Cleve Moler 所著 Numerical Computing with MATLAB 并列。两者都采用以软件为先导的方法,但侧重点不同:Kong、Siauw 和 Bayen 用第一部分从零开始教授 Python 编程,而 Moler 假定读者已有一定编程基础,用 MATLAB 更多地讲解库算法的内部工作原理。没有编程背景的学生或使用 Python 的课程应从本书开始;已会编程的学生可以选择 Moler,或把它作为配套读物。

Burden、Faires、Burden 的 Numerical Analysis 和 Süli 与 Mayers 的 An Introduction to Numerical Analysis 是本科教材,一般被描述为带误差分析、更严格的教材,是学完第二部分后自然的下一步。Trefethen 与 Bau 的 Numerical Linear Algebra 和 Stoer 与 Bulirsch 的 Introduction to Numerical Analysis 是研究生层次的教材,适合在熟悉本书介绍的方法之后学习。

如何使用本书

本书面向没有编程经验的一、二年级工科和理科学生。先修要求是高中代数和三角以及大学入门微积分;后面需要的线性代数由第14章补充。

序言建议先读讲授编程基础的第1–5章;第6–11章可按任意顺序阅读。对于已有一些编程经验的学生,一学期的课程可以快速过完第一部分,然后集中学习第14–24章。阅读时打开 Jupyter 笔记本,运行每个例子,尝试所有"TRY IT!"模块,完成每章末尾的习题,并用总结列表检验理解。由于软件包版本会变化,输出不一致时应对照最新的 NumPy 和 SciPy 文档。

版本与来源

本导读依据作者在加州大学伯克利分校发布的 Python Programming and Numerical Methods 免费官方在线版(https://pythonnumericalmethods.berkeley.edu/notebooks/Index.html;© 2020,印刷版由 Academic Press/Elsevier 出版;代码采用 MIT 许可证)。导读参考了序言(目的、先修要求、结构、阅读建议、软件包版本)、完整目录、第1–25章及附录的全部章节大纲和小节页面标题、所有章节的章末总结,以及更仔细阅读的若干小节(包括 9.2、12.3、13.1–13.3、14.4、15.3、16.5、18.3、22.5、22.7 和 25.2–25.4 节)。