📜  求解微分方程的 Runge-Kutta 二阶方法(1)

📅  最后修改于: 2023-12-03 15:11:03.160000             🧑  作者: Mango

求解微分方程的 Runge-Kutta 二阶方法

Runge-Kutta 二阶方法是一种常用于求解微分方程的数值方法,其基本思想是通过将微分方程的初始条件作为起点,在一定步长内对当前点和斜率进行计算,从而得到下一个点的近似值。

算法描述

对于微分方程 $y^{'}=f(x,y)$,可以采用如下的 Runge-Kutta 二阶方法进行求解:

  1. 设 $y(x_i) = y_i$,则 $y(x_{i+1})$ 的近似值为 $y_{i+1}=y_i+h(k_1+k_2)$,其中 $h$ 为步长;
  2. 根据欧拉法可得 $k_1=f(x_i,y_i)$;
  3. 计算 $k_2=f(x_i+h,y_i+hk_1)$;
  4. 重复以上步骤,直到达到所需精度或计算轮数。
代码实现
def RK2(f, x0, y0, h, n):
    """
    Runge-Kutta 二阶方法求解微分方程 y'=f(x,y)

    Args:
        f: 微分方程的右端函数
        x0: 初始 x 值
        y0: 初始 y 值
        h: 步长
        n: 迭代次数

    Returns:
        x: 各次迭代的自变量 x
        y: 各次迭代的因变量 y
    """
    x = [x0]
    y = [y0]

    for i in range(n):
        k1 = f(x[-1], y[-1])
        k2 = f(x[-1]+h, y[-1]+h*k1)

        x.append(x[-1] + h)
        y.append(y[-1] + h*(k1+k2)/2)

    return x, y

其中,参数 f 指微分方程的右端函数,x0y0 则指初始值,h 表示步长,n 为迭代次数。

使用方法

以求解一阶常微分方程 $y^{'}=x+y$ 为例,给定初值 $y(0)=1$,计算 $y(2)$ 处的解:

def f(x, y):
    return x + y

x, y = RK2(f, 0, 1, 0.2, 10)

print(y[-1])

输出结果为 4.116542005663085

总结

Runge-Kutta 二阶方法是一种简单而又较为精确的数值求解微分方程的方法,适合于解一些简单的微分方程。当然,对于更为复杂的微分方程,则需要借助更高阶的数值方法来进行求解。