準確度 = 條件性 × 穩定性(accuracy = conditioning × stability)
這句口號是整個領域的一行摘要,它把「我的答案為什麼錯了?」這個實際問題,恰好拆成兩部分歸責。你實際得到的準確度,是兩個獨立因子的乘積:問題有多難(其條件性)與你演算法有多好(其穩定性)。任一因子都能把你拖垮,而且它們相乘,所以你需要兩者都處於良好狀態。
它就是主經驗法則反過來說。攤開來講:相對向前誤差至多等於(條件數)乘以(向後誤差)。條件數是條件性那一項——是問題的固定性質,不重新表述就改不了。向後誤差是穩定性那一項——對向後穩定演算法而言大約就是單位捨入,雙精度約 10^-16。把兩者相乘,就能預測你保留多少位數字。良態問題(kappa ~ 1)以穩定方法求解能給出接近機器精度的結果;而病態問題(kappa ~ 10^10)以「同一個」穩定方法求解則損失約 10 位數字——而且無可避免。
誠實的後果值得明說。第一,完美穩定的演算法在病態問題上會給出很大的向前誤差;損失的準確度是問題的錯,不是程式的錯。第二,方法所能做到的最好就是向後穩定——向前誤差小是良好條件性的贈禮,不是演算法自己能保證的東西。第三,要修好一個壞答案,先診斷該怪哪個因子:靠選擇更好的演算法來改善穩定性,或靠重新表述問題、採用更高精度來改善條件性。同時調好這兩個旋鈕,正是可靠計算的做法。
兩種情境,同一個向後穩定求解器。(a) kappa(A) ~ 10:向前誤差約 10 乘以 10^-16 = 10^-15,約 15 位好數字。(b) kappa(A) ~ 10^13:向前誤差約 10^13 乘以 10^-16 = 10^-3,只剩約 3 位好數字。求解器兩次做的事完全一樣;造成差異的是條件性。
把穩定性固定不變,看條件性如何獨力決定準確度。
常見的誤解是換演算法總會有幫助。只有在目前方法不穩定時才有幫助;在病態問題上,每個穩定方法都給出同樣令人失望的準確度。