數值線性代數:直接法

為何鮮少構造逆矩陣

紙上 A x = b 的解寫成 x = A^{-1} b,所以一個自然的反射是去算出逆矩陣 A^{-1} 再乘上 b。幾乎總是,這是錯的做法。在數值線性代數中,逆矩陣是你用來推理時寫下的量,而非你真的去計算的量,「絕不為了解系統而求逆」是這領域最堅實的民間智慧之一。

有兩個紮實的理由。第一,成本:明確構造 A^{-1} 約需 2 n^3 次浮點運算(這像是一次解 n 個系統,單位矩陣的每一行一個),然後 x = A^{-1} b 又要 2 n^2 次。透過 LU 分解直接解 A x = b,分解只約 2 n^3 / 3、求解 n^2 次——約便宜三倍,而當你對許多右端重用同一個分解時更便宜得多。第二,精度:用分解求解(對 L 與 U 做前代與回代)是向後穩定的,而構造逆矩陣再相乘會引入額外捨入,對同一個問題明顯較不準確。所以 LU 求解在速度與精度上都贏。

正確的心智模型是:先分解,再求解。保留 LU(或喬列斯基)分解並施於每個 b;絕不實際算出 A^{-1}。同樣的原則可推廣——要解 A X = B(B 為矩陣)你不去構造 A^{-1} B,而是做三角求解;要得行列式你不求逆,而是從分解讀出。罕見的正當例外是當逆矩陣本身就是你真正需要的最終產物時(例如統計中共變異數矩陣的某些元素),而即便如此通常也有更好的特化方法。若你發現自己在打「inv(A)*b」,停下來,改用求解。

對 1000x1000 的 A 求 x:LU 求解約 6.7e8 次浮點運算且向後穩定;構造 A^{-1} 再相乘約 2e9 次「且」損失精度——兩方面都嚴格更差。

先分解再求解的途徑既更便宜也更準確;明確的逆矩陣幾乎從不必要。

x = A^{-1} b 這個式子在數學上正確,但作為數值配方很糟:它告訴你 x 是什麼,而非如何計算它。請用求解(對分解做前代/回代),而非矩陣求逆。

又称
don't invert the matrixinverse avoidance避免求逆不要求逆矩陣