查看“︁顯式和隱式方法”︁的源代码
←
顯式和隱式方法
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
'''顯式方法'''(explicit method)和'''隱式方法'''(implicit methods)是[[数值分析]]中計算以時間為自變數的[[常微分方程]]和[[偏微分方程]]的數值近似法,也是[[偏微分方程]]中[[计算机模拟]]會使用的方法。'''顯式方法'''會用系統目前的狀態來計算下一個時間的狀態,'''隱式方法'''會將系統目前狀態和下一個時間的狀態以方程式的方式表示,下一個時間的狀態為未知數,求解方程式來得到下一個時間的狀態。考慮數學的型式,若<math>Y(t)</math>是目前系統狀態,<math>Y(t+\Delta t)</math>是下一個時間的狀態(<math>\Delta t</math>是很小的時間間隔),在顯式方法下,下一個時間的狀態為 : <math>Y(t+\Delta t) = F(Y(t))\,</math> 在隱式方法下,下一個時間的狀態可用以下方程來表示 : <math>G\Big(Y(t), Y(t+\Delta t)\Big)=0 \qquad (1)\,</math> 需求解方程才能得到下一個時間的狀態。 隱式方法需要針對方程式求解,需要額外的計算,也比較不容易實現。顯式方法比較容易實現,但許多問題屬於[[刚性方程]],為了要使其誤差限制在一定範圍內(和[[数值稳定性]]有關),需要非常小的<math>\Delta t</math>。這類的問題,若要得到相同的精度,可以用隱式方法,選取較大的時間間隔,就算將隱式方法需要在每一步針對方程式(1)的求解考慮在內,隱式方法仍可以在較少的運算量下得到結果。因此,要用隱式方法或是顯式方法求解需視問題而定。隱式方法無法用在每一種微分運算子上,因此有時會用所謂的運算子分離法(operator splitting method),將微分算子改寫為兩種互補算子的結合 :<math>Y(t+\Delta t) = F(Y(t+\Delta t))+G(Y(t)),\,</math> 一個是顯式的,另一個則是隱式的。 一般的應用會讓隱式項是線性的,而顯式項可以為非線性。這種組合稱為「隱式-顯式方法」(Implicit-Explicit Method),簡稱IMEX<ref>U.M. Ascher, S.J. Ruuth, R.J. Spiteri: ''[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48.1525&rep=rep1&type=pdf Implicit-Explicit Runge-Kutta Methods for Time-Dependent Partial Differential Equations] {{Wayback|url=http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48.1525&rep=rep1&type=pdf |date=20220702235902 }}'', Appl Numer Math, vol. 25(2-3), 1997</ref><ref>L.Pareschi, G.Russo: ''[https://www.researchgate.net/profile/Lorenzo_Pareschi/publication/230865813_Implicit-Explicit_Runge-Kutta_schemes_for_stiff_systems_of_differential_equations/links/0046352a03ba3ee92a000000.pdf Implicit-Explicit Runge-Kutta schemes for stiff systems of differential equations]'', Recent Trends in Numerical Analysis, Vol. 3, 269-289, 2000</ref>。 ==用前向歐拉方法和後向歐拉方法的說明== 考慮[[常微分方程]] : <math>\frac{dy}{dt} = -y^2, \ t\in [0, a]\quad \quad (2)</math> 初始條件是<math>y(0)=1</math>。考慮格點<math>t_k=a\frac{k}{n}</math>,0 ≤ ''k'' ≤ ''n'',意思是,時間間隔是<math>\Delta t=a/n,</math>,且<math>y_k=y(t_k)</math>。用最簡單的顯式和隱式方法將此方程式[[离散化]],分別是「前向歐拉方法」及「後向歐拉方法」,並且比較其差異。 ;前向歐拉方法: [[File:Result of applying integration schemes.png|thumb|用不同的積分法所得的結果<math> y'=-y^2, \; t\in[0, 5], \; y_0=1 </math>,<math>\Delta t = 5/10</math>.]] 前向[[欧拉方法]] :<math>\left(\frac{dy}{dt}\right)_k \approx \frac{y_{k+1}-y_k}{\Delta t} = - y_k^2</math> 可得 : <math>y_{k+1}=y_k-\Delta t y_k^2 \quad \quad \quad(3)\, </math> 對所有<math>k=0, 1, \dots, n.</math>,這是<math>y_{k+1}</math>的顯式公式。 ;後向歐拉方法: 用{{le|後向歐拉方法|backward Euler method}} :<math>\frac{y_{k+1}-y_k}{\Delta t} = - y_{k+1}^2</math> 可以得到<math>y_{k+1}</math>的隱式方程 : <math>y_{k+1}+\Delta t y_{k+1}^2=y_k</math> 比較上式和公式(3),公式(3)的<math>y_{k+1}</math>可以直接求得,而此處是方程式中的未知數,需要求解。 這是[[一元二次方程]],有一個正[[根 (数学)|根]]和一個負根,因為其初值為正,選擇其正根,則下一步的<math>y</math>為 : <math>y_{k+1}=\frac{-1+\sqrt{1+4\Delta t y_k}}{2 \Delta t}. \quad \quad (4)</math> 大部份的隱式方程中,要求解的方程會比一元二次方程複雜的多,也有可能不存在解析解,因此需要用其他[[求根算法]](例如[[牛顿法]])來求得數值解。 ;克兰克-尼科尔森方法: 用[[克兰克-尼科尔森方法]] :<math>\frac{y_{k+1}-y_k}{\Delta t} = -\frac{1}{2}y_{k+1}^2 -\frac{1}{2}y_{k}^2</math> 可以求得<math>y_{k+1}</math>的隱式方程 : <math>y_{k+1}+\frac{1}{2}\Delta t y_{k+1}^2=y_k - \frac{1}{2}\Delta t y_{k}^2</math> 這可以用[[求根算法]](例如[[牛顿法]])來求得<math>y_{k+1}</math>的數值解。 克兰克-尼科尔森方法可以視為是通用的IMEX('''Im'''plicit-'''Ex'''plicit,隱式-顯式)架構。 ;前向-後向歐拉方法: [[File:Comparison_between_Foward-Backward-Euler_and_Foward-Euler.png|thumb|400px|用前向歐拉方法以及前向-後向歐拉方法,在<math>a = 5</math>和<math>n = 30</math>下的結果]] 為了應用IMEX架構,考慮另一個微分方程: : <math>\frac{dy}{dt} = y-y^2, \ t\in [0, a]\quad \quad (5)</math> 可以得到 : <math>\left(\frac{dy}{dt}\right)_k \approx y_{k+1}-y_{k}^2, \ t\in [0, a]</math> 因此 : <math>y_{k+1}=\frac{y_k(1-y_k\Delta t)}{1-\Delta t} \quad\quad(6)</math> 針對<math>k=0, 1, \dots, n</math> ==相關條目== * {{le|Courant–Friedrichs–Lewy條件|Courant–Friedrichs–Lewy condition}} * [[SIMPLE算法]],壓力耦合方程組的半隱式方法 ==來源== {{reflist}} {{DEFAULTSORT:Explicit And Implicit Methods}} [[Category:数值微分方程]]
该页面使用的模板:
Template:Le
(
查看源代码
)
Template:Reflist
(
查看源代码
)
Template:Wayback
(
查看源代码
)
返回
顯式和隱式方法
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息