用四阶龙格库塔法(RK4)求解二阶微分方程

import math
import matplotlib.pyplot as plt


# 龙格-库塔法的定义
def runge_kutta(y, h, f):
    k1 = h * f(t, x1, x2)
    k2 = h * f(t + 0.5 * h, x1 + 0.5 * k1, x2 + 0.5 * k1)
    k3 = h * f(t + 0.5 * h, x1 + 0.5 * k2, x2 + 0.5 * k2)
    k4 = h * f(t + h, x1 + k3, x2 + k3)
    return y + (k1 + 2 * k2 + 2 * k3 + k4) / 6.


# 微分方程函数的定义
def func_x1(t, x1, x2):
    return x2


def func_x2(t, x1, x2):
    v1 = - t ** 2 / 4
    v2 = math.exp(v1)
    return 4 * v2 / x1 ** 3 - (1 + 2 * x2 ** 2) / x1


if __name__ == '__main__':
    dt = 0.001  # 步长
    # 边界条件
    t = 0
    x1 = 0.0063  # 初值
    x2 = 0
    x1s, x2s, ts = [], [], []
    # Run
    while t <= 16:  # 迭代边界
        x1 = runge_kutta(x1, dt, func_x1)
        x2 = runge_kutta(x2, dt, func_x2)
        t += dt
        x1s.append(x1)
        x2s.append(x2)
        ts.append(t)
    # Plot
    plt.subplot(2, 1, 1)
    plt.plot(ts, x1s, label='y')
    plt.legend()
    plt.grid()  # 图注
    plt.subplot(2, 1, 2)
    plt.plot(ts, x2s, label='dy / dx')
    plt.legend()
    plt.grid()
    plt.show()

用四阶龙格库塔法(RK4)求解如下的二阶微分方程(ODE):

y\frac{d^{^{2}}y}{dx^{2}} + 2 (\frac{dy}{dx})^{2} + 1 = \frac{4e^{^{-\frac{x^{2}}{4}}}}{y^{2}}

做变化:

x1 = y  

x2 = y' =  dy / dx

降阶成一阶微分方程

然后用x1和x2表示出原方程的一阶和二阶函数:

dy/dx = x2

dy2/dx2 = 4e^(-t2/4)/x1^3 - (1+2x2^2)/x1

  • 14
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
龙格库塔法是一种常用的数值解微分方程的方法,可以用来求解二阶微分方程。具体步骤如下: 1. 将二阶微分方程化为一组一阶微分方程,例如将 $y''+p(x)y'+q(x)y=f(x)$ 化为 $u_1=y, u_2=y'$,则有 $u_1'=u_2, u_2'=-p(x)u_2-q(x)u_1+f(x)$。 2. 选取步长 $h$,确定求解区间 $[a,b]$,并初始化 $u_1(a),u_2(a)$。 3. 依次计算 $u_1,u_2$ 在 $a+h,a+2h,\cdots,b$ 处的值。具体计算公式如下: $k_{11}=u_2(x_n)$ $k_{12}=-p(x_n)u_2(x_n)-q(x_n)u_1(x_n)+f(x_n)$ $k_{21}=u_2(x_n+\frac{h}{2})+\frac{h}{2}k_{12}$ $k_{22}=-p(x_n+\frac{h}{2})u_2(x_n+\frac{h}{2})-q(x_n+\frac{h}{2})u_1(x_n+\frac{h}{2})+f(x_n+\frac{h}{2})$ $k_{31}=u_2(x_n+\frac{h}{2})+\frac{h}{2}k_{22}$ $k_{32}=-p(x_n+\frac{h}{2})u_2(x_n+\frac{h}{2})-q(x_n+\frac{h}{2})u_1(x_n+\frac{h}{2})+f(x_n+\frac{h}{2})$ $k_{41}=u_2(x_n+h)+hk_{32}$ $k_{42}=-p(x_n+h)u_2(x_n+h)-q(x_n+h)u_1(x_n+h)+f(x_n+h)$ $u_1(x_{n+1})=u_1(x_n)+\frac{h}{6}(k_{11}+2k_{21}+2k_{31}+k_{41})$ $u_2(x_{n+1})=u_2(x_n)+\frac{h}{6}(k_{12}+2k_{22}+2k_{32}+k_{42})$ 4. 重复步骤 3 直到计算到 $x=b$。 下面是一个使用龙格库塔法求解二阶微分方程Python 代码示例: ```python import numpy as np def rk4(f, a, b, h, y0): n = int((b-a)/h) t = np.linspace(a, b, n+1) y = np.zeros((n+1, len(y0))) y[0] = y0 for i in range(n): k1 = h*f(t[i], y[i]) k2 = h*f(t[i]+h/2, y[i]+k1/2) k3 = h*f(t[i]+h/2, y[i]+k2/2) k4 = h*f(t[i]+h, y[i]+k3) y[i+1] = y[i] + (k1+2*k2+2*k3+k4)/6 return t, y def f(x, u): return np.array([u[1], -x*u[1]-x**2*u[0]]) a, b = 0, 1 h = 0.1 y0 = np.array([1, 0]) t, y = rk4(f, a, b, h, y0) print(y[-1, 0]) ``` 其中,`f` 函数是一阶微分方程组的右端项,`rk4` 函数是龙格库塔法的实现函数,`a,b` 是求解区间,`h` 是步长,`y0` 是初始值。最后输出的是 $y(1)$ 的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值