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​)+21​h2y′′(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​=(21​h2−λ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​+hk2​k1​=f(xn​,yn​)k2​=f(xn+21​​,yn​+2h​k1​)​

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​+2h​k1​)k3​=f(xn+21​​,yn​+2h​k2​)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​+3h​k1​)k3​=f(xn​+32​,yn​−3h​k2​+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​+21​hk1​)k3​=f(xn+21​​,yn​+22​−1​hk1​+22−2​​hk2​)k4​=f(xn+1​,yn​−22​​hk2​+22+2​​hk3​)​

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐