Runge-Kutta(龙格-库塔)方法 | 基本思想 + 二阶格式 + 四阶格式
Euler方法有各种格式,但其精度最高不超过2阶,一般难以满足实际计算的精度要求。因此,有必要构造精度更高的数值计算公式求解微分方程。Runge-Kutta方法就是一种高精度的经典的解常微分方程的单步方法。
1. Runge-Kutta 方法的基本思想
对于函数y=y(x)y=y(x)y=y(x),设yn=y(xn)y_n=y(x_n)yn=y(xn),将y(xn+1)y(x_{n+1})y(xn+1)在点xnx_nxn处展开为Taylor级数:
y(xn+1)=y(xn)+hy′(ϵ)xn<ϵ<xn+1
y(x_{n+1})=y(x_n)+hy'(\epsilon) \quad x_n<\epsilon<x_{n+1}
y(xn+1)=y(xn)+hy′(ϵ)xn<ϵ<xn+1
利用y′(xn)=f(xn,yn)y'(x_n)=f(x_n,y_n)y′(xn)=f(xn,yn)可得:
y(xn+1)=y(xn)+hf(ϵ,y(ϵ))
y(x_{n+1})=y(x_n)+hf(\epsilon,y(\epsilon))
y(xn+1)=y(xn)+hf(ϵ,y(ϵ))
其中,f(ϵ,y(ϵ))f(\epsilon,y(\epsilon))f(ϵ,y(ϵ))为区间(xn,xn+1)(x_n,x_{n+1})(xn,xn+1)上的平均斜率,记为k∗k^*k∗。因此,只要能设法提供一种算法求得k∗k^*k∗,就可相应地导出一种计算格式。
回顾一下前面所讲的Euler方法可知:
若取xnx_nxn点处的斜率k1=f(xn,yn)k_1=f(x_n,y_n)k1=f(xn,yn)作为k∗k^*k∗,则可得到显示Euler格式,但只有一阶精度;
若取xnx_nxn和xn+1x_{n+1}xn+1两点处的斜率k1=f(xn,yn)k_1=f(x_n,y_n)k1=f(xn,yn)和k2=f(xn+1,yn+hk1)k_2=f(x_{n+1},y_{n}+hk_1)k2=f(xn+1,yn+hk1)的算术平均值作为平均斜率kok^oko,即ko=(k1+k2)/2k^o=(k_1+k_2)/2ko=(k1+k2)/2,则得到改进的Euler格式,则有二阶精度。
由此推而广之,如果设法在区间(xn,xn+1)(x_n,x_{n+1})(xn,xn+1)内取若干个点的斜率,然后将它们加权平均作为平均斜率kok^oko,则可以构造一种具有更高精度的计算格式。这就是Runge-Kutta方法的基本思想。
2. 二阶Runge-Kutta格式
在改进的Euler格式的基础上加以修改,即在区间[xn,xn+1][x_n,x_{n+1}][xn,xn+1]内,除xnx_nxn外再取区间中任一点p,则有:
xn+p=xn+ph0<p≤1
x_{n+p}=x_n+ph \quad 0<p\leq 1
xn+p=xn+ph0<p≤1
取xnx_nxn和xn+px_{n+p}xn+p两点处的斜率k1k_1k1和k2k_2k2加权平均作为平均斜率kok^oko,即:
ko=(1−λ)k1+λk2λ为待定系数
k^o=(1-\lambda)k_1+\lambda k_2 \quad \lambda 为待定系数
ko=(1−λ)k1+λk2λ为待定系数
这样构造出的计算格式为:
yn+1=yn+h[(1−λ)k1+λk2](1a)
y_{n+1}=y_n+h[(1-\lambda)k_1+\lambda k_2] \tag{1a}
yn+1=yn+h[(1−λ)k1+λk2](1a)
其中:
k1=f(xn,yn)(1b)k2=f(xn+p,yn+phk1)(1c)
k_1=f(x_n,y_n) \quad (1b)\\
k_2=f(x_{n+p},y_n+phk_1) \quad (1c)
k1=f(xn,yn)(1b)k2=f(xn+p,yn+phk1)(1c)
(1)式称为二阶的Runge-Kutta格式,其中p,λp,\lambdap,λ为待定参数。在确定p,λp,\lambdap,λ的同时,使二阶Runge-Kutta格式具有较高的精度,具体推导如下:
根据假设yn=y(xn)y_n=y(x_n)yn=y(xn),有:
k1=f(xn,yn)=y′(xn)k2=f(xn+p,yn+phk1)=f(xn+ph,yn+phk1)
k_1=f(x_n,y_n)=y'(x_n) \\
k_2=f(x_{n+p},y_n+phk_1)=f(x_n+ph,y_n+phk_1)
k1=f(xn,yn)=y′(xn)k2=f(xn+p,yn+phk1)=f(xn+ph,yn+phk1)
将k2k_2k2右端在点(xn,yn)(x_n,y_n)(xn,yn)处展开为Taylor级数:
k2=f(xn,yn)+ph⋅fx(xn,yn)+phy′(xn)⋅fy(xn,yn)+O(h2)
k_2=f(x_n,y_n)+ph·f_x(x_n,y_n)+phy'(x_n)·f_y(x_n,y_n)+O(h^2)
k2=f(xn,yn)+ph⋅fx(xn,yn)+phy′(xn)⋅fy(xn,yn)+O(h2)
而
ph⋅fx(xn,yn)+ph⋅y′(xn)⋅fy(xn,yn)=ph⋅f′(xn,yn)=ph⋅y′′(xn)
ph·f_x(x_n,y_n)+ph· y'(x_n)·f_y(x_n,y_n)=ph·f'(x_n,y_n)=ph·y''(x_n)
ph⋅fx(xn,yn)+ph⋅y′(xn)⋅fy(xn,yn)=ph⋅f′(xn,yn)=ph⋅y′′(xn)
故
k2=f(xn,yn)+phy′′(xn)+O(h2)=y′(xn)+phy′′(xn)+O(h2)
k_2=f(x_n,y_n)+phy''(x_n)+O(h^2)=y'(x_n)+phy''(x_n)+O(h^2)
k2=f(xn,yn)+phy′′(xn)+O(h2)=y′(xn)+phy′′(xn)+O(h2)
将k1k_1k1和k2k_2k2代入yn+1=yn+h[(1−λ)k1+λk2]y_{n+1}=y_n+h[(1-\lambda)k_1+\lambda k_2]yn+1=yn+h[(1−λ)k1+λk2]中,有:
yn+1=yn+h[(1−λ)k1+λk2]=y(xn)+hy′(xn)+λph2y′′(xn)+λO(h3)
y_{n+1}=y_n+h[(1-\lambda)k_1+\lambda k_2] \\
=y(x_n)+hy'(x_n)+\lambda ph^2y''(x_n)+\lambda O(h^3)
yn+1=yn+h[(1−λ)k1+λk2]=y(xn)+hy′(xn)+λph2y′′(xn)+λO(h3)
再将y(xn+1)y(x_{n+1})y(xn+1)在点(xn,yn)(x_n,y_n)(xn,yn)处展开为Taylor级数:
y(xn+1)=y(xn+h)=y(xn)+hy′(xn)+12h2y′′(xn)+O(h3)
y(x_{n+1})=y(x_n+h)=y(x_n)+hy'(x_n)+\frac{1}{2}h^2y''(x_n)+O(h^3)
y(xn+1)=y(xn+h)=y(xn)+hy′(xn)+21h2y′′(xn)+O(h3)
比较两式,得:
y(xn+1)−yn+1=(12h2−λph2)y′′(xn)−λO(h3)
y(x_{n+1})-y_{n+1}=(\frac{1}{2}h^2-\lambda ph^2)y''(x_n)-\lambda O(h^3)
y(xn+1)−yn+1=(21h2−λph2)y′′(xn)−λO(h3)
因此,当
λp=12
\lambda p=\frac{1}{2}
λp=21
时,二阶Runge-Kutta格式具有为2阶精度。可见二阶Runge-Kutta格式有很多具体形式:
若取λ=12,p=1\lambda=\frac{1}{2},p=1λ=21,p=1,则可得改进的Euler格式;
若取λ=34,p=23\lambda=\frac{3}{4},p=\frac{2}{3}λ=43,p=32,则可得Heun(休恩)格式;
若取λ=1,p=12\lambda=1,p=\frac{1}{2}λ=1,p=21,则可得变形的Euler格式,即中点格式:
{yn+1=yn+hk2k1=f(xn,yn)k2=f(xn+12,yn+h2k1)
\begin{cases}
y_{n+1}=y_n+hk_2 \\
k_1 = f(x_n,y_n) \\
k_2 = f(x_{n+\frac{1}{2}},y_n+\frac{h}{2}k_1)
\end{cases}
⎩⎪⎨⎪⎧yn+1=yn+hk2k1=f(xn,yn)k2=f(xn+21,yn+2hk1)
3. 四阶Runge-Kutta格式
在区间[xn,xn+1][x_n,x_{n+1}][xn,xn+1]内,使用两个不同的点可以构造出二阶Runge-Kutta格式。依此规律,在区间[xn,xn+1][x_n,x_{n+1}][xn,xn+1]内,取3个不同的点可以构造出三阶Runge-Kutta格式;取4个不同的点可以构造出四阶Runge-Kutta格式。对此可以加以证明。在实际中,应用最广泛的是四阶经典的Runge-Kutta格式:
{yn+1=yn+h6(k1+2k2+2k3+k4)k1=f(xn,yn)k2=f(xn+12,yn+h2k1)k3=f(xn+12,yn+h2k2)k4=f(xn+1,yn+hk3)
\begin{cases}
y_{n+1}=y_n+\frac{h}{6}(k_1+2k_2+2k_3+k_4) \\
k_1=f(x_n,y_n) \\
k_2=f(x_{n+\frac{1}{2}},y_n+\frac{h}{2}k_1) \\
k_3=f(x_{n+\frac{1}{2}},y_n+\frac{h}{2}k_2) \\
k_4=f(x_{n+1},y_n+hk_3)
\end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧yn+1=yn+6h(k1+2k2+2k3+k4)k1=f(xn,yn)k2=f(xn+21,yn+2hk1)k3=f(xn+21,yn+2hk2)k4=f(xn+1,yn+hk3)
四阶Runge-Kutta方法的优点如下:
(1)它是一种高精度的单步法,可达四阶精度O(h5)O(h^5)O(h5);
(2)数值稳定性较好;
(3)只需知道一阶导数,无需明确定义或计算其他高阶导数;
(4)只需给出yny_nyn就能计算出yn+1y_{n+1}yn+1,所以能够自启动;
(5)编程容易。
四阶Runge-Kutta法除经典的格式外,还有其他的格式。例如:
(1)Kutta格式
{yn+1=yn+h8(k1+3k2+3k3+k4)k1=f(xn,yn)k2=f(xn+13,yn+h3k1)k3=f(xn+23,yn−h3k2+hk2)k4=f(xn+1,yn+hk1−hk2+hk3)
\begin{cases}
y_{n+1}=y_n+\frac{h}{8}(k_1+3k_2+3k_3+k_4) \\
k_1=f(x_n,y_n) \\
k_2=f(x_{n+\frac{1}{3}},y_n+\frac{h}{3}k_1) \\
k_3=f(x_n+\frac{2}{3},y_n-\frac{h}{3}k_2+hk_2) \\
k_4=f(x_{n+1},y_n+hk_1-hk_2+hk_3)
\end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧yn+1=yn+8h(k1+3k2+3k3+k4)k1=f(xn,yn)k2=f(xn+31,yn+3hk1)k3=f(xn+32,yn−3hk2+hk2)k4=f(xn+1,yn+hk1−hk2+hk3)
(2)Gill格式:
{yn+1=yn+h6(k1+(2−2)k2+(2+2)k3+k4)k1=f(xn,yn)k2=f(xn+12,yn+12hk1)k3=f(xn+12,yn+2−12hk1+2−22hk2)k4=f(xn+1,yn−22hk2+2+22hk3)
\begin{cases}
y_{n+1}=y_n+\frac{h}{6}(k_1+(2-\sqrt{2})k_2+(2+\sqrt{2})k_3+k_4) \\
k_1=f(x_n,y_n) \\
k_2=f(x_{n+\frac{1}{2}},y_n+\frac{1}{2}hk_1) \\
k_3=f(x_{n+\frac{1}{2}},y_n+\frac{\sqrt{2}-1}{2}hk_1+\frac{2-\sqrt{2}}{2}hk_2) \\
k_4=f(x_{n+1},y_n-\frac{\sqrt{2}}{2}hk_2+\frac{2+\sqrt{2}}{2}hk_3)
\end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧yn+1=yn+6h(k1+(2−2)k2+(2+2)k3+k4)k1=f(xn,yn)k2=f(xn+21,yn+21hk1)k3=f(xn+21,yn+22−1hk1+22−2hk2)k4=f(xn+1,yn−22hk2+22+2hk3)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)