四阶龙格库塔法求解一次常微分方程组(python实现)

news2024/10/7 10:22:35

四阶龙格库塔法求解一次常微分方程组

  • 一、前言
  • 二、RK4求解方程组的要点
    • 1. 将方程组转化为RK4求解要求的标准形式
    • 2. 注意区分每个方程的独立性
  • 三、python实现RK4求解一次常微分方程组
    • 1. 使用的方程组
    • 2. python代码
    • 3. 运行结果

一、前言

之前在博客发布了关于使用四阶龙格库塔方法求解一次常微分方程组的文章,由于代码缺少具体的验证,部分朋友可能存在疑问,因此这里打算再重新写一篇博客来验证一下程序的正确性,另外,这里是使用python语言来实现的。

二、RK4求解方程组的要点

使用RK4求解一元方程的过程是非常容易的,但是当转变成多变量的情况下,如何求解方程组,可能有部分朋友会出现问题,这里我总结出来主要有以下要点。

1. 将方程组转化为RK4求解要求的标准形式

RK4求解要求方程具有形如 y ˙ = f ( y , t ) \dot{y}=f(y,t) y˙=f(y,t)的形式,即是在方程的左边只有变量的一阶微分项,方程的右边包含变量项和自变量项,对于n元情况,我们需要有n个方程,每个方程对应一个自变量项,形式如下:
{ y 1 ˙ = f 1 ( y 1 , ⋯   , y n , t ) ⋮ y n ˙ = f n ( y 1 , ⋯   , y n , t ) \begin{cases} \dot{y_1}=f_1(y_1, \cdots, y_n, t)\\ \quad \quad \vdots \\ \dot{y_n}=f_n(y_1, \cdots, y_n, t)\\ \end{cases} y1˙=f1(y1,,yn,t)yn˙=fn(y1,,yn,t)
转化为标准形式之后就可以进行求解了。

2. 注意区分每个方程的独立性

RK4求解是通过指定一个较小的步进距离,来逐步求解前进一步之后的函数值,每一步下的函数值求解都需要用到前一步的结果,属于递推过程。对于方程组的求解过程,独立性是指针对某个特定变量时,递推公式中只改变特定变量的递推关系,而其它变量不变,例如,方程组中 y i y_i yi的第m+1项的RK4递推关系可以写作:
{ h m = t m + 1 − t m k 1 i m = f i ( y 1 m , ⋯   , y i m , ⋯   , y n m , t m ) k 2 i m = f i ( y 1 m , ⋯   , y i m + h m 2 k 1 m , ⋯   , y n m , t m + h m 2 ) k 3 i m = f i ( y 1 m , ⋯   , y i m + h m 2 k 2 m , ⋯   , y n m , t m + h m 2 ) k 4 i m = f i ( y 1 m , ⋯   , y i m + h m k 3 m , ⋯   , y n m , t m + h m ) y i m + 1 = y i m + h m 6 ( k 1 i m + 2 k 2 i m + 2 k 3 i m + k 4 i m ) \begin{cases} h_m = t_{m+1}-t_m \\ k_{1i}^{m} = f_i(y_1^m, \cdots, y_i^m,\cdots, y_n^m, t_m)\\ k_{2i}^{m} = f_i(y_1^m, \cdots,y_i^m+\frac{h_m}{2}k_1^m,\cdots,y_n^m, t_m+\frac{h_m}{2})\\ k_{3i}^{m} = f_i(y_1^m,\cdots,y_i^m+\frac{h_m}{2}k_2^m,\cdots,y_n^m,t_m+\frac{h_m}{2})\\ k_{4i}^{m} = f_i(y_1^m,\cdots,y_i^m+h_mk_3^m,\cdots,y_n^m,t_m+h_m)\\ y_i^{m+1} = y_i^m+\frac{h_m}{6}(k_{1i}^m+2k_{2i}^m+2k_{3i}^m+k_{4i}^m) \end{cases} hm=tm+1tmk1im=fi(y1m,,yim,,ynm,tm)k2im=fi(y1m,,yim+2hmk1m,,ynm,tm+2hm)k3im=fi(y1m,,yim+2hmk2m,,ynm,tm+2hm)k4im=fi(y1m,,yim+hmk3m,,ynm,tm+hm)yim+1=yim+6hm(k1im+2k2im+2k3im+k4im)
可以看到在RK4关键变量 k 1 , k 2 , k 3 , k 4 k_1,k_2,k_3,k_4 k1,k2,k3,k4的求解过程中,表达式右边只有第 y i y_i yi项对应的部分代入的值有变化,其它 y ∗ y_* y项代入的都是上一步(第m步)的计算结果。

三、python实现RK4求解一次常微分方程组

1. 使用的方程组

这里使用的方程组如下图所示:
equations
可以看到该问题存在解析解,解析解留作验证结果准确性。

2. python代码

实现过程中主要使用了numpy库和matplotlib库,以下为代码:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def funcXt(x, y):
    return x + 2.0*y

def funcYt(x, y):
    return 3.0*x + 2.0*y

### RK4求解
t_ini = 0                     # tmin
t_end = 10.0                  # tmax
t_h = 1e-5                    # 步进长度

t = np.linspace(t_ini, t_end, int((t_end-t_ini)/t_h+1))
x = t.copy()
y = t.copy()
x[0] = 6.0
y[0] = 4.0
for i in range(t.shape[0]-1):
    h_i = t[i+1] - t[i]

    k1_x = funcXt(x[i], y[i])
    k1_y = funcYt(x[i], y[i])

    k2_x = funcXt(x[i]+h_i/2.0*k1_x, y[i])
    k2_y = funcYt(x[i], y[i]+h_i/2.0*k1_y)

    k3_x = funcXt(x[i]+h_i/2.0*k2_x, y[i])
    k3_y = funcYt(x[i], y[i]+h_i/2.0*k2_y)

    k4_x = funcXt(x[i]+h_i*k3_x, y[i])
    k4_y = funcYt(x[i], y[i]+h_i*k3_y)

    x[i+1] = x[i] + h_i/6.0*(k1_x+2.0*k2_x+2.0*k3_x+k4_x)
    y[i+1] = y[i] + h_i/6.0*(k1_y+2.0*k2_y+2.0*k3_y+k4_y)

### 解析函数
x_anly = 4.0*np.exp(4.0*t) + 2.0*np.exp(-1.0*t)
y_anly = 6.0*np.exp(4.0*t) - 2.0*np.exp(-1.0*t)

### 画图
plt.subplot(1, 2, 1)
plt.plot(t, x, 'b', label='RK4')
plt.plot(t, x_anly, 'r--', label='Analytic')
plt.legend()
plt.xlabel('t')
plt.ylabel('x')
plt.title('x-t')

plt.subplot(1, 2, 2)
plt.plot(t, y, 'b', label='RK4')
plt.plot(t, y_anly, 'r--', label='Analytic')
plt.legend()
plt.xlabel('t')
plt.ylabel('y')
plt.title('y-t')

# ### 相对误差
# plt.subplot(1, 2, 1)
# plt.scatter(t, (x-x_anly)/x_anly, s=3, label=r'$\frac{x-x_{anly}}{x_{anly}}$')
# plt.legend()
# plt.xlabel('t')
# plt.ylabel('error')
# plt.title('x error')

# plt.subplot(1, 2, 2)
# plt.scatter(t, (y-y_anly)/y_anly, s=3, label=r'$\frac{y-y_{anly}}{y_{anly}}$')
# plt.legend()
# plt.xlabel('t')
# plt.ylabel('error')
# plt.title('y error')

3. 运行结果

运行结果为:
output
output1
以上分别是t在0-10和0-1区间上的运行结果,可以看到RK4的计算精度较高,与理论结果较为接近,另外可以看下在0-1区间上RK4的结果相较于理论结果的相对误差:
error
可以看到随着运行步数的增加,RK4计算结果的误差会出现累积,但总体保持在一个相对很低的水平,误差累积的速度较慢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节测试开发最牛教程,全栈Jmeter_性能测试(总结)

Jmeter_性能测试(4): 性能测试脚本的优化 以PHP论坛为例:http://47.107.178.45/phpwind/ 根据上一篇的性能测试(3)的脚本进行优化;见下图: 如上图中,把发帖和回帖的事务添加到随机控制器中,登…

一例cobalt Strike 反射式注入payload的分析

一例cobalt Strike payload 反射式dll注入的分析 QakBot(Qbot)与cobalt Strike恶意流量样本分析 | Demon (ggsec.cn)这篇博客中末尾提到了一个cobastrick的payload,这是一段shellcode,主要功能是的解密出一个dll,采用反射式注入的方式启动这…

EC 中的Keyboard Controller

Keyboard Controller简称KBC,它是EC芯片中一个用于处理Keyboard、Mouse的模块,也可以说,它只是一个通道,因为最后处理数据的还是交给EC 8032处理器去处理。KBC只处理挂在EC PS/2接口上的设备,假如接了个usb键盘或鼠标,那可不关它的事。PS/2设备只有两种,即Keyboard和Mou…

React 的设计理念(React 哲学)

文章目录React 的设计理念 的理解解决 CPU 瓶颈解决 IO 瓶颈React 的设计理念 的理解 从 React 官网中的 React 哲学文档中,可以看出 React 目的是实现快速响应 影响快速响应的因素:计算能力和网络延迟,即 CPU 和 IO 的瓶颈 解决 CPU 瓶颈 …

再见 ETH India 2022 建设者们 让我们一起回顾这个美好的建设周

很难超越的1700名黑客马拉松比赛,但是以太坊社区出现并打破了ETH India 2022 的新记录。来自321个城市的2000名与会者在短短的一个周内构建并部署了多达459个项目到以太坊生态系统中。你可能错过了过去一周发生的一切,但幸运的是,我们收集了所…

智能设备带来全新体验,打造未来智能生活

随着科技的快速发展,我们的生活变得越来越智能化,近年来智能设备已经遍布我们生活的各个领域,推动了生产能力和质量,给人们的生活带来了极大的便利。智能设备的出现和发展是时代进步的必然产物,高效、安全、准确性高&a…

【蓝桥杯选拔赛真题50】Scratch小猫跑步 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch小猫跑步 一、题目要求 编程实现 二、案例分析 1、角色分析

mybatis写postgis原生sql需要加强转类型 以及 配置geometry类型转换

mybatis类型转换器处理PostGis数据库geometry类型转换_SomeOtherTime的博客-CSDN博客_java mybatis postgis 在navicate写insert into "district" (name,code,position) VALUES(cesh2i3,ac1v3,SRID4326;MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0))) 不会报错。 在mybat…

[附源码]计算机毕业设计高校学生信息采集系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

虹科案例 | 光热测厚技术助力PSA无底漆涂装方案

法国标致雪铁龙集团(PSA Peugeot Citron)最开始是生产胡椒研磨机,然后将其产品组合扩展到自行车等,现在已经是欧洲第二大汽车制造商。巴黎郊外的普瓦西(Poissy) 工厂安装了法国首个紧凑型水性喷漆工艺&…

漏洞预警| ThinkPHP多版本存在远程代码执行漏洞

棱镜七彩安全预警 近日网上有关于开源项目 ThinkPHP 存在远程代码执行漏洞,棱镜七彩威胁情报团队第一时间探测到,经分析研判,向全社会发起开源漏洞预警公告,提醒相关安全团队及时响应。 项目介绍 ThinkPHP是一个快速、兼容而且…

制定项目管理计划的10个步骤

一个协调完美、透明、时间表具体且准确的项目管理计划,将大大有助于你的项目按时完成。以下是制定项目计划的10个基本步骤。 第1步:与利益相关者讨论计划和关键部分 项目计划由活动文件组成,这些文件为所有直接或间接参与项目的人提供指导。…

如何开通股票接口中的StockQuoteRecord功能?

股票接口中的StockQuoteRecord,也就是十档行情快照,在传统的行情软件中只能看到委托数量,而无法知道这些数据是如何形成的。 下面看一下股票接口StockQuoteRecord(十档行情快照)的说明: 字段名 类型 备…

【数集项目之 MCDF】(三) 仲裁器 arbiter

接下来进行仲裁器 arbiter的设计。根据设计文档,我们知道从输入总共有3个通道,而这三个通道很有可能都接收到数据可以进行发送。而arbiter就是综合优先级、是否有包可以发送等因素,选择一个通道来进行发送。形象的可以将arbiter比喻成“一个多…

FineReport可视化数据分析-图表对象属性

1.概述 1.1 单个系列对象属性 属性 类型 说明 this.points Array 当前系列的所有数据点 this.name String 当前系列的名字,跟图例显示的系列名一致 this.type String 当前系列的图表类型,目前包括的类型如下图所示: 1.2 单个数…

图解TCP_IP 第5版

图解TCP_IP 第5版1.7.1 面向有连接型与面向无连接型1.7.2 电路交换与分组交换1.7.3 单播、广播、多播和任播1.9.1 通信媒介1.9.1 传输速率、带宽和吞吐量1.9.2 网卡1.9.3 中继器与集线器1.9.4 网桥/2 层交换机1.9.5 路由器/3层交换机1.9.6 4~7 层交换机1.9.7 网关2.2.1 TCP/IP …

matplotlib安装及使用

目录 1、Matplotlib简介 2、Matplotlib安装 3、Matplotlib导入 4、Matplotlib基本应用 5、画图种类 5.1、Scatter散点图 5.2、条形图 5.3、等高线图 5.4、Image图片 5.5、3D图像 6、多图合并显示 6.1、Subplot多合一显示 6.2、SubPlot分格显示 6.3、图中图 6.4、…

保护大数据安全的十大行为准则

大数据安全是指在存储、处理和分析过于庞大和复杂的数据集时,采用任何措施来保护数据免受恶意活动的侵害,传统数据库应用程序无法处理这些数据集。大数据可以混合结构化格式(组织成包含数字、日期等的行和列)或非结构化格式(社交媒体数据、PDF 文件、电子…

YourKit Java Profiler 命令行工具自动弹出

YourKit Java Profiler 命令行工具自动弹出 识别处理器和内存从来都不容易。 YourKit为程序开发了两个阶段的开发和开发革命。 YourKit Java Profiler软件的功能和特点: 以任何方式为团队和公司在开发、测试和生产中,以不同的操作系统、本地和远程方式指…

Python多项分布随机数的生成

文章目录二项分布多项分布函数概率密度函数(PDF)备注binomial(n, p)P(k)(nk)pk(1−p)n−kP(k) \binom{n}{k}p^k(1-p)^{n-k}P(k)(kn​)pk(1−p)n−k二项分布poisson([lam])f(k)λke−λk!f(k)\frac{\lambda^ke^{-\lambda}}{k!}f(k)k!λke−λ​泊松分布multinomial(n, pvals)多…