显式方法(explicit method)和隐式方法(implicit methods)是数值分析中计算以时间为自变数的常微分方程和偏微分方程的数值近似法,也是偏微分方程中计算机模拟会使用的方法。显式方法会用系统目前的状态来计算下一个时间的状态,隐式方法会将系统目前状态和下一个时间的状态以方程式的方式表示,下一个时间的状态为未知数,求解方程式来得到下一个时间的状态。考虑数学的型式,若
是目前系统状态,
是下一个时间的状态(
是很小的时间间隔),在显式方法下,下一个时间的状态为
![{\displaystyle Y(t+\Delta t)=F(Y(t))\,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4d72c127fbdfdfd3b11386bcc2e8b1672b59e8c4)
在隐式方法下,下一个时间的状态可用以下方程来表示
![{\displaystyle G{\Big (}Y(t),Y(t+\Delta t){\Big )}=0\qquad (1)\,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3e5330e3b71d7ad310f18f2eeb4412429e873228)
需求解方程才能得到下一个时间的状态。
隐式方法需要针对方程式求解,需要额外的计算,也比较不容易实现。显式方法比较容易实现,但许多问题属于刚性方程,为了要使其误差限制在一定范围内(和数值稳定性有关),需要非常小的
。这类的问题,若要得到相同的精度,可以用隐式方法,选取较大的时间间隔,就算将隐式方法需要在每一步针对方程式(1)的求解考虑在内,隐式方法仍可以在较少的运算量下得到结果。因此,要用隐式方法或是显式方法求解需视问题而定。隐式方法无法用在每一种微分运算子上,因此有时会用所谓的运算子分离法(operator splitting method),将微分算子改写为两种互补算子的结合
![{\displaystyle Y(t+\Delta t)=F(Y(t+\Delta t))+G(Y(t)),\,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ed85c7aec208d36ec5081ed6e32951a273cafa61)
一个是显式的,另一个则是隐式的。
一般的应用会让隐式项是线性的,而显式项可以为非线性。这种组合称为“隐式-显式方法”(Implicit-Explicit Method),简称IMEX[1][2]。
用前向欧拉方法和后向欧拉方法的说明[编辑]
考虑常微分方程
![{\displaystyle {\frac {dy}{dt}}=-y^{2},\ t\in [0,a]\quad \quad (2)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2da9a469600ad22b47c72ac29e5705592594d712)
初始条件是
。考虑格点
,0 ≤ k ≤ n,意思是,时间间隔是
,且
。用最简单的显式和隐式方法将此方程式离散化,分别是“前向欧拉方法”及“后向欧拉方法”,并且比较其差异。
- 前向欧拉方法
用不同的积分法所得的结果
,
.
前向欧拉方法
![{\displaystyle \left({\frac {dy}{dt}}\right)_{k}\approx {\frac {y_{k+1}-y_{k}}{\Delta t}}=-y_{k}^{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/fb190a30c0d2c1c54ecce5c90f6c4fc47f230be9)
可得
![{\displaystyle y_{k+1}=y_{k}-\Delta ty_{k}^{2}\quad \quad \quad (3)\,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b24c1b94912ed9ce399e525cb2515d99919eeac0)
对所有
,这是
的显式公式。
- 后向欧拉方法
用后向欧拉方法
![{\displaystyle {\frac {y_{k+1}-y_{k}}{\Delta t}}=-y_{k+1}^{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c6880005e4edbd152fb000fccf08402598f796aa)
可以得到
的隐式方程
![{\displaystyle y_{k+1}+\Delta ty_{k+1}^{2}=y_{k}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1a532577bd507992b1e907a4e6f4a0e8c8cf28a5)
比较上式和公式(3),公式(3)的
可以直接求得,而此处是方程式中的未知数,需要求解。
这是一元二次方程,有一个正根和一个负根,因为其初值为正,选择其正根,则下一步的
为
![{\displaystyle y_{k+1}={\frac {-1+{\sqrt {1+4\Delta ty_{k}}}}{2\Delta t}}.\quad \quad (4)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ddf2b7fddb89a94238e60b7939ecdb8eb05531ec)
大部份的隐式方程中,要求解的方程会比一元二次方程复杂的多,也有可能不存在解析解,因此需要用其他求根算法(例如牛顿法)来求得数值解。
- 克兰克-尼科尔森方法
用克兰克-尼科尔森方法
![{\displaystyle {\frac {y_{k+1}-y_{k}}{\Delta t}}=-{\frac {1}{2}}y_{k+1}^{2}-{\frac {1}{2}}y_{k}^{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/019284e0f6b33ff47d19feb46069558e988cd04a)
可以求得
的隐式方程
![{\displaystyle y_{k+1}+{\frac {1}{2}}\Delta ty_{k+1}^{2}=y_{k}-{\frac {1}{2}}\Delta ty_{k}^{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/497a8ceb9bb75e9578d6feb65e2bbe3616060fec)
这可以用求根算法(例如牛顿法)来求得
的数值解。
克兰克-尼科尔森方法可以视为是通用的IMEX(Implicit-Explicit,隐式-显式)架构。
- 前向-后向欧拉方法
用前向欧拉方法以及前向-后向欧拉方法,在
和
下的结果
为了应用IMEX架构,考虑另一个微分方程:
![{\displaystyle {\frac {dy}{dt}}=y-y^{2},\ t\in [0,a]\quad \quad (5)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f18ea769b80c985190a3cdd00aab67ab5e172ee8)
可以得到
![{\displaystyle \left({\frac {dy}{dt}}\right)_{k}\approx y_{k+1}-y_{k}^{2},\ t\in [0,a]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7b04b3efd989e303c961793557c8ace14d9ab2d5)
因此
![{\displaystyle y_{k+1}={\frac {y_{k}(1-y_{k}\Delta t)}{1-\Delta t}}\quad \quad (6)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/eef25f7d9bc8b0be8de4a9750c6923557d7b1de3)
针对
相关条目[编辑]
- ^ 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