1.2 Euler 方法及其改进方法
1.2.1 Euler 方法
用 f(xn,yn) 代替式 (1.2) 中的 φn,得到差分方程初值问题:
{yn+1=yn+hf(xn,yn)y0=y(a)n=0,1,⋯(1.2.1)
以上式问题的解作为微分方程初值问题的数值解,即 y(xn)=yn,称为 Euler 方法。容易看出式 (1.3) 是一个单步显式格式。
1.2.2 向后 Euler 法
用 f(xn+1,yn+1) 代替式 (1.2) 中的 φn,得到差分方程初值问题:
{yn+1=yn+hf(xn+1,yn+1)y0=y(a)n=0,1,⋯(1.2.2)
以上式问题的解作为微分方程初值问题的数值解,即 y(xn)=yn,称为向后 Euler 方法。容易看出式 (1.4) 是一个单步隐式格式,需要迭代法求解 yn+1。使用简单迭代法可以构造迭代格式如下:
{y(0)n+1=yn+hf(xn,yn)y(k+1)n+1=yn+hf(xn,y(k)n+1)k=0,1,⋯(1.2.3)
下面考虑迭代格式 (1.5) 的收敛性,由于 f(x,y) 关于 y 满足 Lipschitz 条件,即
|f(x,y1)−f(x,y2)|⩽L|y1−y2|
那么可得到迭代收敛条件:
∣∣y(k+1)n+1−y(k)n+1∣∣=h∣∣f(xn+1,y(k)n+1)−f(xn+1,y(k−1)n+1)∣∣⩽hL∣∣y(k)n+1−y(k−1)n+1∣∣⩽⋯⩽(hL)k∣∣y(1)n+1−y(0)n+1∣∣(1.2.4)
因此向后 Euler 方法迭代条件为:hL<1。
1.2.3 梯形公式
考虑下列差分方程初值问题:
⎧⎨⎩yn+1=yn+h2[f(xn,yn)+f(xn+1,yn+1)]y0=y(a)n=0,1,⋯(1.2.5)
以上式问题的解作为微分方程初值问题的数值解,即 y(xn)=yn,称为梯形公式。容易看出式 (1.4) 是一个单步隐式格式,需要迭代法求解 yn+1。使用简单迭代法可以构造迭代格式如下:
⎧⎪⎨⎪⎩y(0)n+1=yn+hf(xn,yn)y(k+1)n+1=yn+h2[f(xn,yn)+f(xn+1,y(k)n+1)]k=0,1,⋯(1.2.6)
下面考虑迭代格式 (1.8) 的收敛性。
∣∣y(k+1)n+1−y(k)n+1∣∣=h2∣∣f(xn+1,y(k)n+1)−f(xn+1,y(k−1)n+1)∣∣⩽hL2∣∣y(k)n+1−y(k−1)n+1∣∣⩽⋯⩽(hL2)k∣∣y(1)n+1−y(0)n+1∣∣(1.2.7)
得梯形公式的收敛条件:hL/2<1。
1.2.4 改进 Euler 法
将 Euler 法和梯形公式做一个预测 - 校正系统。
⎧⎨⎩¯¯¯yn+1=yn+hf(xn,yn)yn+1=yn+h2[f(xn,yn)+f(xn+1,¯¯¯yn+1)](1.2.8)
其中,式 (1.2.8) 的第一个式子为预测,第二个式子为校正。
实际计算中,改写成下式:
⎧⎪⎨⎪⎩yp=yn+hf(xn,yn)yq=yn+hf(xn+1,yp)yn+1=(yp+yq)/2n=0,1,⋯,(1.2.9)
1.2.5 单步法的误差估计
单步法一般形式: yn+1=yn+hφn
给出局部截断误差的定义
定义 1.2.1 局部截断误差
利用 xi(i⩽n),假定 y(x) 已知,利用公式递推一步计算 yn+1,与 y(xn+1) 的差的即为局部截断误差。
Rn+1=y(xn+1)−¯¯¯yn+1,其中 ¯¯¯yn+1=y(xn)+hφn
给出整体截断误差的定义
定义 1.2.2 整体截断误差
利用公式从最开始 x0 一步一步递推计算 yn+1,与 y(xn+1) 的差的即为整体截断误差。
en+1=y(xn+1)−yn+1
给出 p 阶方法的定义:
定义 1.2.3 p 阶方法
若某种数值方法的局部截断误差 Rn+1=O(hp+1),则称该方法是 p 阶方法。若进一步满足下式
Rn+1=ψ(xn,y(xn))hp+1+O(hp+2)
则称 ψ(xn,y(xn))hp+1 为局部截断误差的主项。
(1) Euler 方法的截断误差
按局部截断误差的定义计算 Euler 方法的局部截断误差:
Rn+1=y(xn+1)−¯¯¯yn+1=y(xn+1)−(y(xn)+hf(xn,yn))=y(xn+1)−(y(xn)+hy′(xn))=y(xn)+hy′(xn)+h2y′′(ξ)/2+o(h2)−(y(xn)+hy′(xn))=h2y′′(ξ)/2+o(h2)xn<ξ<xn+1(1.2.10)
故 Euler 方法为一阶方法。
按整体截断误差的定义计算 Euler 方法的整体截断误差:
|en+1|=|y(xn+1)−yn+1|⩽∣∣y(xn+1)−¯¯¯yn+1∣∣+∣∣¯¯¯yn+1−yn+1∣∣⩽|Rn+1|+|y(xn)−yn|+h|f(xn,y(xn))−f(xn,yn)|⩽|Rn+1|+|y(xn)−yn|+hL|y(xn)−yn|=|Rn+1|+(1+hL)|en|(1.2.11)
我们进一步假设 f(x,y) 充分光滑,有 y(x)∈C(2)[a,b],则存在 M>0,使得 y′′(x)⩽M,此时有 |Rk|⩽Mh2/2。我们有 e1=R1,进一步计算整体截断误差:
|en+1|⩽Mh2/2+(1+hL)|en|⩽Mh2/2+(1+hL)[Mh2/2+(1+hL)|en−1|]⩽Mh2/2[1+(1+hL)+(1+hL)2+⋯+(1+hL)n]=hM2L[(1+hL)n+1−1]
因为 (n+1)h⩽b−a,所以
(1+hL)n+1⩽(1+hL)b−ah<eL(b−a)
因此有
|en+1|⩽hM2L[eL(b−a)−1]=O(h)
可见 Euler 方法的整体截断误差与 h 同阶,为一阶方法。且 h→0 时,整体截断误差 e→0。
(2) 向后 Euler 方法的截断误差
按局部截断误差的定义计算向后 Euler 方法的局部截断误差:
Rn+1=y(xn+1)−¯¯¯yn+1=y(xn+1)−(y(xn)+hf(xn,yn))=y(xn+1)−(y(xn)+hy′(xn))=y(xn)+hy′(xn)+h2y′′(xn)/2+o(h2)−(y(xn)+hy′(xn))=h2y′′(xn)/2+O(h3)xn<ξ<xn+1(1.2.12)
(3) 梯形公式的截断误差
按局部截断误差的定义计算梯形公式的局部截断误差。
考虑 y(xn+1)
y(xn+1)=y(xn)+hy′(xn)+h22y′′(xn)+h36y′′′(xn)+h424y(4)(ξ1)xn<ξ1<xn+1
考虑 ¯¯¯yn+1
¯¯¯yn+1=y(xn)+h2(f(xn,y(xn))+f(xn+1,y(xn+1)))=y(xn)+h2(y′(xn)+y′(xn+1))=y(xn)+h2(y′(xn)+y′(xn)+hy′′(xn)+h22y′′′(xn)+h36y(4)(ξ2))xn<ξ2<xn+1=y(xn)+hy′(xn)+h22y′′(xn)+h34y′′′(xn)+h412y(4)(ξ2)xn<ξ2<xn+1
可得梯形公式的局部截断误差:
Rn+1=y(xn+1)−¯¯¯yn+1=−h312y′′′(xn)+O(h4)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现