數值線性代數
迭代精化
你解了 Ax = b 得到 x-hat,但分解時的捨入誤差讓你損失了一些精度。迭代精化用一個出奇廉價的循環把它找回來。計算殘差 r = b - A x-hat,解 A d = r 求得修正量 d,再把 x-hat 更新為 x-hat + d。殘差恰好度量當前答案違背方程的程度,故以 d 修正會把解推向真相。重複幾次即可。
關鍵的省錢之處在於你重用了已經付出 O(n^3) 的那次分解。解 A d = r 不過是再做一次 O(n^2) 的前代與回代,故每個精化步與原求解相比很廉價。通常幾步就夠。一個成敗攸關的微妙處:殘差 r 必須算得準確,最好用比其餘部分更高的精度,因為 r 是較大量之間的小差,易生抵消。
為何奏效:在精確算術下這一更新本應完美,因為 A(x-hat + d) = A x-hat + r = A x-hat + (b - A x-hat) = b。捨入破壞了這個理想,但每一遍仍能除去剩餘誤差的一大部分。只要殘差算得準確且 A 不太病態,迭代就收斂到滿工作精度。
如今迭代精化借助混合精度迎來復興。硬體使低精度算術(單精度或半精度)遠快於雙精度,故現代配方是用低精度廉價地分解並求解,再用幾步帶高精度殘差的精化把雙精度準確度奪回。這在不犧牲最終精度的前提下交付了快速結果。
r = b - A x-hat; solve A d = r; x-hat <- x-hat + d (repeat)
每個精化步都重用現有分解,從殘差解出一個修正量,廉價地找回損失的數字。
用與其餘部分相同的精度計算殘差 r = b - A x-hat 往往收效甚微,因為抵消會吞掉那個小殘差。用更高精度(或擴展精度)累加殘差,才是讓精化真正改進答案的關鍵。
又稱
另見