【Python算法】数值分析—四阶荣格库塔方法

一、前言

        四阶荣格库塔方法是一种常微分方程的数值解法,给定区间,划分次数,初值条件后,可以求解出任一点的原函数值。

给定常微分方程初值问题:

\frac{dy}{dx} = f(x, y), \quad a\le x\le b

y(a)=a,\quad h=\frac{b-a}{N}

利用四阶荣格库塔方法:

K_{1} =f(x_{n},y_{n})

K_{2} =f(x_{n}+\frac{h}{2} ,y_{n}+\frac{hK_{1} }{2} )

K_{3} =f(x_{n}+\frac{h}{2} ,y_{n}+\frac{hK_{2} }{2} )

K_{4} =f(x_{n}+h,y_{n}+hK_{3} )

y_{n+1}=y_{n}+\frac{h}{6} (K_{1} +2K_{2} +2K_{3} +K_{4} )

 可逐次求出微分方程初值问题的数值解y_{n}, \quad n=1,2,\dots ,N

 二、代码实现

2.1计算步长及区间数组

def get_list_x_and_h(a,  # 区间起始点
                     b,  # 区间结束点
                     n   # n是划分的次数
                     ):
    """ 获取步长及计算区间 """
    list_x = []
    h = abs(a - b) / n
    for i in list(range(0, n + 1)):
        list_x.append(a + i * h)
    return list_x, h  # h是步长

2.2计算K值

def get_k(fx,  # 方程表达式
          x,
          y,
          precision_value=5  # 计算结果保留的有效数字
          ):
    """ 计算k值 """
    return fx.evalf(subs={'x': x, 'y': y}, n=precision_value)

 2.3主函数,循环迭代

def method_runge_kutta(fx,  # 方程表达式
                       list_fx,  # 存储fx值的list
                       a, b, n):
    """ 主循环进行计算 """
    list_x, h = get_list_x_and_h(a, b, n)
    i = 0
    while i < n:
        k1 = get_k(fx, list_x[i], list_fx[i])
        k2 = get_k(fx, list_x[i] + h / 2, list_fx[i] + h / 2 * k1)
        k3 = get_k(fx, list_x[i] + h / 2, list_fx[i] + h / 2 * k2)
        k4 = get_k(fx, list_x[i] + h, list_fx[i] + h * k3)

        value_fx = list_fx[i] + h / 6 * (k1 + 2 * k2 + 2 * k3 + k4)
        list_fx.append(value_fx)
        i += 1

 2.4初始化配置

# 设置方程表达式
x, y = sp.symbols('x, y')
fx = sp.sin(x) + y
# 设置迭代初始值
init_fx = -1
list_fx = [init_fx]
# 调用四阶荣格库塔方法
method_runge_kutta(fx=fx,
                   list_fx=list_fx,
                   a=0,
                   b=1,
                   n=5)
# 简单打印迭代结果
print("方程:", fx)
print("迭代结果:", list_fx)

        测试结果:


         完整代码

import sympy as sp


def get_list_x_and_h(a,  # 区间起始点
                     b,  # 区间结束点
                     n   # n是划分的次数
                     ):
    """ 获取步长及计算区间 """
    list_x = []
    h = abs(a - b) / n
    for i in list(range(0, n + 1)):
        list_x.append(a + i * h)
    return list_x, h  # h是步长


def get_k(fx,  # 方程表达式
          x,
          y,
          precision_value=5):  # 计算结果保留的有效数字
    """ 计算k值 """
    return fx.evalf(subs={'x': x, 'y': y}, n=precision_value)


def method_runge_kutta(fx,  # 方程表达式
                       list_fx,  # 存储fx值的list
                       a, b, n):
    """ 主循环进行计算 """
    list_x, h = get_list_x_and_h(a, b, n)
    i = 0
    while i < n:
        k1 = get_k(fx, list_x[i], list_fx[i])
        k2 = get_k(fx, list_x[i] + h / 2, list_fx[i] + h / 2 * k1)
        k3 = get_k(fx, list_x[i] + h / 2, list_fx[i] + h / 2 * k2)
        k4 = get_k(fx, list_x[i] + h, list_fx[i] + h * k3)

        value_fx = list_fx[i] + h / 6 * (k1 + 2 * k2 + 2 * k3 + k4)
        list_fx.append(value_fx)
        i += 1


# 设置方程表达式
x, y = sp.symbols('x, y')
fx = sp.sin(x) + y
# 设置迭代初始值
init_fx = -1
list_fx = [init_fx]
# 调用四阶荣格库塔方法
method_runge_kutta(fx=fx,
                   list_fx=list_fx,
                   a=0,
                   b=1,
                   n=5)
# 简单打印迭代结果
print("方程:", fx)
print("迭代结果:", list_fx)

如有任何疑问,请在评论区留言,我会努力回复。

源码github地址:https://github.com/method_runge_kutta

gitee地址:https://gitee.com/darlingxyz/method_runge_kutta/tree/master

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
四阶龙格-库塔(Runge-Kutta)方法Python中一种常用的数值解法,用于求解高阶微分方程。该方法通过给定区间、划分次数和初值条件,可以计算出任意点的原函数值。 如果你想在Python中使用四阶龙格-库塔方法求解微分方程,你可以参考引用中提供的资源。在这些资源中,你可以找到使用Python实现四阶龙格-库塔方法求解高阶微分方程的代码和示例。这些资源可以提供给你一个详细的步骤来使用Python实现四阶龙格-库塔方法。 请注意,为了正确使用四阶龙格-库塔方法,你需要了解高阶微分方程的基本概念和数值计算的原理。同时,你需要熟悉Python编程语言和科学计算库,如NumPy和SciPy。在实现过程中,你需要将微分方程转化为一组一阶微分方程,并使用四阶龙格-库塔方法进行数值求解。 总之,使用Python实现四阶龙格-库塔方法可以帮助你求解高阶微分方程,并得到任意点的原函数值。但是在使用之前,请确保你具备必要的数学和编程知识,并参考资源中的代码和示例来完成实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [用Python实现四阶龙格-库塔(Runge-Kutta)方法求解高阶微分方程.pdf](https://download.csdn.net/download/qq_42818403/25896790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【Python算法数值分析四阶荣格库塔方法](https://blog.csdn.net/qq_50920297/article/details/124020783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [4阶龙格库塔求解微分方程.py](https://download.csdn.net/download/qq_44183524/12385826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值