Numerical Methods Using MATLAB(4版)-09-ODE

前言

這章主要介紹解決常微分方程,微分方程組合和邊值問題的方法。

學習過程

<1>初值問題 initial value problem I.V.P.

常微分方程的一般形式:\frac{dy}{dx}=f(x,y)
方程會因為初值不同有變化。

<2>Lipschitz條件

給出矩形區(qū)域R=\{(t,y):a \leq t \leq b,c \leq y \leq \},假設(shè)f(t,y)R上連續(xù),且存在一個常量L>0滿足性質(zhì)|f(t,y_1)-f(t,y_2)| \leq L|y_1-y_2|,其中任意(t,y_1),(t,y_2)∈R,那么f可以說是在R上滿足Lipschitz條件。而L也可以叫作Lipschitz常量。

為了更好的判斷,我們一般使用下面的方法。

fR上定義,如果這里存在常量L>0使得所有(t,y)∈R,|f_y(t,y)| \leq L,則fR上滿足Lipschitz條件。

如果f滿足Lipschitz條件且有初值,那么y'=f(t,y)在子區(qū)間t_0 \leq t \leq t_0+\delta上有唯一解y=y(t)。

<3>Euler法

微分方程不總是那么容易求解的,為此,我們會在接下來提出很多方法來求解,其中之一就是Euler法。但是Euler法實際上使用是有限的因為它有很大誤差,但它具有教育意義。
我們提出一個函數(shù)滿足初值問題I.V.P.,即在區(qū)間[a,b]下 ,y'=f(t,y),y(a)=y_0。在我們無法找出函數(shù)y=y(t)的情況下,我們可以找出一系列點來逼近函數(shù)。
設(shè)h=\frac{b-a}{M},我們將區(qū)間分為M個子區(qū)間,并假設(shè)y(t),y'(t)y''(t)在區(qū)域連續(xù),然后使用泰勒定理,我們可以得到以下公式:
y(t)=y(t_0)+y'(t_0)(t-t_0)+\frac{y''(c_1)(t-t_0)^2}{2}.
t_1代入,且h十分小時,二次項可以忽略不計,公式就會變?yōu)椋?br> y_1=y_0+hf(t_0,y_0).
遞推下去就是:
y_{k+1}=y_k+hf(t_k,y_k),k=0,1,...,M-1.
這就是Euler法。

我們把微分方程求解的方法叫做微分方法或者是離散變量方法。這些方法都是找出一系列逼近函數(shù)的離散點集。其中一步法有這種形式y_{k+1}=y_k+h\Phi (t_k,y_k)\Phi叫做增量函數(shù)。
當使用這種離散變量方法來求解初值問題時,誤差會有兩種來源:離散化,四舍五入。

假設(shè)點集\{(t_k,y_k)\}_{k=0}^M,初值問題有唯一解y=y(t)
全局離散誤差:e_k=y(t_k)-y_k,k=0,1,...,M.
局部離散誤差:\epsilon_{k+1}=y(t_{k+1})-y_k-h\Phi(t_k,y_k),k=0,1,...,M-1.

Euler法中,在滿足以上初值問題條件,且y(t)∈C^2[t_0,b]時,有:
|e_k|=|y(t_k)-y_k|=O(h),

|\epsilon_{k+1}|=|y(t_{k+1})-y_k-hf(t_k,y_k)|=O(h^2).

最終全局誤差F.G.E. =E(y(b),h)=|y(b)-y_M|=O(h).

<4>Heun法

我們使用積分的方法來解決初值問題。一開始有\int_{t_0}^{t_1}f(t,y(t))dt=y(t_1)-y(t_0)。于是我們利用梯形規(guī)則假設(shè)y(t_1)\approx y(t_0)+\frac{h}{2}(f(t_0,y(t_0))+f(t_1,y(t_1)))。再結(jié)合Euler法。
即Heun法為:
p_{k+1}=y_k+hf(t_k,y_k),t_{k+1}=t_k+h,

y_{k+1}=y_k+\frac{h}{2}(f(t_k,y_k)+f(t_{k+1},p_{k+1})).

Heun法中,在滿足以上初值問題條件,且y(t)∈C^3[t_0,b]時,有:
|e_k|=|y(t_k)-y_k|=O(h^2),

|\epsilon_{k+1}|=|y(t_{k+1})-y_k-h\Phi(t_k,y_k)|=O(h^3).

最終全局誤差F.G.E. =E(y(b),h)=|y(b)-y_M|=O(h^2).

<5>泰勒序列方法

假設(shè)y(t)∈C^{N+1}[t_0,b],并且y(t)t=t_k∈[t_0,b]上有N階展開:
y(t_k+h)=y(t_k)+hT_N(t_k,y(t_k))+O(h^{N+1}),

T_N(t_k,y(t_k))=\sum_{j=1}^N\frac{y^{(j)}(t_k)}{j!}h^{j-1}

泰勒序列法中,在滿足以上初值問題條件,且y(t)∈C^{N+1}[t_0,b]時,有:
|e_k|=|y(t_k)-y_k|=O(h^N),

|\epsilon_{k+1}|=|y(t_{k+1})-y_k-hT_N(t_k,y_k)|=O(h^{N+1}).

最終全局誤差F.G.E. =E(y(b),h)=|y(b)-y_M|=O(h^N).

<6>Runge-Kutta法

在該方法中,我們假設(shè)一個區(qū)間內(nèi)再取出多個點,計算它們的加權(quán)平均斜率。并且使得它們精度和泰勒序列 前幾項一致。這個方法的好處就是不需要計算更高階的導數(shù)。
N階通式:
y_{i+1}=y_i+\Phi h,

\Phi=w_1k_1+w_2k_2+...+w_nk_n,

k_1=f(t_i,y_i),

k_2=f(t_i+p_1h,y_i+q_{11}k_1h),

k_3=f(t_i+p_2h,y_i+q_{21}k_1h+q_{22}k_2h),

k_n=f(t_i+p_{n-1}h,y_i+q_{n-1,1}k_1h+...),

w之和為1,p等于q之和。
Runge-Kutta法中,在滿足以上初值問題條件,且y(t)∈C^{5}[t_0,b]時,即4階,有:
|e_k|=|y(t_k)-y_k|=O(h^4),

|\epsilon_{k+1}|=|y(t_{k+1})-y_k-hT_N(t_k,y_k)|=O(h^{5}).

最終全局誤差F.G.E. =E(y(b),h)=|y(b)-y_M|=O(h^4).

例子:
RK4:模仿了四階泰勒
y_{k+1}=y_k+\frac{h(f_1+2f_2+2f_3+f_4)}{6},
f_1=f(t_k,y_k),
f_2=f(t_k+\frac{h}{2},y_k+\frac{h}{2}f_1),
f_3=f(t_k+\frac{h}{2},y_k+\frac{h}{2}f_2),
f_4=f(t_k+h,y_k+hf_3).
RKF45:可以知道步長越小,誤差會越小,但是這會導致大量的計算。因此我們提出了RKF45,它是找到一個恰當步長的程序。在每步中,對解的兩種不同逼近會用來比較,如果兩個解答案很近,則步長是可以接受的。如果兩個解答案準確率不太一致,則繼續(xù)縮小步長。當需要更多有效位數(shù)的解時,則增加步長。
上述的方法都是一步法。

<7>Adams-Bashforth-Moulton 法

該方法是基于積分公式來推的:
y(t_{k+1})=y(t_k)+\int_{t_k}^{t_{k+1}}f(t,y(t))dt
[t_k,t_{k+1}]內(nèi)積分。
先使用Adams-Bashforth預(yù)測,在[t_k,t_{k+1}]內(nèi)積分:
p_{k+1}=y_k+\frac{h}{24}(-9f_{k-3}+37f_{k-2}-59f_{k-1}+55f_k)
再用Adams-Moulton矯正,在[t_k,t_{k+1}]內(nèi)積分:
y_{k+1}=y_k+\frac{h}{24}(f_{k-2}-5f_{k-1}+19f_k+9f_{k+1})
其中預(yù)測和矯正的誤差都是O(h^5)。

當需要更精確時,就縮小步長,而縮小步長,就需要新的初始值。

<8>Milne-Simpson法

該方法是基于積分公式來推的:
y(t_{k+1})=y(t_{k-3})+\int_{t_{k-3}}^{t_{k+1}}f(t,y(t))dt
[t_{k-3},t_{k+1}]內(nèi)積分。
先使用Milne預(yù)測,在[t_{k-3},t_{k+1}]內(nèi)積分:
p_{k+1}=y_{k-3}+\frac{4h}{3}(2f_{k-2}-f_{k-1}+2f_k)
再用Simpson矯正,在[t_{k-1},t_{k+1}]內(nèi)積分:
y_{k+1}=y_{k-1}+\frac{h}{3}(f_{k-1}+4f_{k}+f_{k+1})
其中預(yù)測和矯正的誤差都是O(h^5)。

<9>微分方程組

在本小節(jié),我們考慮到以下的初值問題:
\begin{cases}\frac{dx}{dt}=f(t,x,y) \\ \frac{dy}{dt}=g(t,x,y)\end{cases} with \begin{cases}x(t_0)=x_0 \\ y(t_0)=y_0\end{cases}
如果使用Euler法來解決這個問題的話,有:
dx=f(t,x,y)dt,dy=g(t,x,y)dt
其中dt=t_{k+1}-t_k,dx=x_{k+1}-x_k,dy=y_{k+1}-y_k
于是,
x_{k+1}-x_k \approx f(t_k,x_k,y_k)(t_{k+1}-t_k)
y_{k+1}-y_k \approx g(t_k,x_k,y_k)(t_{k+1}-t_k)
分為步長為hM個子區(qū)間后,
t_{k+1}=t_k+h
x_{k+1}=x_k+hf(t_k,x_k,y_k)
y_{k+1}=y_k+hg(t_k,x_k,y_k),k=0,1,...,M-1
遇到更高階的微分方程組時,我們可以設(shè)置多個未知量對應(yīng)不同階的導數(shù),相當于n維求歐拉公式。在這里,龍格庫塔公式也是可以的,一般4階的效果比較好。

<10>邊值問題

<11>初值問題

詞匯學習

modification 修改
trajectory 彈道
conjecture 推測
interpretation 解釋
mesh 網(wǎng)眼
discrete 離散的
increment 增量
predominate 占主導地位
trapezoidal 梯形的
trade-off 交易
elaborate 詳盡的
omit 忽略

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容