科學計算實務:軟體、驗證與可重現性

收斂階研究(order-of-accuracy study)

當一個數值方法去近似一個連續問題時,它會犯下一個取決於步長的離散化誤差——把那個步長叫做 h,也就是你網格的間距或時間步的大小。這個方法理應是「p 階精確」的,意思是對小的 h,誤差表現得像 C 乘以 h^p:把 h 減半,一個二階方法(p=2)的誤差應降為四分之一,一階方法則降為二分之一。收斂階研究就是檢查你的程式是否真的達到理論承諾之階數的那個實驗。它是科學計算中最有力的臭蟲偵測器之一,因為錯誤的階數幾乎總是在示意有編碼錯誤。

做法很具體。在一個有已知精確解的問題上(往往是製造出來的解),用幾個遞減的步長執行你的程式——比方說 h、h/2、h/4、h/8——並在每個步長記下誤差 E(h)。若 E(h) 約等於 C h^p,則比值 E(h) / E(h/2) 應約為 2^p,於是你可以直接讀出 p:p 約等於 log2( E(h) / E(h/2) )。一個更乾淨的版本是把 log(E) 對 log(h) 作圖;那些點應落在一條直線上,其「斜率」就是 p。這個「觀測到的收斂階」就是你拿去和理論階數比較的數字。一個在對數-對數圖上顯示斜率為 2 的二階格式,正是照設計運作的。

為何這是如此受信任的認證?因為符合預測的階數是一個嚴苛的測試:一個程式可能靠運氣在某一個網格上給出看似合理的答案,但要在好幾個網格上「不小心地」產生出數學所要求的「精確收斂速率」是非常困難的,除非程式真的正確。當觀測到的階數低於預期時——二階格式顯示斜率 1,或更糟、斜率 0(不收斂)——那就是一面紅旗,指向某一類特定的臭蟲:邊界條件以錯誤的階數施加、一個符號錯誤、一個被誤處理的項。誠實的提醒:漸近速率只有在 h 小到進入「漸近區」後才會出現(在粗網格上,階數可能因無辜的理由而看起來不對),而一旦捨入誤差主導(h 極小,或誤差接近機器 epsilon)那乾淨的速率就會崩壞。一個忽略這兩端的研究可能被誤讀。

在測試一個二階有限差分格式時,你在 h = 1/10、1/20、1/40 量到最大誤差 4.0e-3、1.0e-3、2.5e-4。每個比值約為 4,所以 log2(4) = 2:觀測階數為 2,與理論相符——程式通過驗證。若誤差反而是 4.0e-3、2.0e-3、1.0e-3(比值為 2),觀測階數就會是 1,示意有一個臭蟲悄悄把你降成了一階。

把 h 減半應使二階方法的誤差降為四分之一;對數-對數圖的斜率讀出觀測到的階數。

乾淨的速率只在漸近區成立:太粗,階數會因良性理由看起來不對;太細,捨入誤差(接近機器 epsilon)會毀掉那個趨勢。要從細化序列的中段讀出階數,而非兩端。

又称
convergence studygrid refinement studymesh refinement study收斂研究網格細化研究