参考视频
# 公式
y(t+Δt)=y(t)+y′(t)Δt+21y′′(Δt)2+⋯+n!1y(n+1)(t)(Δt)n+Rn
其中,余项Rn 表示为:
Rn=(n+1)!1f(n+1)(t+θt)(Δt)n+1→O((Δt)n+1)
# 示例
若y=et 在y=0 处展开得:
y(0+Δt)=y(Δt)=1+Δt+21(Δt)2+3!1(Δt)3+⋯
也可以写成:
y(t)=1+t+21t2+3!1t3+⋯
# 一级近似
用y=et 的一级近似1+t 和原函数做对比:
| clear |
| t = -1:0.001:1; |
| y = exp(t); |
| plot(t, y) |
| hold on |
| plot(t, 1 + t) |
几何意义:在展开点处,一级近似的斜率与原函数相同。
# 二级近似
用y=e2 的二级近似1+t+21t2 和原函数做对比:
| clear |
| t = -1:0.001:1; |
| y = exp(t); |
| plot(t, y) |
| hold on |
| plot(t, 1 + t + 1/2 * t.^2) |
几何意义:在展开点处的二级近似的一阶 / 二阶导数与原函数相同。
之后也可画出三级 / 四级近似和原函数的对比图,发现拟合程度越来越高,代表误差越来越小
# 欧拉法
dxdy=f(y,t)
y(tn)=yn
yn+1=yn+f(yn,tn)Δt
对y(tn) 在tn 处做泰勒展开:
y(tn+1)=y(tn+Δt)=y(tn)+y′(tn)Δt+O((Δt)2)=y(tn)+f(yn,tn)Δt+O((Δt)2)
对比可发现,欧拉法的误差量级为O((Δt)2),这是一步产生的误差量级。
比如,从0 模拟到1,共有Δt1 步;每一步都产生新的误差,这些误差会累积,产生的误差量级为:
O((Δt)2)⋅Δt1=O(Δt)
因此,这称为一阶误差。
如果一步的误差是O((Δt)3),则从0 到1 产生的误差量级为:
O((Δt)3)⋅Δt1=O((Δt)2)
因此,这称为二阶误差
# 利用泰勒展开
对dt2d2y=dtdf(y,t) 进行展开:
dt2d2y=dtdf(y,t)=∂y∂f(y,t)⋅dtdy+∂t∂f(y,t)
可以进一步表示为:
dt2d2y=∂y∂f(y,t)⋅f(y,t)+∂t∂f(y,t)
结合欧拉法:
yn+1=yn+f(yn,tn)Δt+21(∂y∂f(y,t)⋅f(y,t)+∂t∂f(y,t))(Δt)2
# 实际例子
dtdy=y,y(0)=y0
y(t)=y0et
通过二阶近似:
yn+1=yn+ynΔt+21yn(Δt)2
| clear |
| T = 1; |
| N = 4; |
| dt = T/N; |
| t = 0:dt:T; |
| t1 = 0:0.001:1; |
| y = zeros(1, length(t)); |
| y(1) = 8; |
| |
| for n = 1:length(t)-1 |
| y(n+1) = y(n) + y(n) * dt; |
| end |
| plot(t, y, t1, 8 * exp(t1)) |
欧拉法最终形成的误差和Δt 成正比,可以试着
把 N 改成 40
把 N 改成 400
下面试试二阶近似
yn+1=yn+ynΔt+21ynΔt2
| clear |
| T=1; |
| N=4; |
| dt=T/N; |
| t=0:dt:T; |
| t1=0:0.001:1; |
| y=zeros(1,length(t)); |
| y(1)=8; |
| y1=zeros(1,length(t)); |
| y1(1)=8; |
| for n=1:length(t)-1 |
| y(n+1)=y(n)+y(n)*dt; |
| y1(n+1)=y1(n)+y1(n)*dt+1/2*y1(n)*dt^2; |
| end |
| plot(t,y,t,y1,t1,8*exp(t1)) |
可以看出,在 N 一样时,二阶近似比欧拉法的精度高上不少
# 改进欧拉法
改进欧拉法得到:
yn+1=yn+21(f(yn,tn)+f(yn+1,tn+1))Δt
其中f(yn+1,tn+1) 用欧拉法公式计算,得到:
yn+1=yn+21(f(yn,tn)+f(yn+f(yn,tn)Δt,tn+Δt))Δt
现在我们要证明这个式子是二阶精度的。
# 泰勒展开
对f(y+Δy,t+Δt) 做泰勒展开:
f(y+Δy,t+Δt)=f(y,t)+∂y∂fΔy+∂t∂fΔt+O((Δt)2)
替换Δy=f(y,t)Δt,得到:
f(y+Δy,t+Δt)=f(yn,tn)+∂y∂f(f(yn,t)Δt)+∂t∂fΔt+O((Δt)2)
# 代入改进欧拉法公式
将展开结果代入改进欧拉法:
yn+1=yn+21(f(yn,tn)+f(yn+f(yn,tn)Δt,tn+Δt))Δt
=
yn+21(f(yn,tn)+f(yn,tn)+∂y∂f(f(yn,t)Δt)+∂t∂fΔt+O((Δt)2))Δt
=
yn+f(yn,tn)Δt+21(∂y∂f(yn,tn)f(yn,t)+∂t∂f(yn,t))(Δt)2+O((Δt)3)
# 误差分析
和yn 在tn 处的泰勒展开公式做对比,可以看出改进的欧拉法的误差量级也是O((Δt)3)。
# 以k 表示
定义:
k1=f(yn,tn)
k2=f(yn+k1Δt,tn+Δt)
最终得到:
yn+1=yn+21(k1+k2)Δt