Euler(欧拉)方法 | 显示Euler格式、隐式Euler格式、两步Euler格式、改进的Euler格式


微分方程初值问题的数值解法,就是将一个连续的微分方程初值问题转化为一个离散的差分方程初值问题,然后通过解差分方程而获得其数值解。即:对自变量的一系列离散节点

xk(k=0,1,2,??,n??)x_k(k=0,1,2,\cdots,n\cdots)

xk?(k=0,1,2,?,n?),计算出去精确解

y(xk)y(x_k)

y(xk?)的近似值

yk(k=1,2,??,n,??)y_k(k=1,2,\cdots,n,\cdots)

yk?(k=1,2,?,n,?),(其中

y0y_0

y0?是准确值)从而得到函数

y=y(x)y=y(x)

y=y(x)的近似数值解

yk(k=1,2,??,n,??)y_k(k=1,2,\cdots,n,\cdots)

yk?(k=1,2,?,n,?)

关于微分方程解的存在性与惟一性,有下面的定理:

定理1:对于一阶常微分方程初值问题:

{y(x)=f(x,y)x[a,b]y(x0)=y0(1)
\begin{cases}
y'(x)=f(x,y) \quad x\in[a,b] \\
y(x_0)=y_0
\end{cases} \tag{1}

{y′(x)=f(x,y)x∈[a,b]y(x0?)=y0??(1)
如果

f(x,y)f(x,y)

f(x,y)对x连续,且关于y满足Lipschitz(李普希兹)条件,即存在常数

L>0L>0

L>0,使得

f(x,y1)?f(x,y2)Ly1?y2
|f(x,y_1)-f(x,y_2)|\leq L|y_1-y_2|

∣f(x,y1?)?f(x,y2?)∣≤L∣y1??y2?∣
对所有

x[a,b]x\in [a,b]

x∈[a,b]以及任何实数

y1,y2y_1,y_2

y1?,y2?均成立,则初值问题在

[a,b][a,b]

[a,b]上有惟一解。

Euler(欧拉)方法

将微分方程(1)转化成差分方程,有几何方法、数值微分、数值积分和Taylor(泰勒)展开法等数值方法,这些方法将在推导微分方程的各种数值解法时得到具体运用。

1. 显示Euler格式

从导数的定义可知,当步长

h=xn+1?xn0h=x_{n+1}-x_n \to 0

h=xn+1??xn?→0时,有:

y(x)=limΔx0ΔyΔx=limΔx0f(x+Δx)?f(x)Δx?y(xn+1)?y(xn)xn+1?xn(2)
y'(x)=lim_{\Delta x\to 0}\frac{\Delta y}{\Delta x}=lim_{\Delta x\to 0}\frac{f(x+\Delta x)-f(x)}{\Delta x}\cong \frac{y(x_{n+1})-y(x_n)}{x_{n+1}-x_n} \tag{2}

y′(x)=limΔx→0?ΔxΔy?=limΔx→0?Δxf(x+Δx)?f(x)??xn+1??xn?y(xn+1?)?y(xn?)?(2)
(2)式右边是导数的近似差商表示。因此,如果向前差商、向后差商和中心差商分别代替微分方程(1)中的导数项

y(x)y'(x)

y′(x),则可相应地导出Euler方法的各种格式。

  1. 显示Euler格式

若用在

xnx_n

xn?点的向前差商

y(xn+1)?y(xn)xn+1?xn\frac{y(x_{n+1})-y(x_n)}{x_{n+1}-x_n}

xn+1??xn?y(xn+1?)?y(xn?)?代替微分方程(1)的导数项

y(xn)y'(x_n)

y′(xn?),当

h=xn+1?xnh=x_{n+1}-x_n

h=xn+1??xn?很小时,则有:

y(xn+1)?y(xn)h=f(xn,y(xn))
\frac{y(x_{n+1})-y(x_n)}{h}=f(x_n,y(x_n))

hy(xn+1?)?y(xn?)?=f(xn?,y(xn?))
若将

y(xn)y(x_n)

y(xn?)的近似值

yny_n

yn?代入上式右端,并将计算结果记为

yn+1y_{n+1}

yn+1?,则有:

yn+1=yn+hf(xn,yn)(n=0,1,2,??)(3)
y_{n+1}=y_n+hf(x_n,y_n) \quad (n=0,1,2,\cdots) \tag{3}

yn+1?=yn?+hf(xn?,yn?)(n=0,1,2,?)(3)
这样就得到了

y(xn+1)y(x_{n+1})

y(xn+1?)的近似值

yn+1y_{n+1}

yn+1?的递推格式,即所谓的显示Euler格式。

若给出初始条件

y(x0)=y0y(x_0)=y_0

y(x0?)=y0?,则按此(3)式可逐步算出

y1,y2,??,y_1,y_2,\cdots,

y1?,y2?,?,即:

y1=y0+hy0=y0+hf(x0,y0)y2=y1+hf(x1,y1)?yn=yn?1+hf(xn?1,yn?1)
y_1=y_0+hy_0'=y_0+hf(x_0,y_0) \\
y_2=y_1+hf(x_1,y_1) \\
\cdots \\
y_n=y_{n-1}+hf(x_{n-1},y_{n-1})

y1?=y0?+hy0′?=y0?+hf(x0?,y0?)y2?=y1?+hf(x1?,y1?)?yn?=yn?1?+hf(xn?1?,yn?1?)
这样就得了函数

y=y(x)y=y(x)

y=y(x)在离散节点的函数近似值。

显示Euler格式也可以用Taylor展开法得到。

将函数

y=y(x)y=y(x)

y=y(x)在

xn+1x_{n+1}

xn+1?点的值

y(xn+1)y(x_{n+1})

y(xn+1?)展开为关于

xnx_n

xn?点的Taylor级数,即:

y(xn+1)=y(xn)+hy(xn)+h22y(?)xn<?
y(x_{n+1})=y(x_n)+hy'(x_n)+\frac{h^2}{2}y''(\epsilon) \quad x_n<\epsilon

y(xn+1?)=y(xn?)+hy′(xn?)+2h2?y′′(?)xn? 略去余项,得:

y(xn+1)?y(xn)+hy(xn)=y(xn)+hf[xn,y(xn)]
y(x_{n+1})\cong y(x_n)+hy'(x_n)=y(x_n)+hf[x_n,y(x_n)]

y(xn+1?)?y(xn?)+hy′(xn?)=y(xn?)+hf[xn?,y(xn?)]

y(xn)y(x_n)

y(xn?)用近似值

yny_n

yn?代替,就得到

y(xn+1)y(x_{n+1})

y(xn+1?)的近似值

yn+1y_{n+1}

yn+1?,即:

yn+1=yn+hf(xn,yn)
y_{n+1}=y_n+hf(x_n,y_n)

yn+1?=yn?+hf(xn?,yn?)
上面就是显示Euler格式。

  1. 显示Euler格式的截断误差

为了确定显示Euler格式的计算误差,先引入微分方程数值解法的整体截断误差和局部截断误差的概念。

定义1:以某种数值方法求解满足Lipschitz条件的微分方程(1)时,如果产生惟一的逼近序列

{yn}\{y_n\}

{yn?},则称误差

En=y(xn)?yn(n=0,1,2,,N)E_n=y(x_n)-y_n(n=0,1,2,\dots,N)

En?=y(xn?)?yn?(n=0,1,2,…,N)为该数值方法的整体截断误差。

定义2:在假设

yny_n

yn?是准确的即

yn=y(xn)y_n=y(x_n)

yn?=y(xn?)前提下,称用某种数值方法计算

yn+1y_{n+1}

yn+1?的误差

en+1=y(xn+1)?yn+1e_{n+1}=y(x_{n+1})-y_{n+1}

en+1?=y(xn+1?)?yn+1?为该数值方法在计算

yn+1y_{n+1}

yn+1?时的局部截断误差。

定义3:若某种数值方法的局部截断误差为

O(hp+1)O(h^{p+1})

O(hp+1),则称该数值方法的阶数为p。

显示Euler公式产生的局部截断误差可以用Taylor级数分析。

假设

yn=y(xn)y_n=y(x_n)

yn?=y(xn?),将函数

y=y(x)y=y(x)

y=y(x)在

xn+1x_{n+1}

xn+1?点的解析值

y(xn+1)y(x_{n+1})

y(xn+1?)展开为关于

xnx_n

xn?点的Taylor级数:

y(xn+1)=y(xn)+hy(xn)+h22y(?),xn<?<xn+1
y(x_{n+1})=y(x_n)+hy'(x_n)+\frac{h^2}{2}y''(\epsilon), \quad x_n<\epsilon

y(xn+1?)=y(xn?)+hy′(xn?)+2h2?y′′(?),xn?

yn+1=yn+hf(xn,yn)=y(xn)+hf(xn,y(xn))=y(xn)+hyn
y_{n+1}=y_n+hf(x_n,y_n)=y(x_n)+hf(x_n,y(x_n))=y(x_n)+hy_n'

yn+1?=yn?+hf(xn?,yn?)=y(xn?)+hf(xn?,y(xn?))=y(xn?)+hyn′?
两式相减,得:

y(xn+1)?yn+1=h22y(?)=O(h2)
y(x_{n+1})-y_{n+1}=\frac{h^2}{2}y''(\epsilon)=O(h^2)

y(xn+1?)?yn+1?=2h2?y′′(?)=O(h2)
可见,显示Euler格式只有一阶精度,其局部截断误差与步长的平方成正比。显然局部截断误差随着计算步距h的减小而减小,但是h过小并不利于计算精度,因为步距减小之后,计算次数会增加,必然导致舍入误差的增加。当舍入误差不可忽视时,计算就可能出现不稳定现象或者出现结果发散现象。

  1. 显示Euler格式的几何意义

从几何上看,

y(x)=f(x,y)y'(x)=f(x,y)

y′(x)=f(x,y)相当于在

x,yx,y

x,y平面上规定了一个方向场。以

y=(x?y)/2y'=(x-y)/2

y′=(x?y)/2为例,作出其矩形区域

R={(x,y):0x5,0y4}R=\{(x,y):0\leq x\leq 5,0\leq y\leq 4\}

R={(x,y):0≤x≤5,0≤y≤4}的方向场。如下图所示,若果

y(0)=1y(0)=1

y(0)=1,则

y(x)=3e?x2?2+xy(x)=3e^{-\frac{x}{2}}-2+x

y(x)=3e?2x??2+x;如果

y(0)=4y(0)=4

y(0)=4,则

y(x)=6e?x2?2+xy(x)=6e^{-\frac{x}{2}}-2+x

y(x)=6e?2x??2+x。从图中可以看出,曲线在每一点的切线和方向场的方向相同。

可见,从点

(x0,y0)(x_0,y_0)

(x0?,y0?)开始,用该点的斜率

f(x0,y0)f(x_0,y_0)

f(x0?,y0?)和步长h可以得到点

(x1,y1)(x_1,y_1)

(x1?,y1?),接着用点

(x1,y1)(x_1,y_1)

(x1?,y1?)的斜率

f(x1,y1)f(x_1,y_1)

f(x1?,y1?)和步长h可以得到点

(x2,y2)(x_2,y_2)

(x2?,y2?),照此做下去,可以得到更多的点

(x3,y3),(x4,y4),?(x_3,y_3),(x_4,y_4),\cdots

(x3?,y3?),(x4?,y4?),?。这些点组成了一条折线,它与解曲线并不重合(点

(x0,y0)(x_0,y_0)

(x0?,y0?)除外),是解曲线的近似,如下图所示。

2. 隐式Euler格式

  1. 隐式Euler格式

若用在

xn+1x_{n+1}

xn+1?点(不是在

xnx_n

xn?点)的向后差商

y(xn+1)?y(xn)xn+1?xn\frac{y(x_{n+1})-y(x_n)}{x_{n+1}-x_n}

xn+1??xn?y(xn+1?)?y(xn?)?代替微分方程(1)的导数项

y(xn+1)y'(x_{n+1})

y′(xn+1?),当

h=xn+1?xnh=x_{n+1}-x_n

h=xn+1??xn?很小时,则有:

y(xn+1)?y(xn)h=f(xn+1,y(xn+1))
\frac{y(x_{n+1})-y(x_n)}{h}=f(x_{n+1},y(x_{n+1})) \\

hy(xn+1?)?y(xn?)?=f(xn+1?,y(xn+1?))
这样可得:

yn+1=yn+hf(xn+1,yn+1),(n=0,1,2,??)
y_{n+1}=y_n+hf(x_{n+1},y_{n+1}), \quad (n=0,1,2,\cdots)

yn+1?=yn?+hf(xn+1?,yn+1?),(n=0,1,2,?)
由于等式的两端都同时有

yn+1y_{n+1}

yn+1?,故称为隐式Euler格式。

隐式Euler格式也只有一阶精度,但数值稳定性比显示Euler格式要好。通常采用迭代法(逐次代换法)来求解,使其逐步显示化。该方法的优点是:绝对稳定;如果解析解为正,则可以保证计算结果(数值解)也为正。

  1. 预报-校正法

如果导函数为

f(x,y)=φ(x)+yf(x,y)=\varphi(x)+y

f(x,y)=φ(x)+y或

f(x,y)=y?φ(x)f(x,y)=y·\varphi(x)

f(x,y)=y?φ(x)等形式时,则该微分方程的隐式Euler格式可以转化为显示Euler格式。即:

yn+1=yn+hf(xn+1,yn+1)=yn+h[φ(xn+1)+yn+1]
y_{n+1}=y_n+hf(x_{n+1},y_{n+1})=y_n+h[\varphi(x_{n+1})+y_{n+1}]

yn+1?=yn?+hf(xn+1?,yn+1?)=yn?+h[φ(xn+1?)+yn+1?]

yn+1=[yn+hφ(xn+1)]/(1?h)
y_{n+1}=[y_n+h\varphi(x_{n+1})]/(1-h)

yn+1?=[yn?+hφ(xn+1?)]/(1?h)

但在一般情况下,要应用隐式Euler格式,应该采用预报-校正法。即:

先用显示Euler格式预报

yn+1y_{n+1}

yn+1?,得到近似值:

yn+1=yn+hf(xn,yn)(n=0,1,2,??)(4a)
\overline y_{n+1}=y_n+hf(x_n,y_n) \quad (n=0,1,2,\cdots) \tag{4a}

y?n+1?=yn?+hf(xn?,yn?)(n=0,1,2,?)(4a)
再用隐式Euler格式校正

yn+1\overline y_{n+1}

y?n+1?,得到较为准确的值:

yn+1=yn+hf(xn+1,yn+1)(n=0,1,2,??)(4b)
y_{n+1}=y_n+hf(x_{n+1},\overline y_{n+1}) \quad (n=0,1,2,\cdots) \tag{4b}

yn+1?=yn?+hf(xn+1?,y?n+1?)(n=0,1,2,?)(4b)
(4)式称为预报-校正法。

3. 两步Euler格式

为了提高精度,改用在

xnx_n

xn?点的中心差商

[y(xn+1)?y(xn?1)]/(2h)[y(x_{n+1})-y(x_{n-1})]/(2h)

[y(xn+1?)?y(xn?1?)]/(2h)代替微分方程(1)即

y(xn)=f(xn,y(xn))y'(x_n)=f(x_n,y(x_n))

y′(xn?)=f(xn?,y(xn?))中的导数项,得:

yn+1=yn?1+2hf(xn,yn)(n=1,2,??)
y_{n+1}=y_{n-1}+2hf(x_n,y_n) \quad (n=1,2,\cdots)

yn+1?=yn?1?+2hf(xn?,yn?)(n=1,2,?)
这就是两步Euler格式。在计算

yn+1y_{n+1}

yn+1?时,需要调用前两次的计算结果

yn?1y_{n-1}

yn?1?和

yny_n

yn?。

两步Euler格式的局部截断误差是:设

yn=y(xn),yn?1=y(xn?1)y_n=y(x_n),y_{n-1}=y(x_{n-1})

yn?=y(xn?),yn?1?=y(xn?1?),则有:

y(xn+1)=y(xn?1)+2hf(xn,y(xn))=y(xn?1)+2hy(xn)
y(x_{n+1})=y(x_{n-1})+2hf(x_n,y(x_n))=y(x_{n-1})+2hy'(x_n)

y(xn+1?)=y(xn?1?)+2hf(xn?,y(xn?))=y(xn?1?)+2hy′(xn?)

y=y(x)y=y(x)

y=y(x)在

xn+1x_{n+1}

xn+1?和

xn?1x_{n-1}

xn?1?点的函数值

y(xn+1)y(x_{n+1})

y(xn+1?)和

y(xn?1)y(x_{n-1})

y(xn?1?)展开为关于

xnx_n

xn?点的Taylor级数

y(xn+1)=y(xn)+hy(xn)+h22!y(xn)+h33!y(?1)xn<?1<xn+1y(xn?1)=y(xn)?hy(xn)+h22!y(xn)?h33!y(?2)xn?1<x2<xn
y(x_{n+1})=y(x_n)+hy'(x_n)+\frac{h^2}{2!}y''(x_n)+\frac{h^3}{3!}y'''(\epsilon_1) \quad x_n<\epsilon_1

y(xn+1?)=y(xn?)+hy′(xn?)+2!h2?y′′(xn?)+3!h3?y′′′(?1?)xn? 两式相减,得:

y(xn+1)=y(xn?1)+2hy(xn)+h33y(?),xn?1<?<xn+1
y(x_{n+1)}=y(x_{n-1})+2hy'(x_n)+\frac{h^3}{3}y'''(\epsilon) , \quad x_{n-1}<\epsilon< x_{n+1}

y(xn+1)?=y(xn?1?)+2hy′(xn?)+3h3?y′′′(?),xn?1? 故局部截断误差为:

yxn+1?yn+1=h33(?)=O(h3)
y(x_{n+1})-y_{n+1}=\frac{h^3}{3}(\epsilon)=O(h^3)

y(xn+1?)?yn+1?=3h3?(?)=O(h3)
可见精度提高了,即两步Euler格式具有二阶精度。

4. 改进的Euler格式

  1. 梯形格式

现用数值积分的方法求解微分方程(1)

将方程

y=f(x,y)y'=f(x,y)

y′=f(x,y)的两端从

xnx_n

xn?到

xn+1x_{n+1}

xn+1?积分,得:

xnxn+1ydx=xnxn+1f[x,y(x)]dxy(xn+1)?y(xn)=xnxn+1f[x,y(x)]dx(5)
\int_{{x_n}}^{x_{n+1}}y'dx=\int_{x_n}^{x_{n+1}}f[x,y(x)]dx \\
y(x_{n+1})-y(x_n)=\int_{x_n}^{x_{n+1}}f[x,y(x)]dx \quad (5)

∫xn?xn+1??y′dx=∫xn?xn+1??f[x,y(x)]dxy(xn+1?)?y(xn?)=∫xn?xn+1??f[x,y(x)]dx(5)
只要计算出(5)式中的积分项,就能得到

y(xn+1)y(x_{n+1})

y(xn+1?)。若采用数值积分的梯形公式,则有:

xnxn+1f[x,y(x)]dx?12h[f(xn,y(xn))+f(xn+1,y(xn+1))]?12h[f(xn,yn)+f(xn+1,yn+1)]
\int_{x_n}^{x_{n+1}}f[x,y(x)]dx \cong \frac{1}{2}h[f(x_n,y(x_n))+f(x_{n+1},y(x_{n+1}))] \\
\cong \frac{1}{2}h[f(x_n,y_n)+f(x_{n+1},y_{n+1})]

∫xn?xn+1??f[x,y(x)]dx?21?h[f(xn?,y(xn?))+f(xn+1?,y(xn+1?))]?21?h[f(xn?,yn?)+f(xn+1?,yn+1?)]
将其代入(5)式,就得到

y(xn+1)y(x_{n+1})

y(xn+1?)的近似值

yn+1y_{n+1}

yn+1?,即:

yn+1=yn+12h[f(xn,yn)+f(xn+1,yn+1)](6)
y_{n+1}=y_n+\frac{1}{2}h[f(x_n,y_n)+f(x_{n+1},y_{n+1})] \tag{6}

yn+1?=yn?+21?h[f(xn?,yn?)+f(xn+1?,yn+1?)](6)
称(6)式为梯形格式。可以看出,梯形格式实际上是显示Euler格式和隐式Euler格式的算术平均值。要使用该公式,同样需要将公式进行显示化。

  1. 改进的Euler格式

采用预报-校正方法,可将梯形公式显示化。即先用一个简单的格式求得一个初步的近似值,称为预报值;再用另外一种进行校正,得到较为精确的校正值。如果用显示Euler格式进行预报,用隐式梯形格式进行校正,则可得:

预报

yn+1=yn+hf(xn,yn)
\overline y_{n+1}=y_n+hf(x_n,y_n)

y?n+1?=yn?+hf(xn?,yn?)
校正

yn+1=yn+12h[f(xn,yn+f(xn+1,yn+1)]
y_{n+1}=y_n+\frac{1}{2}h[f(x_n,y_n+f(x_{n+1},\overline y_{n+1})]

yn+1?=yn?+21?h[f(xn?,yn?+f(xn+1?,y?n+1?)]
写成嵌套形式为:

yn+1=yn+12h[f(xn,yn)+f(xn+1,yn+hf(xn,yn))]
y_{n+1}=y_n+\frac{1}{2}h[f(x_n,y_n)+f(x_{n+1},y_n+hf(x_n,y_n))]

yn+1?=yn?+21?h[f(xn?,yn?)+f(xn+1?,yn?+hf(xn?,yn?))]
为便于计算,可用平均化形式表示为:

{yp=yn+hf(xn,yn)yq=yn+hf(xn+1,yp)yn+1=12(yp+yc)
\begin{cases}
y_p = y_n+hf(x_n,y_n) \\
y_q = y_n+hf(x_{n+1},y_{p}) \\
y_{n+1}=\frac{1}{2}(y_p+y_c)
\end{cases}

??????yp?=yn?+hf(xn?,yn?)yq?=yn?+hf(xn+1?,yp?)yn+1?=21?(yp?+yc?)?