数学建模:微分方程模型— Python 求解

article/2025/10/10 18:22:28

目录

    • 例:使用显式欧拉法和四阶龙格库塔法计算Lorenz模型
    • scipy.integrate.odeint 求解微分方程模型
    • scipy.integrate.solve_ivp 求解微分方程模型

使用 Python 求常微分方程的数值求解通常是基于一阶方程进行的,高阶微分方程要化成一阶方程组。

例:使用显式欧拉法和四阶龙格库塔法计算Lorenz模型

Lorenz模型是由美国气象学家Lorenz在研究大气运动时,通过简化对流模型,只保留3个变量提出的一个完全确定性的一阶自治常微分方程组(不显含时间变量),其方程为

{ x ˙ = σ ( y − x ) , y ˙ = ρ x − y − x z , z ˙ = x y − β z . \begin{cases} \dot x = \sigma (y - x), \\ \dot y = \rho x - y - xz, \\ \dot z = xy - \beta z. \end{cases} x˙=σ(yx),y˙=ρxyxz,z˙=xyβz.

其中,参数 σ \sigma σ 为 Prandtl 数, ρ \rho ρ 为 Rayleigh 数, β \beta β 为方向比。

这里分别用显式欧拉法和四阶龙格库塔法给出 Lorenz 模型在 σ = 10 , ρ = 28 , β = 8 3 \sigma=10, \rho=28, \beta=\frac{8}{3} σ=10,ρ=28,β=38 时系统的三维演化轨迹,和系统从两个靠的很近的初值出发(相差仅 0.0001 0.0001 0.0001)后,解的偏差演化曲线。显示欧拉法及四阶龙格库塔法详见此处。

#显示欧拉法解lorenz方程
import numpy as np
import matplotlib.pyplot as plt#显式欧拉法
def Euler(f,x0,y0,h,l):#f函数, x0,y0初值, h步长, l数量xn, yn = x0, y0n = 0ys = [y0]while n <= l:n += 1xn += hyn = yn + f(xn,yn) * hys.append(yn)return np.array(ys)#定义函数
def lorenz(t,w):sigma=10; rho=28; beta=8/3x, y, z=wreturn np.array([sigma*(y-x), rho*x-y-x*z, x*y-beta*z])
#t=np.arange(0, 50, 0.01)  #创建时间点
sol1=Euler(lorenz, 0, [0.0, 1.0, 0.0], 0.01, 5000)  #第一个初值问题求解
sol2=Euler(lorenz, 0, [0.0, 1.0001, 0.0], 0.01, 5000)  #第二个初值问题求解#绘图
plt.rc('font',size=16); plt.rc('text',usetex=True)
#图A
ax1=plt.subplot(121,projection='3d')
ax1.plot(sol1[:,0], sol1[:,1], sol1[:,2],'r')
ax1.set_xlabel('$x$'); ax1.set_ylabel('$y$'); ax1.set_zlabel('$z$')
#图B
ax2=plt.subplot(122,projection='3d')
ax2.plot(sol1[:,0]-sol2[:,0], sol1[:,1]-sol2[:,1], sol1[:,2]-sol2[:,2],'g')
ax2.set_xlabel('$x$'); ax2.set_ylabel('$y$'); ax2.set_zlabel('$z$')
plt.show()
#print("sol1=",sol1, '\n\n', "sol1-sol2=", sol1-sol2)

欧拉l

import numpy as np
import matplotlib.pyplot as plt#四阶龙格库塔
def RK4(f,x0,y0,h,maxx):#f函数, x0,y0初值, h步长, maxx: x最大值xn, yn = x0, y0n = 0ys = [yn]while xn < maxx:n += 1xn += hk1 = f(xn,yn)k2 = f(xn + (h / 2),yn + (h * k1) / 2)k3 = f(xn + (h / 2),yn + (h * k2) / 2)k4 = f(xn + h,yn + h * k3)yn = yn + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4)ys.append(yn)return np.array(ys)#定义函数
def lorenz(t,w):sigma=10; rho=28; beta=8/3x, y, z=wreturn np.array([sigma*(y-x), rho*x-y-x*z, x*y-beta*z])
sol1=RK4(lorenz, 0, [0.0, 1.0, 0.0], 0.01, 50)  #第一个初值问题求解
sol2=RK4(lorenz, 0, [0.0, 1.0001, 0.0], 0.01, 50)  #第二个初值问题求解#绘图
plt.rc('font',size=16); plt.rc('text',usetex=True)
#图A
ax1=plt.subplot(121,projection='3d')
ax1.plot(sol1[:,0], sol1[:,1], sol1[:,2],'r')
ax1.set_xlabel('$x$'); ax1.set_ylabel('$y$'); ax1.set_zlabel('$z$')
#图B
ax2=plt.subplot(122,projection='3d')
ax2.plot(sol1[:,0]-sol2[:,0], sol1[:,1]-sol2[:,1], sol1[:,2]-sol2[:,2],'g')
ax2.set_xlabel('$x$'); ax2.set_ylabel('$y$'); ax2.set_zlabel('$z$')
plt.show()
#print("sol1=",sol1, '\n\n', "sol1-sol2=", sol1-sol2)

KLL
两个程序的输出图像中,左图显示出我们经常听到的“蝴蝶效应”。右图给出了系统从两个靠的很近的初值出发(相差仅0.0001)后,解的偏差演化曲线,从图中看出随着时间的增大,两个解的差异越来越大,这正是动力系统对初值敏感性的直观表现。

scipy.integrate.odeint 求解微分方程模型

scipy.integrate 模块的 odeint 函数求常微分方程的数值解的基本调用格式为:

from scipy.integrate import odeint
sol=odeint(func, y0, t)

其中func是定义微分方程的函数或匿名函数,y0是初始条件的序列,t是一个自变量取值的序列(t的第一个元素一定为初始时刻),返回值sol是对应于序列t中元素的数值解,如果微分方程组中有 n n n个函数,返回值sol是 n n n列的矩阵,第 i ( i = 1 , 2 , ⋯ , n ) i(i = 1,2, \cdots ,n) i(i=1,2,,n)列对应于第 i i i个函数的数值解。

示例程序: 用 scipy.integrate.odeint 求解 Lorenz 方程

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
#定义函数
def lorenz(w,t):sigma=10; rho=28; beta=8/3x, y, z=wreturn np.array([sigma*(y-x), rho*x-y-x*z, x*y-beta*z])
t=np.arange(0, 50, 0.01)  #创建时间点
sol1=odeint(lorenz, [0.0, 1.0, 0.0], t)  #第一个初值问题求解
sol2=odeint(lorenz, [0.0, 1.0001, 0.0], t)  #第二个初值问题求解
#绘图
plt.rc('font',size=16); plt.rc('text',usetex=True)
#图A
ax1=plt.subplot(121,projection='3d')
ax1.plot(sol1[:,0], sol1[:,1], sol1[:,2],'r')
ax1.set_xlabel('$x$'); ax1.set_ylabel('$y$'); ax1.set_zlabel('$z$')
#图B
ax2=plt.subplot(122,projection='3d')
ax2.plot(sol1[:,0]-sol2[:,0], sol1[:,1]-sol2[:,1], sol1[:,2]-sol2[:,2],'g')
ax2.set_xlabel('$x$'); ax2.set_ylabel('$y$'); ax2.set_zlabel('$z$')
plt.show()
#print("sol1=",sol1, '\n\n', "sol1-sol2=", sol1-sol2)

scipy.integrate.solve_ivp 求解微分方程模型

求解 { d y d t = f ( t , y ) , y ( t 0 ) = y 0. \begin{cases} \displaystyle{ \frac{\mathrm{d}y}{\mathrm{d}t} }= f(t, y),\\ y(t0) = y0. \end{cases} dtdy=f(t,y),y(t0)=y0.

调用方式:

from scipy.integrate import solve_ivp
slove=scipy.integrate.solve_ivp(fun, t_span, y0, method='RK45', t_eval=None, dense_output=False, events=None, vectorized=False, args=None, **options)

参数:

  1. fun: 定义微分方程的函数, fun(t,y)
  2. t_span: 2 元组的浮点数, 积分区间 (t0, tf)
  3. y0: 数组, 形状 (n,), 初始状态
  4. method: 使用的积分方法, 如Runge-Kutta方法 (‘RK23’、‘RK45’、‘DOP853’)
  5. t_eval: 数组 或 None, 可选, 求解的时间, 必须在 t_span 内, 如果无(默认),则使用求解器选择的点

返回值:

print(slove.t) #时间
print{slove.y) #解

示例程序: 用 scipy.integrate.odeint 求解 Lorenz 方程

from scipy.integrate import solve_ivp
import numpy as np
import matplotlib.pyplot as plt
#定义函数
def lorenz(t,w):sigma=10; rho=28; beta=8/3x, y, z=wreturn np.array([sigma*(y-x), rho*x-y-x*z, x*y-beta*z])
t=np.arange(0, 50, 0.01)  #创建时间点
sol1=solve_ivp(lorenz, (0,50), np.array([0.0, 1.0, 0.0]), 'RK45', t)  #第一个初值问题求解
sol2=solve_ivp(lorenz, (0,50), np.array([0.0, 1.0001, 0.0]), 'RK45', t)  #第二个初值问题求解
#绘图
plt.rc('font',size=16); plt.rc('text',usetex=True)
#图A
ax1=plt.subplot(121,projection='3d')
ax1.plot(sol1.y[0,:], sol1.y[1,:], sol1.y[2,:],'r')
ax1.set_xlabel('$x$'); ax1.set_ylabel('$y$'); ax1.set_zlabel('$z$')
#图B
ax2=plt.subplot(122,projection='3d')
ax2.plot(sol1.y[0,:]-sol2.y[0,:], sol1.y[1,:]-sol2.y[1,:], sol1.y[2,:]-sol2.y[2,:],'g')
ax2.set_xlabel('$x$'); ax2.set_ylabel('$y$'); ax2.set_zlabel('$z$')
plt.show()
#print("sol1=",sol1.y, '\n\n', "sol1-sol2=", sol1.y-sol2.y)

http://chatgpt.dhexx.cn/article/f1qr7Pp0.shtml

相关文章

数学建模预测方法之 微分方程模型

微分方程模型 短、中、长期的预测都适合。 反应事物内部规律及其内在关系&#xff0c;但由于方程的建立是以局部规律的独立性假定为基础&#xff0c;当作为长期预测时&#xff0c;误差较大&#xff0c;且微分方程的解比较难以得到。 具体案例 传染病的预测模型、经济增长&a…

常见的微分方程模型(1)

学习了几个常见的微分方程模型&#xff0c;比如传染病模型和经济增长模型 1.传染病模型 已知已感染人数&#xff08;病人&#xff09;的比例为 i(t) &#xff0c;假设每个病人每天的有效接触的人数为&#xff0c;在一块封闭区域内&#xff0c;总人数为N &#xff0c;健康人的…

微分方程模型的求解方法

微分方程模型的求解方法 在实际问题中经常需要寻求某个变量y随另一变量t的变化规律,yy(t)这个函数关系式常常不能直接求出。然而有时容易建立包含变量及导数在内的关系式&#xff0c;即建立变量能满足的微分方程&#xff0c;从而通过求解微分方程对所研究的问题进行解释说明。…

微分方程模型_天生一对,硬核微分方程与深度学习的「联姻」之路

微分方程真的能结合深度神经网络&#xff1f;真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型&#xff1f;我们将从鄂维南、董彬和陈天琦等研究者的工作中&#xff0c;窥探微分方程与深度学习联袂前行的路径。 近日&#xff0c;北京智源人工智能研究院开展了第…

微分方程模型——偏微分方程

1. 简介 微分方程&#xff1a;描述自然界中存在的物理现象和普遍规律。 常微分方程&#xff08;ODE&#xff09;偏微分方程&#xff08;PDE&#xff09; 偏微分方程理论&#xff1a; 物理/工程问题————翻译&#xff08;建模&#xff09;/物理工程规律————》数学问题…

数学建模——微分方程模型的求解

文章目录 微分方程的符号解法微分方程数值解法一些常用的微分方程模型&#xff08;学习中&#xff0c;持续更新&#xff09;Logistics模型传染病模型 本文介绍微分方程的求解&#xff0c;不介绍微分方程的建立方法 微分方程的符号解法 求解微分方程的符号解主要是依赖于Python…

微分方程模型_常微分方程模型简介

注:本文是刘然对常微分方程模型的简介 什么是常微分方程模型 常用的回归分析聚焦于直接建立响应变量和协变量之间的关系,之后根据建立的模型进行分析和预测,比如常见的线性回归模型:。 而如果我们感兴趣的变量是随时间变化的,那么还有另外一种常用的建模方式:建立变量与变…

数学建模【微分方程模型(介绍、分析方法、数值模拟、传染病问题的建模和分析、经济增长模型、人口增长预测和控制模型)】

&#x1f680;【MOOC数学建模与实验---学习笔记---整理汇总表】&#x1f680; &#x1f308;【学习网址&#xff1a;MOOC---郑州轻工业大学---数学建模与实验】&#x1f308; 【第1、2章】【概述、软件介绍】【第3章】【数据处理方法】【第4章】【规划模型】【第5章】【图与网络…

数学建模理论自制笔记1:微分方程及其模型

1、微分方程基础概念&#xff1a; 微分方程&#xff1a;含有自变量、未知函数及未知函数的导数或微分的等式&#xff0c;其定义式为&#xff1b;常微分方程&#xff08;Ordinary Differential Equations, ODE&#xff09;&#xff1a;不含偏导数或偏微分的微分方程&#xff0c…

微分方程模型

微分方程模型简介 在研究生物、经济等学科的实际问题时&#xff0c;常常会联系到某些变量的变化率或导数&#xff0c;这样所得到变量之间的关系式就是微分方程。微分方程反映的是变量之间的间接关系&#xff0c;因此&#xff0c;要得到直接关系&#xff0c;就得求解微分方程。…

【数学建模】常用微分方程模型 + 详细手写公式推导 + Matlab代码实现

文章目录 一、学习内容二、学习时间三、学习产出3.1 微分方程基本概念3.2 微分方程在数学建模中的应用3.3 微分方程常用模型3.3.1 人口增长模型3.3.1.1 指数增长模型(马尔萨斯模型)3.3.1.2 阻滞增长模型(Logistic模型)3.3.1.3 人口模型小结 3.3.2 传染病模型3.3.2.1 SI模型3.3.…

数学建模之微分方程模型详解

全文共10110个字&#xff0c;码字总结不易&#xff0c;老铁们来个三连&#xff1a;点赞、关注、评论 作者&#xff1a;[左手の明天] 原创不易&#xff0c;转载请联系作者并注明出处 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c…

Station P2(ROC-RK3568-PC) 裸机开发5_RKUBoot TPL

完整编译 u-boot-next-dev&#xff1a;./make.sh rk3568 2>&1 >log.txt 生成两个主要的文件是&#xff1a; RKLoader&#xff1a;rk356x_spl_loader_v1.08.111.bin Uoot FIT Image&#xff1a;uboot.img 两个都是有特定格式的混合文件。 RKLoader 的生成&#xf…

tpl怎么搞_emlog后台模板设置功能插件tpl_options

到目前为止emlog都没有集成模板后台设置功能&#xff0c;可能是和emlog一直走轻量级路径有关。但是集成模板后台配置功能&#xff0c;无论是对emlog模板开发者还是用户来说&#xff0c;其作用都非常大&#xff0c;可以使一些模板功能不需要修改模板文件就可以改变设置&#xff…

tpl.js的使用

tpl.js的使用 tpl.js简介1.如何写模板2.如何引用模板tpl.js的下载地址 tpl.js简介 tpl.js是用于和require.js相结合的html模板,和template.js的用法非常相似&#xff0c;我们可以从以下几点来学习它&#xff0c;我们先来看一下小案例中的目录结构&#xff1a; 1.如何写模板 …

vscode配置tpl文件关联html语言

使用beego框架的时候&#xff0c;有个操作&#xff0c;需要将tpl文件修改vscode识别成html&#xff1b; 有两种方法&#xff1a; 方法一&#xff1a;页面配置 ctrl shift p 选择打开工作区设置 找到Files:Associations文件关联 添加项&#xff1a;*.tpl html 方法二&…

基于JAVA的TPL解释器

基于JAVA的TPL解释器 编写一个Java程序&#xff0c;该程序读取一个文件中的TPL指令&#xff08;见下文&#xff09;&#xff0c;并执行这些指令。该语言编写的程序每一行都必须以这些单词中的一个开头&#xff0c;不区分大小写。具体代码可参考链接 https://download.csdn.net…

U-Boot 之零 源码文件、启动阶段(TPL、SPL)、FALCON、设备树

最近&#xff0c;工作重心要从裸机开发转移到嵌入式 Linux 系统开发&#xff0c;在之前的博文 Linux 之八 完整嵌入式 Linux 环境、&#xff08;交叉&#xff09;编译工具链、CPU 体系架构、嵌入式系统构建工具 中详细介绍了嵌入式 Linux 环境&#xff0c;接下来就是重点学习一…

java .tpl是什么模版_tpl标签定义

canonical 阅读(996) 评论(0) 编辑 收藏 所属分类: Witrix开发平台 tpl自定义标签的设计目标之一是尽量减少配置说明项. 在tpl标签库中, 标签定义格式如下 importVars"varA, varB" otherArgs"optionalArgA, optionalArgB" localScope"trueOrFalse&q…

创建TPL自定义模板

文件布局 <!--1d7c7a527b6335cc7a623305ca940e1findex.tpl.html--><!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999…