為何有限差分不是最後一句話
前面四篇導讀建起了一台完整而可信的機器:鋪一張格網,把每個導數換成 有限差分樣板,用截斷誤差檢查相容性,用馮諾依曼分析與 CFL 條件檢查穩定性,再讓拉克斯定理擔保收斂。對熱方程或波動方程的光滑解而言,這台機器很難被超越。但只要世界稍微不那麼溫順,兩道裂縫就會浮現,而本篇談的,正是為了填補它們而生的方法族。
第一道裂縫是守恆。許多最重要的偏微分方程都是守恆律——它們說某個量(質量、動量、能量)既不被創造也不被消滅,只是被搬來搬去,正是由守恆律導出偏微分方程那幅圖像。樸素的有限差分格式逐點逼近微分形式 u_t + f(u)_x = 0,沒有任何理由要求它的小誤差去尊重全域的帳目。跑久了之後,格網上的總質量可能悄悄漂移,對一個物理模擬而言,這是一場無聲的災難。
第二道裂縫是震波。從非線性那一級你已經知道,像 Burgers 方程 u_t + u u_x = 0 這樣的純量守恆律,其光滑解可以陡峭化,直到在有限時間內 形成震波,此後誠實的對象是帶有真正跳躍的弱解。跨越這種跳躍放置的中心差分會產生劇烈的振盪——這是吉布斯現象的離散表親——因為跨越懸崖的弦是個狂亂的謊言。我們需要的是預期會有懸崖的方法,而非處處假設光滑的方法。
有限體積:以格胞為單位記帳
有限體積法以一個決定性的態度轉變,修補了守恆那道裂縫。它不再追蹤格點上的逐點值 U_j,而是追蹤 u 在一小段區間(格胞)C_j = [x_{j-1/2}, x_{j+1/2}] 上的格胞平均。然後它根本不去逼近微分方程——而是在每個格胞上對守恆律做精確積分。u_t 在格胞上的積分,是該格胞總量的變化率;f(u)_x 的積分,憑微積分基本定理,塌縮成右側面的通量減去左側面的通量。這就是誠實的記帳:一個盒子裡的東西,只因一側流入、另一側流出而改變。
cell average: Ubar_j ~ (1/h) * integral over C_j of u dx
update rule: Ubar_j^{n+1} = Ubar_j^n - (k/h) * ( F_{j+1/2} - F_{j-1/2} )
F_{j-1/2} cell C_j F_{j+1/2}
| Ubar_j (average) |
----+-------------------------------+----
x_{j-1/2} x_{j+1/2}
flux in --> --> flux out盯著那條更新法則,守恆的魔法便躍然而出。數值通量 F_{j+1/2} 是穿過格胞 j 與 j+1 之間那個面的流動,它對格胞 j 帶正號,對格胞 j+1 帶負號。因此離開一個格胞的,恰好進入它的鄰居——當你對所有格胞求和時,內部通量成對抵消(一個望遠鏡式求和),只剩下邊界通量。格網上的總量被結構性地守恆到機器精度,無論網格多粗。這正是有限體積法在計算流體力學中稱霸的結構性理由。
震波捕捉:風往哪邊吹?
我們該如何選擇面上的通量?最有原則的答案是 Godunov 格式。在每個面上,把兩側相鄰的格胞平均看成一個帶單一跳躍的微小初值問題——正是黎曼問題,非線性那一級的基本構件。解那個小問題(對簡單通量它有精確、已知的答案),讀出面上的值,再在那裡計算物理通量 f。Godunov 的洞見在於:局部的黎曼解早已知道資訊往哪邊傳播,因此格式會自動從迎風側取用資料。
那種迎風的本能至關重要,因為正是它使格式挑出物理上正確的弱解。回想非線性那一級那則誠實的警告:一旦震波形成,弱解便不唯一,只有滿足熵條件的那一個是真實的——其餘的都是數學鬼魂,例如自發的稀疏震波,自然界中從不發生。一個建構良好的 Godunov 類格式,恰好內建了足夠的耗散去拒斥那些鬼魂,並收斂到熵解。它是消失黏性的離散回聲:一抹數值塗抹,施加在正確的位置,便選出了可容許的那道跳躍。
但天下沒有白吃的午餐,而這正是震波捕捉的核心張力。像樸素 Godunov 這樣的一階格式堅如磐石、無振盪,然而它內建的數值擴散會把一道尖銳的震波塗抹過好幾個格胞、化為一道平緩的斜坡——懸崖存活了,卻失去了它的稜角。一個天真的高階格式保住了稜角,卻在跳躍附近復活了振盪。我們想要在光滑區域有高精度,又想在震波處有乾淨、單調的剖面,而一條著名的定理(Godunov 的階數障礙)說:沒有任何固定的線性格式能同時給出兩者。
通量限制器:兩全其美
繞過 Godunov 障礙的出路,是變得非線性——讓格式依鄰近解的樣貌而改變主意。這正是 通量限制器的職責。其想法是把兩個通量混合:一個安全、絕不振盪的低階通量,和一個尖銳、能漂亮地解析光滑區域的高階通量。一個限制器函數檢視局部的光滑度感測器——通常是相鄰斜率之比——並逐格胞地決定,要信任多少高階通量。
- 在每個面上,由相鄰的斜率算出一個光滑度比值 r——u 光滑處 r 大且為正,斜率反轉處(極值或震波的徵兆)r 接近零或為負。
- 把 r 餵入一個限制器函數(minmod、van Leer、superbee……),它回傳一個介於 0 與某個小上限之間的權重。
- 解光滑處,權重接近 1:幾乎完全採用高階通量,享受二階精度。
- 震波或極值附近,權重塌向 0:退回安全的低階通量,扼殺振盪。
回報是一個高解析度的格式:在流動光滑處二階精確,卻在不連續處沒有虛假的擺動。一個好的限制器所強制的技術目標,是讓格式總變差遞減(TVD)——離散解上下起伏的總量永不增長,這正是禁止新振盪誕生的性質。這是日常雙曲守恆律真正的最先進水準,也是有限體積那套格胞平均觀點值得如此細心鋪設的原因。
譜方法:把光滑換成精度
現在擺向相反的極端。假設你的解確實光滑——沒有震波、沒有尖角,也許是一個週期流動,或一個特徵平緩的波。有限差分與有限體積把它們的點花在局部,每個樣板只看見少數幾個鄰居,而這種局部性為它們的精度設了上限。譜方法下了相反的賭注:不用局部的格點值,而是用一組全域光滑基底函數之和來表示未知量——週期問題用截斷的傅立葉級數,區間上用切比雪夫多項式——讓每個係數一次就感受到整個定義域。
當它適用時,回報令人屏息。求導變得輕而易舉:對 sin(n x) 求導只是乘上一個關於 n 的因子,所以施加 u_xx 不過是在每個傅立葉係數上做一次乘法——而快速傅立葉變換以近乎線性的時間在格點值與係數之間往返。更妙的是,對一個光滑的週期函數,截斷級數的誤差比格距的任何冪次都衰減得更快——所謂的譜精度或指數收斂。二階有限差分格式要四倍的點才能把誤差砍成四分之一,譜方法卻能把它砍掉好幾個數量級。把解析度加倍,可能換來再多十位正確的數字。
退一步看,整個層級便成了一張權衡的地圖,而非單一的演算法。有限差分簡單而透明;上一篇的有限元素法能優雅地彎就複雜的幾何;有限體積保證守恆並馴服震波;譜方法在光滑、簡單的定義域上交付非凡的精度。沒有一個是放諸四海皆準。成熟的數值分析師的本領,不在於背下某一個格式,而在於讀懂問題的結構——守恆?震波?光滑?幾何?——並選出強項與之對齊的方法。