顯式和隱式方法

顯式方法（explicit method）和隱式方法（implicit methods）是数值分析中計算以時間為自變數的常微分方程和偏微分方程的數值近似法，也是偏微分方程中计算机模拟會使用的方法。顯式方法會用系統目前的狀態來計算下一個時間的狀態，隱式方法會將系統目前狀態和下一個時間的狀態以方程式的方式表示，下一個時間的狀態為未知數，求解方程式來得到下一個時間的狀態。考慮數學的型式，若 Y ( t ) {\displaystyle Y(t)} 是目前系統狀態， Y ( t + Δ t ) {\displaystyle Y(t+\Delta t)} 是下一個時間的狀態（ Δ t {\displaystyle \Delta t} 是很小的時間間隔），在顯式方法下，下一個時間的狀態為 Y ( t + Δ t ) = F ( Y ( t ) ) {\displaystyle Y(t+\Delta t)=F(Y(t))\,} 在隱式方法下，下一個時間的狀態可用以下方程來表示 G ( Y ( t ) , Y ( t + Δ t ) ) = 0 ( 1 ) {\displaystyle G{\Big (}Y(t),Y(t+\Delta t){\Big )}=0\qquad (1)\,} 需求解方程才能得到下一個時間的狀態。 隱式方法需要針對方程式求解，需要額外的計算，也比較不容易實現。顯式方法比較容易實現，但許多問題屬於刚性方程，為了要使其誤差限制在一定範圍內（和数值稳定性有關），需要非常小的 Δ t {\displaystyle \Delta t} 。這類的問題，若要得到相同的精度，可以用隱式方法，選取較大的時間間隔，就算將隱式方法需要在每一步針對方程式(1)的求解考慮在內，隱式方法仍可以在較少的運算量下得到結果。因此，要用隱式方法或是顯式方法求解需視問題而定。隱式方法無法用在每一種微分運算子上，因此有時會用所謂的運算子分離法（operator splitting method），將微分算子改寫為兩種互補算子的結合 Y ( t + Δ t ) = F ( Y ( t + Δ t ) ) + G ( Y ( t ) ) , {\displaystyle Y(t+\Delta t)=F(Y(t+\Delta t))+G(Y(t)),\,} 一個是顯式的，另一個則是隱式的。 一般的應用會讓隱式項是線性的，而顯式項可以為非線性。這種組合稱為「隱式－顯式方法」（Implicit-Explicit Method），簡稱IMEX。 考慮常微分方程 d y d t = − y 2 ,   t ∈ [ 0 , a ] ( 2 ) {\displaystyle {\frac {dy}{dt}}=-y^{2},\ t\in [0,a]\quad \quad (2)} 初始條件是 y ( 0 ) = 1 {\displaystyle y(0)=1} 。考慮格點 t k = a k n {\displaystyle t_{k}=a{\frac {k}{n}}} ，0 ≤ k ≤ n，意思是，時間間隔是 Δ t = a / n , {\displaystyle \Delta t=a/n,} ，且 y k = y ( t k ) {\displaystyle y_{k}=y(t_{k})} 。用最簡單的顯式和隱式方法將此方程式离散化，分別是「前向歐拉方法」及「後向歐拉方法」，並且比較其差異。 前向歐拉方法 前向欧拉方法 ( d y d t ) k ≈ y k + 1 − y k Δ t = − y k 2 {\displaystyle \left({\frac {dy}{dt}}\right)_{k}\approx {\frac {y_{k+1}-y_{k}}{\Delta t}}=-y_{k}^{2}} 可得 y k + 1 = y k − Δ t y k 2 ( 3 ) {\displaystyle y_{k+1}=y_{k}-\Delta ty_{k}^{2}\quad \quad \quad (3)\,} 對所有 k = 0 , 1 , … , n . {\displaystyle k=0,1,\dots ,n.} ，這是 y k + 1 {\displaystyle y_{k+1}} 的顯式公式。 後向歐拉方法 用後向歐拉方法（英语：backward Euler method） y k + 1 − y k Δ t = − y k + 1 2 {\displaystyle {\frac {y_{k+1}-y_{k}}{\Delta t}}=-y_{k+1}^{2}} 可以得到 y k + 1 {\displaystyle y_{k+1}} 的隱式方程 y k + 1 + Δ t y k + 1 2 = y k {\displaystyle y_{k+1}+\Delta ty_{k+1}^{2}=y_{k}} 比較上式和公式(3)，公式(3)的 y k + 1 {\displaystyle y_{k+1}} 可以直接求得，而此處是方程式中的未知數，需要求解。 這是一元二次方程，有一個正根和一個負根，因為其初值為正，選擇其正根，則下一步的 y {\displaystyle y} 為 y k + 1 = − 1 + 1 + 4 Δ t y k 2 Δ t . ( 4 ) {\displaystyle y_{k+1}={\frac {-1+{\sqrt {1+4\Delta ty_{k}}}}{2\Delta t}}.\quad \quad (4)} 大部份的隱式方程中，要求解的方程會比一元二次方程複雜的多，也有可能不存在解析解，因此需要用其他求根算法（例如牛顿法）來求得數值解。 克兰克－尼科尔森方法 用克兰克－尼科尔森方法 y k + 1 − y k Δ t = − 1 2 y k + 1 2 − 1 2 y k 2 {\displaystyle {\frac {y_{k+1}-y_{k}}{\Delta t}}=-{\frac {1}{2}}y_{k+1}^{2}-{\frac {1}{2}}y_{k}^{2}} 可以求得 y k + 1 {\displaystyle y_{k+1}} 的隱式方程 y k + 1 + 1 2 Δ t y k + 1 2 = y k − 1 2 Δ t y k 2 {\displaystyle y_{k+1}+{\frac {1}{2}}\Delta ty_{k+1}^{2}=y_{k}-{\frac {1}{2}}\Delta ty_{k}^{2}} 這可以用求根算法（例如牛顿法）來求得 y k + 1 {\displaystyle y_{k+1}} 的數值解。 克兰克－尼科尔森方法可以視為是通用的IMEX（Implicit-Explicit，隱式-顯式）架構。 前向-後向歐拉方法 為了應用IMEX架構，考慮另一個微分方程: d y d t = y − y 2 ,   t ∈ [ 0 , a ] ( 5 ) {\displaystyle {\frac {dy}{dt}}=y-y^{2},\ t\in [0,a]\quad \quad (5)} 可以得到 ( d y d t ) k ≈ y k + 1 − y k 2 ,   t ∈ [ 0 , a ] {\displaystyle \left({\frac {dy}{dt}}\right)_{k}\approx y_{k+1}-y_{k}^{2},\ t\in [0,a]} 因此 y k + 1 = y k ( 1 − y k Δ t ) 1 − Δ t ( 6 ) {\displaystyle y_{k+1}={\frac {y_{k}(1-y_{k}\Delta t)}{1-\Delta t}}\quad \quad (6)} 針對 k = 0 , 1 , … , n {\displaystyle k=0,1,\dots ,n} Courant–Friedrichs–Lewy條件（英语：Courant–Friedrichs–Lewy condition） SIMPLE算法，壓力耦合方程組的半隱式方法 U.M. Ascher, S.J. Ruuth, R.J. Spiteri: Implicit-Explicit Runge-Kutta Methods for Time-Dependent Partial Differential Equations （页面存档备份，存于互联网档案馆）, Appl Numer Math, vol. 25(2-3), 1997 L.Pareschi, G.Russo: Implicit-Explicit Runge-Kutta schemes for stiff systems of differential equations, Recent Trends in Numerical Analysis, Vol. 3, 269-289, 2000