停止判據
迭代法產生一個無止境的序列 x_1, x_2, x_3, ...,它朝答案爬行,但嚴格說來永遠到不了。所以你需要一條「何時停」的規則——停止判據。停得太早,你交出一個馬虎的答案;停得太晚,你浪費算力去追逐既不需要、也無法信任的位數。這個判據就是那個裁判,宣告迭代「夠好了」並結束它。
標準的測試盯著殘差 r_k = b - A x_k,當它的範數降到某個容忍度以下時停止,並以右端項為基準做相對量測:當 ||b - A x_k|| <= tol 乘 ||b|| 時停止。相對形式很重要,因為它讓測試與尺度無關(把整個問題乘以一千,不該改變你何時停)。常見兩項細化。第一,絕不要把 tol 設在浮點所容許的限度之下:把殘差壓到單位捨入乘以條件數之下,是在追逐雜訊,所以實際的下限大約是機器 epsilon 乘上條件數。第二,永遠用一個上限封住迭代次數,使停滯或發散的執行會終止而非無窮迴圈;屆時你回報失敗,而非假成功。
這裡潛伏著微妙的陷阱。小殘差不等於小誤差——在病態的 A 上,你可能在 ||r|| 極小時就停了,x 卻仍離 x_star 很遠,所以容忍度應透過條件數來解讀。以步長 ||x_k - x_{k-1}|| 為基礎的測試,可能被一個爬行的方法(步子極小卻遠未收斂)所騙。而正確的容忍度由問題決定:當你的輸入資料只知三位數時,要求十位數毫無意義。一條好的停止規則,結合相對殘差測試、合理的最大迭代次數保護、以及對「答案究竟能多準」的誠實認識。
典型的求解器呼叫設定兩個界限:相對殘差容忍度,例如 tol = 10^{-8},以及最大迭代次數,例如 maxit = 1000。當 ||b - A x_k|| / ||b|| < 10^{-8} 時返回,或在先碰到 1000 次迭代時回報未收斂。
相對殘差容忍度,加上最大迭代次數保護:要嘛收斂,要嘛大聲報錯。
不要把容忍度設得比資料與條件數所能支持的更嚴。對只知六位數的資料、或條件數 10^10 的矩陣要求十四位數,只是浪費迭代追逐捨入誤差——而以殘差為基礎的停止,仍可能留下很大的向前誤差。