為何樸素消元會爆炸
第一卷的高斯消元把每一列除以它的主元。若主元很小,乘數就變得巨大,而巨大的乘數會放大資料中已有的捨入誤差。結果是一團後向不穩定的亂麻:你算出的答案所求解的問題,與你提出的問題相去甚遠。在精確算術下消元能處理得很好的同一個矩陣,在浮點下可能丟光每一位數字。
Solve [1e-20, 1; 1, 1] x = [1; 2] in double precision.
True answer is essentially x = (1, 1).
NAIVE (pivot = 1e-20):
multiplier = 1 / 1e-20 = 1e20
row2 <- row2 - 1e20 * row1
= [0, 1 - 1e20] -> fl gives [0, -1e20] (the '1' vanished!)
back-substitute: x2 = 1, x1 = (1 - x2)/1e-20 = 0 WRONG
WITH PARTIAL PIVOTING (swap so pivot = 1):
rows: [1, 1; 1e-20, 1], multiplier = 1e-20
row2 <- [0, 1 - 1e-20] = [0, 1] (no information lost)
back-substitute: x2 = 1, x1 = 1 CORRECT部分選主元:標準的修復方法
解藥是部分選主元:在消去第 k 行之前,交換列使該行中絕對值最大的元素位於對角線上。這迫使每個乘數滿足 |m| <= 1,於是它們再也無法放大誤差。形式上它計算分解 P A = L U,其中 P 記錄列交換、L 的元素以單位為界——這就是你在第一卷見過的LU 分解,如今變得安全。
計算成本:浮點運算次數與稀疏性
成本以浮點運算次數度量——即浮點運算。稠密 n x n 矩陣的 LU 分解約需 (2/3) n^3 次浮點運算;之後每次三角求解僅為 O(n^2)。這種不對稱正是「分解一次、反覆複用」的原因:對十個不同的右端項 b 求解,代價是一次立方分解加十次廉價的二次求解,而非十次分解。
n^3 這堵牆殘酷無比:n 翻倍,成本增長八倍。對於離散化偏微分方程產生的巨型系統——數百萬個未知量——直接分解根本不可能。但這些矩陣通常是稀疏的:幾乎所有元素都為零。稀疏矩陣方法只儲存並運算非零元,而核心危險是填充:消元會把結構零變成非零,破壞稀疏性。重排行列以最小化填充,正是稀疏直接求解器的全部技藝。