1.3 Runge - Kutta 法
1.3.1 RK 方法的构造
一般地,RK 方法设近似公式为:
⎧⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎩yn+1=yn+hp∑i=1ciKiK1=f(xn,yn)Ki=f(xn+hai,yn+hi−1∑j=1bijKj)(i=1,2,⋯,p)(1.3.1)
上式中 ai、bij、ci 都是参数。确定它们的原则是使近似公式在 xn 处的 Taylor 展开式与 y(x) 在 xn 处的 Taylor 展开式的前面的项尽可能多地重合,使之具有尽可能高阶的局部截断误差。
1.3.1 二阶 RK 公式
当 p=2 时,近似公式为:
⎧⎪⎨⎪⎩yn+1=yn+h(c1K1+c2K2)K1=f(xn,yn)K2=f(xn+ha2,yn+hb21K1)(1.3.2)
计算局部截断误差时,为方便书写,此处令 yn+1=y(xn+1) 和 yn=y(xn)。上式在 (xn,yn) 处的 Taylor 展开式为
yn+1=yn+h[c1f(xn,yn)+c2f(xn+ha2,yn+hb21K1)]=yn+h{c1f(xn,yn)+c2[f(xn,yn)+a2hf′x(xn,yn)+b21hf′y(xn,yn)f(xn,yn)]}+O(h3)=yn+(c1+c2)f(xn,yn)h+c2[a2hf′x(xn,yn)+b21hf′y(xn,yn)f(xn,yn)]h2+O(h3)(1.3.3)
y(xn+1) 在 xn 处的 Taylor 展开式为:
y(xn+1)=y(xn)+hy′(xn)+h22y′′(xn)+O(h3)=yn+f(xn,yn)h+h22[f′x(xn,yn)+f′y(xn,yn)f(xn,yn)]+O(h3)(1.3.4)
注意,式 (1.3.3) 和式 (1.3.4) 中的 f′x 表示函数 f(x,y) 对 x 的一阶导数。
要使近似公式 (1.3.2) 的局部截断误差为 O(h3),则应要求式 (1.3.3) 和式 (1.3.4) 的前三项相同,于是有
⎧⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪⎩c1+c2=1c2a2=12c2b21=12(1.3.5)
式 (1.3.5) 有无穷多组解,它的每一组解代入式 (1.3.2) 中得到的近似公式,局部截断误差均为 O(h3),故这些方法都为二阶方法。
如果我们取 c1=c2=1/2,a2=b21=1,可得改进 Euler 公式:
⎧⎪
⎪
⎪⎨⎪
⎪
⎪⎩yn+1=yn+h2(K1+K2)K1=f(xn,yn)K2=f(xn+h,yn+hK1)(1.3.6)
如果我们取 c1=0,c2=1,a2=b21=1/2,可得中点公式:
⎧⎪⎨⎪⎩yn+1=yn+hK2K1=f(xn,yn)K2=f(xn+h/2,yn+K1h/2)(1.3.7)
理论上可以证明,无论怎样选取参数,式 (1.3.2) 都不可能具有更高的精度,最多只能得到二阶公式。
1.3.2 三阶 RK 公式和四阶 RK 公式
类似地,对 p=3 和 p=4 可以类似地推导,得到三阶和四阶 RK 公式,其中常用的三阶 RK 公式为
⎧⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎩yn+1=yn+h6(K1+4K2+K3)K1=f(xn,yn)K2=f(xn+h2,yn+h2K1)K3=f(xn+h,yn−hK1+2hK2)(1.3.8)
常用的四阶 RK 公式为
⎧⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎩yn+1=yn+h6(K1+2K2+2K3+K4)K1=f(xn,yn)K2=f(xn+h2,yn+h2K1)K3=f(xn+h2,yn+h2K2)K4=f(xn+h,yn+hK3)(1.3.9)
式 (1.3.9) 也被称为经典形式四阶 RK 公式。
1.3.3 RK 公式说明
当 p=1,2,3,4 时,RK 公式的局部截断误差的最高阶数恰好是 p,当 p>4 时,RK 公式的局部截断误差的最高阶数不是 p,如 p=5 时,RK 公式的最高阶数仍为 4,如 p=6 时,RK 公式的最高阶数为 5。
值得注意的是,RK 方法的导出基于 Taylor 展开,故它要求所求问题的解具有较高的光滑度。当解充分光滑时,四阶 RK 方法优于改进 Euler 方法;如果解的光滑性较差,则用四阶 RK 方法求数值解的效果可能不如改进 Euler 方法。
1.3.4 变步长 RK 方法
【推荐】国内首个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,普通电脑可用
· 按钮权限的设计及实现