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

时间:2024-05-21 11:09:36

微分方程初值问题的数值解法,就是将一个连续的微分方程初值问题转化为一个离散的差分方程初值问题,然后通过解差分方程而获得其数值解。即:对自变量的一系列离散节点xk(k=0,1,2,,n)x_k(k=0,1,2,\cdots,n\cdots),计算出去精确解y(xk)y(x_k)的近似值yk(k=1,2,,n,)y_k(k=1,2,\cdots,n,\cdots),(其中y0y_0是准确值)从而得到函数y=y(x)y=y(x)的近似数值解yk(k=1,2,,n,)y_k(k=1,2,\cdots,n,\cdots)

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

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

定理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}
如果f(x,y)f(x,y)对x连续,且关于y满足Lipschitz(李普希兹)条件,即存在常数L>0L>0,使得
f(x,y1)f(x,y2)Ly1y2 |f(x,y_1)-f(x,y_2)|\leq L|y_1-y_2|
对所有x[a,b]x\in [a,b]以及任何实数y1,y2y_1,y_2均成立,则初值问题在[a,b][a,b]上有惟一解。

Euler(欧拉)方法

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

1. 显示Euler格式

从导数的定义可知,当步长h=xn+1xn0h=x_{n+1}-x_n \to 0时,有:
y(x)=limΔx0ΔyΔx=limΔx0f(x+Δx)f(x)Δxy(xn+1)y(xn)xn+1xn(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}
(2)式右边是导数的近似差商表示。因此,如果向前差商、向后差商和中心差商分别代替微分方程(1)中的导数项y(x)y'(x),则可相应地导出Euler方法的各种格式。

  1. 显示Euler格式

若用在xnx_n点的向前差商y(xn+1)y(xn)xn+1xn\frac{y(x_{n+1})-y(x_n)}{x_{n+1}-x_n}代替微分方程(1)的导数项y(xn)y'(x_n),当h=xn+1xnh=x_{n+1}-x_n很小时,则有:
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))
若将y(xn)y(x_n)的近似值yny_n代入上式右端,并将计算结果记为yn+1y_{n+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}
这样就得到了y(xn+1)y(x_{n+1})的近似值yn+1y_{n+1}的递推格式,即所谓的显示Euler格式。

若给出初始条件y(x0)=y0y(x_0)=y_0,则按此(3)式可逐步算出y1,y2,,y_1,y_2,\cdots,即:
y1=y0+hy0=y0+hf(x0,y0)y2=y1+hf(x1,y1)yn=yn1+hf(xn1,yn1) 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})
这样就得了函数y=y(x)y=y(x)在离散节点的函数近似值。

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

将函数y=y(x)y=y(x)xn+1x_{n+1}点的值y(xn+1)y(x_{n+1})展开为关于xnx_n点的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)=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)y(x_n)用近似值yny_n代替,就得到y(xn+1)y(x_{n+1})的近似值yn+1y_{n+1},即:
yn+1=yn+hf(xn,yn) y_{n+1}=y_n+hf(x_n,y_n)
上面就是显示Euler格式。

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

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

定义1:以某种数值方法求解满足Lipschitz条件的微分方程(1)时,如果产生惟一的逼近序列{yn}\{y_n\},则称误差En=y(xn)yn(n=0,1,2,,N)E_n=y(x_n)-y_n(n=0,1,2,\dots,N)为该数值方法的整体截断误差。

定义2:在假设yny_n是准确的即yn=y(xn)y_n=y(x_n)前提下,称用某种数值方法计算yn+1y_{n+1}的误差en+1=y(xn+1)yn+1e_{n+1}=y(x_{n+1})-y_{n+1}为该数值方法在计算yn+1y_{n+1}时的局部截断误差。

定义3:若某种数值方法的局部截断误差为O(hp+1)O(h^{p+1}),则称该数值方法的阶数为p。

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

假设yn=y(xn)y_n=y(x_n),将函数y=y(x)y=y(x)xn+1x_{n+1}点的解析值y(xn+1)y(x_{n+1})展开为关于xnx_n点的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<x_{n+1}

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'
两式相减,得:
y(xn+1)yn+1=h22y(ϵ)=O(h2) y(x_{n+1})-y_{n+1}=\frac{h^2}{2}y''(\epsilon)=O(h^2)
可见,显示Euler格式只有一阶精度,其局部截断误差与步长的平方成正比。显然局部截断误差随着计算步距h的减小而减小,但是h过小并不利于计算精度,因为步距减小之后,计算次数会增加,必然导致舍入误差的增加。当舍入误差不可忽视时,计算就可能出现不稳定现象或者出现结果发散现象。

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

从几何上看,y(x)=f(x,y)y'(x)=f(x,y)相当于在x,yx,y平面上规定了一个方向场。以y=(xy)/2y'=(x-y)/2为例,作出其矩形区域R={(x,y):0x5,0y4}R=\{(x,y):0\leq x\leq 5,0\leq y\leq 4\}的方向场。如下图所示,若果y(0)=1y(0)=1,则y(x)=3ex22+xy(x)=3e^{-\frac{x}{2}}-2+x;如果y(0)=4y(0)=4,则y(x)=6ex22+xy(x)=6e^{-\frac{x}{2}}-2+x。从图中可以看出,曲线在每一点的切线和方向场的方向相同。

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

可见,从点(x0,y0)(x_0,y_0)开始,用该点的斜率f(x0,y0)f(x_0,y_0)和步长h可以得到点(x1,y1)(x_1,y_1),接着用点(x1,y1)(x_1,y_1)的斜率f(x1,y1)f(x_1,y_1)和步长h可以得到点(x2,y2)(x_2,y_2),照此做下去,可以得到更多的点(x3,y3),(x4,y4),(x_3,y_3),(x_4,y_4),\cdots。这些点组成了一条折线,它与解曲线并不重合(点(x0,y0)(x_0,y_0)除外),是解曲线的近似,如下图所示。

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

2. 隐式Euler格式

  1. 隐式Euler格式

若用在xn+1x_{n+1}点(不是在xnx_n点)的向后差商y(xn+1)y(xn)xn+1xn\frac{y(x_{n+1})-y(x_n)}{x_{n+1}-x_n}代替微分方程(1)的导数项y(xn+1)y'(x_{n+1}),当h=xn+1xnh=x_{n+1}-x_n很小时,则有:
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})) \\
这样可得:
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+1y_{n+1},故称为隐式Euler格式。

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

  1. 预报-校正法

如果导函数为f(x,y)=φ(x)+yf(x,y)=\varphi(x)+yf(x,y)=yφ(x)f(x,y)=y·\varphi(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+hφ(xn+1)]/(1h) y_{n+1}=[y_n+h\varphi(x_{n+1})]/(1-h)

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

先用显示Euler格式预报yn+1y_{n+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}
再用隐式Euler格式校正yn+1\overline 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}
(4)式称为预报-校正法。

3. 两步Euler格式

为了提高精度,改用在xnx_n点的中心差商[y(xn+1)y(xn1)]/(2h)[y(x_{n+1})-y(x_{n-1})]/(2h)代替微分方程(1)即y(xn)=f(xn,y(xn))y'(x_n)=f(x_n,y(x_n))中的导数项,得:
yn+1=yn1+2hf(xn,yn)(n=1,2,) y_{n+1}=y_{n-1}+2hf(x_n,y_n) \quad (n=1,2,\cdots)
这就是两步Euler格式。在计算yn+1y_{n+1}时,需要调用前两次的计算结果yn1y_{n-1}yny_n

两步Euler格式的局部截断误差是:设yn=y(xn),yn1=y(xn1)y_n=y(x_n),y_{n-1}=y(x_{n-1}),则有:
y(xn+1)=y(xn1)+2hf(xn,y(xn))=y(xn1)+2hy(xn) y(x_{n+1})=y(x_{n-1})+2hf(x_n,y(x_n))=y(x_{n-1})+2hy'(x_n)
y=y(x)y=y(x)xn+1x_{n+1}xn1x_{n-1}点的函数值y(xn+1)y(x_{n+1})y(xn1)y(x_{n-1})展开为关于xnx_n点的Taylor级数
y(xn+1)=y(xn)+hy(xn)+h22!y(xn)+h33!y(ϵ1)xn<ϵ1<xn+1y(xn1)=y(xn)hy(xn)+h22!y(xn)h33!y(ϵ2)xn1<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<x_{n+1} \\ y(x_{n-1})=y(x_n)-hy'(x_n)+\frac{h^2}{2!}y''(x_n)-\frac{h^3}{3!}y'''(\epsilon_2) \quad x_{n-1}<x_2<x_n
两式相减,得:
y(xn+1)=y(xn1)+2hy(xn)+h33y(ϵ),xn1<ϵ<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}
故局部截断误差为:
yxn+1yn+1=h33(ϵ)=O(h3) y(x_{n+1})-y_{n+1}=\frac{h^3}{3}(\epsilon)=O(h^3)
可见精度提高了,即两步Euler格式具有二阶精度。

4. 改进的Euler格式

  1. 梯形格式

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

将方程y=f(x,y)y'=f(x,y)的两端从xnx_nxn+1x_{n+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)
只要计算出(5)式中的积分项,就能得到y(xn+1)y(x_{n+1})。若采用数值积分的梯形公式,则有:
xnxn+1f[x,y(x)]dx12h[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})]
将其代入(5)式,就得到y(xn+1)y(x_{n+1})的近似值yn+1y_{n+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}
称(6)式为梯形格式。可以看出,梯形格式实际上是显示Euler格式和隐式Euler格式的算术平均值。要使用该公式,同样需要将公式进行显示化。

  1. 改进的Euler格式

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

预报
yn+1=yn+hf(xn,yn) \overline y_{n+1}=y_n+hf(x_n,y_n)
校正
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+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))]
为便于计算,可用平均化形式表示为:
{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}