JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

顯式與隱式:克蘭克-尼科爾森法

顯式格式每步便宜,卻活在一個極小時間步長限制的陰影下;隱式格式每步要解一整個系統,卻從不眨眼。克蘭克-尼科爾森法正好從中間一刀切開,並以這番功夫換來二階精度。

岔路口:用現在還是用以後?

到了這裡,你已經能拿起 熱方程 u_t = k u_xx,鋪上一張網格,再把每個導數換成一個 有限差分。任何人寫下的第一個格式都是 顯式 的,也就是 FTCS:時間用前向差分,空間用中央差分。它令人難以抗拒,因為它直接告訴你某個網格點上的新值——你只要從已知那一層讀出三個鄰居,把它們加起來就好。不必求解,不必費事,往前推進就是了。

但還有第二個同樣自然的選擇,初學者卻幾乎從不率先寫下它。當你構造空間差分 u_xx 時,如果改在 的時間層、而非舊的那層上求值,會怎樣?此時下一步的三個未知數糾纏在同一個方程裡,你沒法直接讀出答案——你必須一次解出橫跨整列網格的線性系統。這就是 隱式 格式(時間上的後向歐拉法)。它每步成本更高,作為回報,它買到了顯式格式給不了的東西:它永不失穩。

explicit (FTCS):  u_new[j] = u[j] + r*( u[j-1] - 2u[j] + u[j+1] )     r = k*dt/dx^2
                  -> one formula, read three old neighbours, done.

implicit (BE):    -r*u_new[j-1] + (1+2r)*u_new[j] - r*u_new[j+1] = u[j]
                  -> a tridiagonal system, solve the whole row at once.
同一個熱方程,同一張網格——唯一的差別是 u_xx 那一項住在哪一個時間層上。

為何顯式格式被拴著一條繩

上一篇指南讓你配備了 馮諾伊曼穩定性分析:把單一個傅立葉模態 e^(i m x) 餵進格式,看它的振幅每步被一個放大因子 g 乘上。只有當 |g| ≤ 1 時模態才存活。把這部機器開到 FTCS 上,你會得到 g = 1 - 4r·sin^2(m·dx/2),其中 r = k·dt/dx^2 是網格比。最壞的模態(鋸齒狀的那個)使 sin^2 趨於 1,給出 g = 1 - 4r。要 |g| ≤ 1,就需要 1 - 4r ≥ -1,也就是 r ≤ 1/2

那個看似無辜的 r ≤ 1/2 是個暴君。它說 dt ≤ dx^2 / (2k):時間步長被銬在空間步長的 平方 上。把 dx 減半好換得更細的圖像,你就必須把 dt 砍成四分之一——所以在空間上把網格細化 10 倍,會逼著你多算 100 倍的時間步。這是 CFL 條件 在拋物型上的表親,而對擴散而言它咬得遠比對波動狠,正是因為那個平方。違反它,你得到的不只是一個不夠準的答案;你得到的是一場爆炸,鋸齒無界地放大,直到數值溢位。

隱式法:無條件地沉穩,卻略顯模糊

現在對隱式(後向歐拉)格式做同一個馮諾伊曼檢驗。放大因子算出來是 g = 1 / (1 + 4r·sin^2(m·dx/2))。看看它:分母永遠至少為 1,所以對 每一個 r 值,無論多大,都有 |g| ≤ 1。隱式格式是 無條件穩定 的——你想把 dt 取多大就取多大,它絕不會爆。那條 dt ≤ dx^2/(2k) 的繩子就這樣消失了。

這聽起來像免費的午餐,而誠實的修正很重要:穩定不等於精確。後向歐拉法在時間上只有 一階,意思是它的時間誤差隨 dt 縮小,而非隨 dt^2。用一個巨大的 dt,它確實保持沉穩——但它過度阻尼。那些本該快速衰減的高頻、抖動的模態被壓制得太狠;尖銳的特徵塗抹開來的速度,比真正的方程會塗抹它們的速度還快。你拿爆炸換來了一種人造的霧。對純粹的 逆向熱方程 或任何真正不適定的目標而言,這份額外的阻尼救不了場——隱式只修好格式的穩定性,從不修好問題的適定性。

克蘭克-尼科爾森法:折中切半

美妙的點子在這裡。顯式完全在舊時刻求值 u_xx;隱式完全在新時刻求值。那就 把兩者平均。取舊空間差分的一半,加上新空間差分的一半。這就是 克蘭克-尼科爾森格式,從幾何上看它是時間上的梯形法則——你以兩端點斜率的平均來推進一步,而非死守任一端。

  1. 在時間的中點寫下熱方程,也就是第 n 步與第 n+1 步正中間。在那裡取中心,正是精度的秘密。
  2. 用簡單的前向差分 (u_new - u_old)/dt 近似 u_t——這現在是對那個中點的一個 中央 差分,所以是二階精確,而非一階。
  3. 用舊層與新層中央空間差分的平均來近似 u_xx——一半舊,一半新。
  4. 把所有新層的未知數收到左邊。你又得到一個三對角線性系統,正如隱式格式,可用托馬斯演算法快速解出。

現在馮諾伊曼因子怎麼說?你得到 g = (1 - 2r·sin^2)/(1 + 2r·sin^2),這個比值的大小對每個 r 都至多為 1——所以克蘭克-尼科爾森法是 無條件穩定 的,正如隱式格式。但因為它在時間上取中心,它的 截斷誤差 同時是 O(dt^2) O(dx^2):在兩者上都是二階。你既得到隱式格式擺脫 dt ≤ dx^2 那條繩的自由, 得到隱式格式丟掉的那份精度。這個組合——無條件穩定加上二階精度——正是克蘭克-尼科爾森法成為拋物型問題預設主力的原因。

細則,以及它為何仍然有效

無條件穩定有個狡猾的陷阱,值得明說。對鋸齒狀的高頻模態,當 r 變得很大時,克蘭克-尼科爾森因子 g 趨近的是 -1 而非 0。所以一個尖銳的高頻抖動不會被阻尼——它幾乎以全振幅存活,同時每步翻轉一次正負號,在陡峭的鋒面或不連續的初始跳躍附近產生衰減卻振盪的漣漪。格式是穩定的(沒有東西爆掉),看起來卻可能很醜。藥方很溫和:先走幾步強阻尼的後向歐拉以殺掉最壞的模態,再切換到克蘭克-尼科爾森——這就是著名的 Rannacher 啟動法。

退一步,留意更深一層的教訓,那不過是上一篇的 拉克斯等價定理 在盡它的本分。這裡的每個格式都是 相容 的——當 dt, dx → 0 時各自都化歸為 u_t = k u_xx。所以對一個適定的線性問題,收斂與否完全繫於穩定性。顯式格式只在 r ≤ 1/2 之內收斂;隱式與克蘭克-尼科爾森格式對任何 r 都收斂。因此挑選一個格式,問的不是它原則上是否收斂,而是你想要哪一種取捨:每步的成本,對上你被迫取的 dt 有多小;以及一階的沉穩,對上二階的銳利。