数值线性代数
迭代精化
你解了 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 往往收效甚微,因为抵消会吞掉那个小残差。用更高精度(或扩展精度)累加残差,才是让精化真正改进答案的关键。
又称
另见