索引 / 001 ZH-TW
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 節)。