條件數、穩定性與向後誤差分析

良態與病態問題(well-conditioned vs ill-conditioned)

想像通往觀景台的兩條路。在平緩的路上,偏離一步幾乎還在你想去的地方。在刀鋒般的山脊上,橫移一步就摔下懸崖。良態問題就是那條平緩的路:輸入誤差小,輸出誤差就小。病態問題就是那道山脊:極小的輸入誤差能把答案甩得離譜。分界線就是條件數的大小。

量化地說,「良」與「病」是程度問題,從條件數 kappa 讀出。kappa 接近 1 極佳;kappa 到幾百或幾千仍算舒適的良態;kappa 約為 10^8 表示你已損失 16 位雙精度數字裡的大約一半,應該開始不安;kappa 接近 10^16 則表示對雙精度而言,問題實際上已無解——再也沒有準確度可以損失了。經驗法則是:你純粹因為條件性就會失去大約 log10(kappa) 位有效數字。

誠實而常令人意外的一點:病態不是你能除錯掉的程式錯誤。若底層問題本身病態,換演算法、加檢查、或把程式打磨得再漂亮都救不了準確度——只有重新表述問題(例如避開接近抵消、改用一個適定性更好的量)或採用更高精度才行。許多真實的病態問題藏在無害的外表下:相減兩個幾乎相等的數、擬合高次多項式、或對各列幾乎共線的矩陣求逆。

(x-1)(x-2)...(x-20) 的根彼此分得很開、看似無害,但正如著名的威爾金森多項式所示,把單一係數擾動百億分之一,就能讓某些根移動 2 或 3——從係數去求那些根是嚴重病態的。

看似溫馴,行為卻狂野——這正是開創此領域的經典震撼。

良態與病態描述的是問題,不是你的方法。常見的錯誤是把壞答案怪到演算法頭上,而真正的元兇其實是一個病態問題。

又称
良態病態