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

問題的條件性(problem conditioning)

想像你照食譜秤材料,但廚房磅秤誤差一公克。煮燉菜時沒人會察覺;但做精緻的蛋白霜時,那一公克就毀了整鍋。食譜本身決定了它對輸入小失誤的容忍度。條件性正是把這個想法用在數學問題上:當你餵進去的資料稍微抖動時,答案會跟著移動多少。

要小心條件性是「掛在誰身上」。它是「問題」(從輸入到輸出的映射)本身的性質,而不是你所用演算法的性質。形式上,一個問題拿一筆輸入 x,產生輸出 f(x)。若 x 的微小相對變化(例如把 x 換成 x 加上 delta-x)只造成 f(x) 的微小相對變化,這個問題就是良態(well-conditioned);若 x 的微小變化能讓 f(x) 劇烈改變,問題就是病態(ill-conditioned)。衡量這種敏感度的數字就是條件數(condition number),它越小越好。

這之所以重要,是因為條件性替準確度設下一道硬性下限,再聰明的程式也突破不了。你的輸入幾乎從不精確:它們來自量測,或來自把實數捨入成浮點數。如果問題本身把這些無可避免的輸入誤差放大了,比方說一百萬倍,那麼你的答案至少帶著這一百萬倍的誤差——這是問題的錯,不是你程式的錯。把「問題本質上就難」和「我的演算法不好」分開,是可靠計算的第一步。

求解線性系統 A x = b,當 A 幾乎奇異(各列幾乎平行)時是病態的:把 b 推動 0.1%,解 x 可能擺動 100%。而計算 x 接近 1 時的 sin(x) 則是良態的:x 變動 0.1% 幾乎不會移動答案。

同樣的算術精度,命運卻相反——是問題、而非機器,決定了結果。

條件性談的是問題,絕不是演算法。用完美演算法去解一個病態問題,答案仍會不準;那不算是不穩定。

又称
conditioning問題的良態與病態