索引 / 001 ZH-TW
Numerical Computing with MATLAB(MATLAB 數值計算) cover

數學

數學

Numerical Computing with MATLAB(MATLAB 數值計算)

Cleve B. Moler

英文原名: Numerical Computing with MATLAB

一本由 MATLAB 創始人撰寫的數值方法與科學計算入門書。每章說明一種核心演算法,示範如何用隨書附的簡短 MATLAB 程式實作,並透過範例與習題探討它的表現。紙本由 SIAM 出版,電子版則由 MathWorks 免費提供。

需要的基礎: 微積分,對常微分方程與矩陣有一定認識,並有些許寫程式的經驗;做習題需要能使用 MATLAB。

難度等級
入門
學術層次
大學部
numerical methodsmatlablinear systemsinterpolationdifferential equations

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 分解,說明為什麼需要部分選樞軸,並用範數和條件數分析捨入誤差的影響。後面幾節討論稀疏矩陣和帶狀矩陣,並以 Google 的 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 節)——以及部分習題。