龙格库塔算法
前言: 本文从简单欧拉法讲起,详细探究了龙格库塔算法的原理。
0. 问题提出
求解下面的一阶微分方程
{ y ′ ( x ) = d y d x = f ( x , y ) y ( x 0 ) = y 0 \left\{\begin{aligned} &y'(x)=\frac{dy}{dx} = f(x,y) \\ &y(x_0) = y_0 \end{aligned} \right. ⎩⎨⎧y′(x)=dxdy=f(x,y)y(x0)=y0
即已知上述条件,则 y(x) 如何求出?
1. 欧拉法
1.1 基本原理
上述方程组给出了某点的坐标,以及该点的斜率值。可以使用欧拉法对 y(x) 进行迭代的近似求解。求解分析如下:
已知 x = x 0 x = x_0 x=x0 时 y = y 0 y=y_0 y=y0 ,且斜率为 y ′ ( x 0 ) = f ( x 0 , y 0 ) y'(x_0)=f(x_0,y_0) y′(x0)=f(x0,y0) ,那么就可以用过该点且斜率为 y ′ ( x 0 ) y'(x_0) y′(x0)的直线近似求解 x 0 x_0 x0附近一点 x 1 x_1 x1的函数值。
构建直线:
y ( x ) = y 0 + f ( x 0 , y 0 ) ( x − x 0 ) y(x) = y_0 + f(x_0,y_0)(x-x_0) y(x)=y0+f(x0,y0)(x−x0)
那么,在 x = x 1 x=x_1 x=x1时,求得
y ( x 1 ) = y 0 + f ( x 0 , y 0 ) ( x 1 − x 0 ) y(x_1) = y_0+f(x_0,y_0)(x_1-x_0) y(x1)=y0+f(x0,y0)(x1−x0)
即在 x = x 1 x=x_1 x=x1 时, y = y ( x 1 ) y=y(x_1) y=y(x1),且斜率为 y ′ ( x 1 ) = f ( x 1 , y 1 ) y'(x_1)=f(x_1,y_1) y′(x1)=f(x1,y1)。重复以上步骤,可以求得 y ( x 2 ) , y ( x 3 ) , ⋯ , y ( x n ) y(x_2),y(x_3),\cdots,y(x_n) y(x2),y(x3),⋯,y(xn)
如果等间隔取 x 值,即 x 1 − x 0 = x 2 − x 1 = x 3 − x 2 = ⋯ = x n − x n − 1 = h x_1-x_0 = x_2-x_1=x_3-x_2=\cdots=x_{n}-x_{n-1}=h x1−x0=x2−x1=x3−x2=⋯=xn−xn−1=h,也即 x n = x 0 + n ⋅ h x_n=x_0+n\cdot h xn=x0+n⋅h可以得到
y ( x 1 ) = y 0 + f ( x 0 , y 0 ) ⋅ h y ( x 2 ) = y 1 + f ( x 1 , y 1 ) ⋅ h ⋮ y ( x n ) = y n − 1 + f ( x n − 1 , y n − 1 ) ⋅ h y(x_1)=y_0+f(x_0,y_0)\cdot h \\ y(x_2)=y_1+f(x_1,y_1)\cdot h \\ \vdots\\ y(x_n)=y_{n-1}+f(x_{n-1},y_{n-1})\cdot h y(x1)=y0+f(x0,y0)⋅hy(x2)=y1+f(x1,y1)⋅h⋮y(xn)=yn−1+f(xn−1,yn−1)⋅h
总结为:
{ y ( x n ) = y n − 1 + f ( x n − 1 , y n − 1 ) ⋅ h x n = x 0 + n ⋅ h \left\{\begin{aligned} &y(x_n)=y_{n-1}+f(x_{n-1},y_{n-1})\cdot h \\ &x_n = x_0 + n\cdot h \end{aligned} \right. {
y(xn)=yn−1+f(xn−1,yn−1)⋅hxn=x0+n⋅h
该公式就是欧拉公式。
1.2 误差分析
值得注意的是,如上求解 y ( x 1 ) y(x_1) y(x1) 是有误差的,而在求解 y ( x 2 ) y(x_2) y(x2) 的时候,虽然斜率是准确的,但函数值是基于 y ( x 1 ) y(x_1) y(x1) 的,即在第一次误差的基础上计算的,因此会累积误差。
可以使用泰勒展开分析每次迭代产生的误差。对 y ( x ) y(x) y(x) 进行泰勒展开
y ( x ) = y ( x k ) + y ′ ( x k ) ( x − x k ) + y ′ ′ ( x k ) 2 ! ( x − x k ) 2 + ⋯ + y n + 1 ( ϵ ) ( n + 1 ) ! ( x − x k ) n + 1 y(x) = y(x_k) +y'(x_k)(x-x_k)+\frac{y''(x_k)}{2!}(x-x_k)^2+\cdots+\frac{y^{n+1}(\epsilon)}{(n+1)!}(x-x_k)^{n+1} \\ y(x)=y(xk)+y′(x