迭代精化
假設你已解出 A x = b,得到一個不錯但不完美的計算答案 x-hat——消去過程中的捨入讓它略有偏差。迭代精化是把這個答案打磨回足精度的便宜又優雅的方法。其想法是:量出 x-hat 有多錯,解一個小的修正問題,把修正加回去,重複直到答案達到精度所允許的程度。
它透過殘差運作,殘差是 r = b - A x-hat,也就是把你的近似解代回後剩下的東西。若 x-hat 精確,r 就為零。真正的誤差 e = x - x-hat 恰好滿足 A e = r——同一個矩陣 A,只是換了新右端 r。所以你解 A e = r(便宜地,重用你已有的 LU 分解——只是一次 O(n^2) 的三角求解),再更新 x-hat := x-hat + e。關鍵的微妙之處在於,殘差 r = b - A x-hat 必須以比其餘更高的精度計算,因為它是兩個大而幾乎相等的數的小差,否則會被抵消淹沒。重複幾次通常就能找回被捨入損失的位數。
迭代精化是從直接求解中榨出最大精度的標準方法,而且極為便宜:每個精化步驟只是一次殘差計算加一次 O(n^2) 三角求解,搭在你已付過的 O(n^3) 分解上。現代的混合精度變體把這點發揮得淋漓盡致——以低精度快速分解,再以高精度精化以找回精度,這在低精度快得多的硬體上是個大勝利。誠實的極限:精化修正的是「演算法」造成的誤差(捨入),但它救不了「病態」問題——若條件數巨大,即便修正後的答案也受限於真解對資料有多敏感,精化會緩慢收斂或停滯。
LU 求解給出 x-hat 後,計算 r = b - A x-hat(以額外精度),用「同樣的」L 與 U 解 A e = r,令 x-hat := x-hat + e;一兩次通常就能找回被捨入損失的位數。
重用既有的分解,使每個修正步驟成為 O(n^2) 的便宜貨。
精化只修補演算法的捨入誤差,而非病態:在病態的 A 上它收斂緩慢甚至不收斂,且殘差必須以更高精度計算,否則修正毫無意義。