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

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

Runge-Kutta四阶方法求解微分方程

Runge-Kutta四阶方法是一种常用的数值求解常微分方程初值问题的方法,相比其他方法具有精度高、稳定性好等优点。该方法的基本思路是将微分方程在一定步长上进行逼近近似,然后通过不断迭代来逼近精确解。下面将对该方法进行详细介绍。

原理

对于微分方程:

$$\frac{dy}{dx}=f(x,y)$$

设初始条件为 $y(x_0)=y_0$,则可得到微分方程的初值问题。

Runge-Kutta四阶方法的基本思路是在 $[x_i, x_{i+1}]$ 的区间上,根据目前的条件估算出 $y(x_{i+1})$ 的值。

具体地,根据泰勒展开式可得:

$$y_{i+1}=y_i+\frac{1}{6}(k_1+2k_2+2k_3+k_4)$$

其中,

$$k_1=h\cdot f(x_i, y_i)$$

$$k_2=h\cdot f(x_i+\frac{h}{2},y_i+\frac{k_1}{2})$$

$$k_3=h\cdot f(x_i+\frac{h}{2},y_i+\frac{k_2}{2})$$

$$k_4=h\cdot f(x_i+h,y_i+k_3)$$

$y_{i+1}$ 即为该区间上的一个近似解,其中 $h$ 为步长。通过不断迭代可逼近精确解。

代码实现

以下为使用 Python 语言实现 Runge-Kutta四阶方法求解微分方程的示例代码:

def runge_kutta(f, x0, y0, h, x_end):
    """
    用 Runge-Kutta 四阶方法求解微分方程:

        dy/dx = f(x, y)

        初始条件: y(x0) = y0

    Args:
        f: 微分方程右侧函数
        x0: 自变量初始值
        y0: 因变量初始值
        h: 步长
        x_end: 自变量终止值

    Returns:
        xs: 自变量节点数组
        ys: 因变量节点数组
    """
    xs = [x0]
    ys = [y0]
    while xs[-1] < x_end:
        k1 = h * f(xs[-1], ys[-1])
        k2 = h * f(xs[-1] + 0.5 * h, ys[-1] + 0.5 * k1)
        k3 = h * f(xs[-1] + 0.5 * h, ys[-1] + 0.5 * k2)
        k4 = h * f(xs[-1] + h, ys[-1] + k3)
        y_next = ys[-1] + 1/6 * (k1 + 2*k2 + 2*k3 + k4)
        ys.append(y_next)
        xs.append(xs[-1] + h)
    return xs, ys
使用示例

以下为使用 Runge-Kutta 四阶方法求解微分方程 $y' = (x - y) / 2$ 的示例代码:

import matplotlib.pyplot as plt


def f(x, y):
    return (x - y) / 2


xs, ys = runge_kutta(f, 0, 1, 0.1, 1)
plt.plot(xs, ys)
plt.show()

运行上述代码后,将会生成一个 $y=x-e^{-0.5x}$ 的图像,说明该方法得到的解与精确解非常接近。

总结

Runge-Kutta 四阶方法是一种精度高、稳定性好的求解微分方程初值问题的方法,可以通过自适应步长等技巧进一步提高其精度和稳定性。在实际应用中,需要根据实际问题进行调整和优化,才能得到最佳的求解效果。