数学模型:Python实现微分方程

news2025/2/12 19:53:35

文章摘要:微分方程的Python实现。
参考书籍:数学建模算法与应用(第3版)司守奎 孙玺菁。
PS1:只涉及了具体实现并不涉及底层理论。没有给出底层理论参考书籍的原因是不想做这个方向吧。所以对我只要掌握基本模型有个概念那就好了。
PS2:这里跳过两个章节直接来到微分方程那是因为:第四章节我想划归到算法学习里,因为图领域感觉挺大的并且我挺有兴趣的想好好学习下。第五章节归属数值分析范畴,我已经从底层理论完成这部分的内容,可以参考这篇文章。
文章声明:如有发现错误,还望批评指正。

文章目录

  • 微分方程的符号解
    • 参考书籍例6.6
    • 参考书籍例6.7
    • 参考书籍例6.8
  • 微分方程的数值解
    • 病毒传播模型
      • 指数传播模型
      • SI模型
      • SIS模型
      • SIR模型
    • Logistic模型

由于微分方程不在博主兴趣范畴之内,我们针对几个常见模型进行Python的实现。

微分方程的符号解

符号解就是解析解,该解十分精确。有些方程没符号解。我们这里只讨论有符号解的微分方程。

参考书籍例6.6

求解如右柯西问题 { d x d t = A x x ( 0 ) = [ 1 , 1 , 1 ] T 解,其中 x ( t ) = [ x 1 ( t ) , x 2 ( t ) , x 3 ( t ) ] T , A = [ 3 − 1 1 2 0 − 1 1 − 1 2 ] . 求解如右柯西问题\left\{\begin{matrix}\frac{d\mathbf{x}}{dt}=\mathbf{Ax}\\\mathbf{x}(0)=[1,1,1]^T\end{matrix}\right.解,其中\mathbf{x}(t)=[x_1(t),x_2(t),x_3(t)]^T,A=\begin{bmatrix}3&-1&1\\2&0&-1\\1&-1&2\end{bmatrix}. 求解如右柯西问题{dtdx=Axx(0)=[1,1,1]T解,其中x(t)=[x1(t),x2(t),x3(t)]T,A= 321101112 .

import sympy as sp
sp.var('t')
sp.var('x1:4',cls=sp.Function)
x=sp.Matrix([x1(t),x2(t),x3(t)])
A=sp.Matrix([[3,-1,1],[2,0,-1],[1,-1,2]])
eq=x.diff(t)-A@x
print(sp.dsolve(eq,ics={x1(0):1,x2(0):1,x3(0):1}))

在这里插入图片描述
PS1:代码在编译器内会显示异常,这是因为没有找到变量声明。但是能够顺利运行,因为代码底层已经声明变量。
PS2:虽然正确但是强迫症很难受。所以下面不会采用这种方法。

参考书籍例6.7

[ x 1 ′ ( t ) x 2 ′ ( t ) x 3 ′ ( t ) ] = [ 1 0 0 2 1 − 2 3 2 1 ] [ x 1 ( t ) x 2 ( t ) x 3 ( t ) ] + [ 0 0 e t c o s ( 2 t ) ] , [ x 1 ( 0 ) x 2 ( 0 ) x 3 ( 0 ) ] = [ 0 1 1 ] 。 \begin{bmatrix}x_1'(t)\\x_2'(t)\\x_3'(t)\end{bmatrix}=\begin{bmatrix}1&0&0\\2&1&-2\\3&2&1\end{bmatrix}\begin{bmatrix}x_1(t)\\x_2(t)\\x_3(t)\end{bmatrix}+\begin{bmatrix}0\\0\\e^tcos(2t)\end{bmatrix},\begin{bmatrix}x_1(0)\\x_2(0)\\x_3(0)\end{bmatrix}=\begin{bmatrix}0\\1\\1\end{bmatrix}。 x1(t)x2(t)x3(t) = 123012021 x1(t)x2(t)x3(t) + 00etcos(2t) , x1(0)x2(0)x3(0) = 011

import sympy as sp
t=sp.var('t')
x1=sp.Function('x1')(t);x2=sp.Function('x2')(t);x3=sp.Function('x3')(t)
con1=sp.Eq(x1.diff(t),x1);con2=sp.Eq(x2.diff(t),2*x1+x2-2*x3);con3=sp.Eq(x3.diff(t),3*x1+2*x2+x3+sp.exp(t)*sp.cos(2*t))
con_initial={x1.subs(t,0):0,x2.subs(t,0):0,x3.subs(t,0):0}
print(sp.dsolve((con1,con2,con3),[x1,x2,x3],ics=con_initial))

在这里插入图片描述

参考书籍例6.8

求常微分方程组 { f ′ ′ + 3 g ′ + f ′ = 1 ,边值条件 f ′ ( 1 ) = 0 , f ( 0 ) = 0 , g ( 0 ) = 0 时的解 求常微分方程组\left\{\begin{matrix}f''+3\\g'+f'=1\end{matrix}\right.,边值条件f'(1)=0,f(0)=0,g(0)=0时的解 求常微分方程组{f′′+3g+f=1,边值条件f(1)=0,f(0)=0,g(0)=0时的解

import sympy as sp
x=sp.var('x')
f=sp.Function('f')(x);g=sp.Function('g')(x)
con1=sp.Eq(f.diff(x,2)+g,3);con2=sp.Eq(f.diff(x)+g.diff(x),1)
con_initial={f.diff(x).subs(x,0):0,f.subs(x,0):0,g.subs(x,0):0}
print(sp.dsolve((con1,con2),[f,g],ics=con_initial))

在这里插入图片描述

微分方程的数值解

没有什么兴趣,所以不想去做。但是最近正在手搓数值分析。或许可以放到那里。

病毒传播模型

指数传播模型

基本假设:
1)问题研究区域封闭,一个时期人口总量基本不变。2) t t t时刻染病人数 N ( t ) N(t) N(t)连续变化并且可微。3)每个病人单位时间,有效使人致病人数为 λ \lambda λ 4)模型期间不会死亡
数学模型:
{ d N ( t ) d t = λ N ( t ) , t > 0 N ( 0 ) = N 0 \left\{\begin{matrix}\frac{dN(t)}{dt}=\lambda N(t),t>0\\N(0)=N_0\end{matrix}\right. {dtdN(t)=λN(t),t>0N(0)=N0
模型解得:
N ( t ) = N 0 e λ t N(t)=N_0e^{\lambda t} N(t)=N0eλt

import matplotlib.pyplot as plt
import math
N0=100;T=30;la=5
lt=[N0*pow(math.e,la*i) for i in range(1,T+1)]
plt.figure(figsize=(16,9));plt.grid();plt.rcParams['font.sans-serif']=['SimHei']
plt.plot([i for i in range(1,T+1)],lt,ms=10,marker="o",linewidth=5,color="black")
plt.xlabel("时间",size=15);plt.ylabel("人数",size=15);plt.show()

在这里插入图片描述
模型补充:
这样算的是第T天感染人数,不是总的感染人数,所以应该把前面的全加起来(小声:感觉书上错了)
结果分析:
显然指数增长那是不正确的。

SI模型

基本假设:
1)问题研究区域封闭,一个时期人口总量基本不变,总人口 N N N。2)人群分为两种健康人群患病人群,设置两种人群占全人群分别为 s ( t ) s(t) s(t) i ( t ) i(t) i(t),易 s ( t ) + i ( t ) = 1 s(t)+i(t)=1 s(t)+i(t)=1 3)日感染率为 λ \lambda λ
数学模型:
{ d i ( t ) d t = λ i ( t ) ( 1 − i ( t ) ) , t > 0 i ( 0 ) = i 0 \left\{\begin{matrix}\frac{di(t)}{dt}=\lambda i(t)(1-i(t)),t>0\\i(0)=i_0\end{matrix}\right. {dtdi(t)=λi(t)(1i(t)),t>0i(0)=i0
模型解得:
i ( t ) = 1 1 + ( 1 i 0 − 1 ) e − λ t i(t)=\frac{1}{1+(\frac{1}{i_0}-1)e^{-\lambda t}} i(t)=1+(i011)eλt1

import matplotlib.pyplot as plt
import math
i0=0.1;la=0.01;T=365*3+366
lt=[1/(1+(1/i0-1)*pow(math.e,-la*i)) for i in range(1,T+1)]
plt.figure(figsize=(16,9));plt.grid();plt.rcParams['font.sans-serif']=['SimHei']
plt.plot([i for i in range(1,T+1)],lt,marker="o",linewidth=5,color="black")
plt.xlabel("时间",size=15);plt.ylabel("比例",size=15);plt.show()

在这里插入图片描述

SIS模型

模型假设:
1)同SI模型2)每天治愈人数占总人数比例为u
数学模型:
{ d i ( t ) d t = λ i ( t ) ( 1 − i ( t ) ) − u i ( t ) , t > 0 i ( 0 ) = i 0 \left\{\begin{matrix}\frac{di(t)}{dt}=\lambda i(t)(1-i(t))-ui(t),t>0\\i(0)=i_0\end{matrix}\right. {dtdi(t)=λi(t)(1i(t))ui(t),t>0i(0)=i0
模型解得:
i ( t ) = { [ λ λ − u + ( 1 i 0 − λ λ − u ) e − ( λ − u ) t ] − 1 , λ ≠ u i ( 0 ) = i 0 , λ = u i(t)=\left\{\begin{matrix}[\frac{\lambda}{\lambda-u}+(\frac{1}{i_0}-\frac{\lambda}{\lambda-u})e^{-(\lambda-u)t}]^{-1},\lambda \neq u\\i(0)=i_0,\lambda=u\end{matrix}\right. i(t)={[λuλ+(i01λuλ)e(λu)t]1,λ=ui(0)=i0,λ=u

import matplotlib.pyplot as plt
import math
def func(i):
    global la,u,i0
    if la==u:
        return pow(la*i+1/i0,-1)
    return pow(la/(la-u)+(1/i0-la/(la-u))*pow(math.e,-(la-u)*i),-1)
la=0.05;u=0.05;i0=0.5;T=365*3+366
lt=[func(i) for i in range(1,T+1)]
plt.figure(figsize=(16,9));plt.grid();plt.rcParams['font.sans-serif']=['SimHei']
plt.plot([i for i in range(1,T+1)],lt,marker="o",linewidth=5,color="black")
plt.xlabel("时间",size=15);plt.ylabel("比例",size=15);plt.show()

在这里插入图片描述
结果分析:
我这里是 λ \lambda λ等于 u u u。可自己调。当 λ ≤ u \lambda\leq u λu所有人最后都会被治愈。当 λ > u \lambda>u λ>u最后总有一小部分的人保持健康。

SIR模型

基本假设:
1)人群分为3类A:健康人士(没有患过)B:患病人士C:健康人士(曾经患过)分别记: s ( t ) , i ( t ) , r ( t ) s(t),i(t),r(t) s(t),i(t),r(t) 2)日感染率,日治愈率记: λ , u \lambda,u λ,u 3)总人口 N N N
数学模型:
i ( t ) = { d i ( t ) d t = λ s ( t ) i ( t ) − u i ( t ) d s ( t ) d t = − λ s ( t ) i ( t ) d r ( t ) d t = u i ( t ) i ( 0 ) = i 0 , s ( 0 ) = s 0 , r ( 0 ) − 0 i(t)=\left\{\begin{matrix}\frac{di(t)}{dt}=\lambda s(t)i(t)-ui(t)\\\frac{ds(t)}{dt}=-\lambda s(t)i(t)\\\frac{dr(t)}{dt}=ui(t)\\i(0)=i_0,s(0)=s_0,r(0)-0\end{matrix}\right. i(t)= dtdi(t)=λs(t)i(t)ui(t)dtds(t)=λs(t)i(t)dtdr(t)=ui(t)i(0)=i0,s(0)=s0,r(0)0
模型求解:
这是一个常微分方程组,难以求解析解。可以用Python求数值解。

def sir_model(t,y,la,u):
    S,I,R=y[0],y[1],y[2]
    dSdt=-la*S*I;dIdt=la*S*I-u*I;dRdt=u*I
    return [dSdt,dIdt,dRdt]
S0=0.99;I0=0.01;R0=0.0;la=0.2;u=0.1;t_start=0;t_end=365*3+366;y0=(S0,I0,R0);t_span=[i for i in range(t_end+1)]
from scipy.integrate import solve_ivp
solution=solve_ivp(sir_model,[t_start,t_end],y0,args=(la,u),t_eval=t_span)
S=solution.y[0];I=solution.y[1];R=solution.y[2]
import matplotlib.pyplot as plt
plt.figure(figsize=(16,9));plt.grid();plt.rcParams['font.sans-serif']=['SimHei']
plt.plot(solution.t,S,label='A类人士')
plt.plot(solution.t,I,label='B类人士')
plt.plot(solution.t,R,label='C类人士')
plt.xlabel('时间');plt.ylabel('比例');plt.legend();plt.show()

在这里插入图片描述

Logistic模型

模型假设:
1)设 r ( x ) r(x) r(x) x x x线性函数,所以 r ( x ) = r − s x r(x)=r-sx r(x)=rsx。2)地球容纳最大人数为 x m x_m xm
PS:这里我们可以化 r ( x ) r(x) r(x) r ( 1 − x x m ) r(1-\frac{x}{x_m}) r(1xmx).仔细想想,不难理解
模型建立:
{ d x d t = r ( 1 − x x m ) x , x ( t 0 ) = x 0 . \left\{\begin{matrix}\frac{dx}{dt}=r(1-\frac{x}{x_m})x,\\x(t_0)=x_0.\end{matrix}\right. {dtdx=r(1xmx)x,x(t0)=x0.
PS:这里是一个可以用分离变量方法解的方程,应该不难。
模型解得:
x ( t ) = x m 1 + ( x m x 0 − 1 ) e − r ( t − t 0 ) x(t)=\frac{x_m}{1+(\frac{x_m}{x_0}-1)e^{-r(t-t_0)}} x(t)=1+(x0xm1)er(tt0)xm
这个有解析解就不写代码了。

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

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

相关文章

年度创新企业奖!移远通信成推动AIoT融合落地关键力量

6月8日,由ASPENCORE主办的2023国际AIoT生态发展大会在深圳召开,移远通信受邀出席大会并发表演讲,同时凭借在5G、AIoT等领域的持续创新荣获“年度创新企业”奖! 5GAIoT“双引擎” 重塑物联产业 近些年,从互联网、物联网…

汽车仪表中控开发中视频相关的一些知识点

前言: 做汽车仪表/IVI中控,尤其是IVI信息娱乐部分,都要涉及到视频这个知识点,各种概念很多,首先需要明确一条主线,那就是SDTV标清电视->HDTV高清电视->UHDTV超高清电视的一个发展脉络,BT601/656是SDTV标清电视接口,BT1120则对应HDTV高清电视接口。ITU-R BT.601/6…

2022 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题

2022 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题 一. 逻辑推理:第 26~55 小题,每小题 2 分,共 60 分。下列每题给出的 A、B、C、D、E 五个选项中,只有一项是符合试题要求的。 26.百年党史充分揭示了中国共产党为什么…

Qemu 逃逸基础知识

QEMU 与 KVM 架构 QEMU 与 KVM 的完整架构如下图所示。 QEMU 与 KVM 架构整体上分为 3 个部分: VMX root 模式的应用层,即图中左上部分,属于 qemu 进程。VMX root 模式的内核层,即图中下半部分,属于 kvm 驱动。VMX …

吴恩达471机器学习入门课程2第1周——手写数字识别(0和1)

用于手写数字识别的神经网络(0和1) 问题描述1.导入模块2. 数据集2.1 数据可视化 3 模型展示 使用神经网络来识别手写数字 0 和 1。 问题描述 在这个练习中,您将使用神经网络来识别手写数字“0”和“1”。这是一个二元分类任务。 自动手写数…

20JS11——JS对象

文章目录 一、对象二、创建对象的三种方式1、利用字面量创建对象1.1 使用对象1.2 变量、属性、函数、方法总结2、利用new Object创建对象3、利用构造函数创建对象(1)为什么使用构造函数?(2)利用构造函数创建对象&#…

Java8日期时间类LocalDateTime格式化

LocalDateTime日期时间格式化 LocalDateTime localDateTime LocalDateTime.now() System.out.println(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")测…

000网络常见的资源推荐

博客 分类: 图解网络 | 小白debug有时骚话连篇,有时硬核图解https://xiaobaidebug.top/categories/%E5%9B%BE%E8%A7%A3%E7%BD%91%E7%BB%9C/网络攻击常见手段总结 | JavaGuide(Java面试 学习指南)本文整理完善自TCP/IP 常见攻击手段 - 暖蓝笔记 - 2021这篇文章。 这…

window下安装docker并运行angular项目

window下安装docker并运行angular项目 1、使用场景 本地有一个node项目,node 版本是 v16.13.2,在本地安装的angular 是 15.2.4 但是测试服上面的node 版本是 14.19.3,angular 是1.0.0-beta.28.3 ,会导致angular项目的 ng build …

吴恩达471机器学习入门课程1第3周——逻辑回归

文章目录 Logistic Regression1、导包2、逻辑回归2.1、问题描述2.2、加载数据集数据可视化 2.3、sigmod function2.4 逻辑回归的代价函数2.5 逻辑回归的梯度2.6 使用梯度下降学习参数 测试可视化2.8 评估逻辑回归 3、 正则化逻辑回归3.1 问题陈述3.2 加载和可视化数据3.3 特征映…

大模型部署实战(二)——Ziya-BLIP2-14B-Visual

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

第3章“程序的机器级表示”:存储器的越界引用和缓冲区溢出

已经看到,C 对于数组引用不进行任何边界检查,而且局部变量和状态信息(如寄存器值和返回指针)都存放在栈中。这两种情况结合到一起就能导致严重的程序错误,一个对越界的数组元素的写操作破坏了存储在栈中的状态信息。然…

60题学会动态规划系列:动态规划算法第三讲

简单多状态问题 文章目录 一.按摩师二.打家劫舍系列三.删除并获得点数四.粉刷房子 1.按摩师 力扣链接:力扣 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预…

java泛型学习

前言 没有泛型的时候,我们声明的 List 集合默认是可以存储任意类型元素的,乍一看你可能还会觉得挺好,这样功能强大,啥类型都可以存储......但是开发的时候由于不知道集合中元素的确切类型,遍历的时候我们拿到的 item …

路径规划算法:基于供需优化的路径规划算法- 附代码

路径规划算法:基于供需优化的路径规划算法- 附代码 文章目录 路径规划算法:基于供需优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法供需…

图形编辑器开发:最基础但却复杂的选择工具

大家好,我是前端西瓜哥。 对于一个图形设计软件,它最基础的工具是什么?选择工具。 但这个选择工具,却是相当的复杂。这次我来和各位,细说细说选择工具的一些弯弯道道。 我正在开发的图形设计工具的: http…

复习并发编程的基础知识(二)

线程的状态6种状态及生命周期 1.new 2.Runnable(Ready和Running) 3.Blocked 4.Waiting 5.Timed_Waiting 6.Terminated 线程同步 同步:一些敏感的数据(比如共享的需要修改的资源)不允许被多个线程同时访问&#…

centos7 gitlab安装配置

gitlab概述 GitLab是一个基于Web的Git存储库管理和代码协作平台。它提供了一套完整的工具和功能,使团队能够更高效地进行代码版本控制、协作开发和持续集成/持续部署(CI/CD)。 以下是GitLab的主要功能和概述: 版本控制系统&…

使用布隆过滤器的flink十亿级数据实时过滤实践一

1项目背景 1.1 需求 实时推荐项目需求如下:根据用户实时行为(如关注,播放,收藏)推荐该UP主(关注的up主,播放视频发布up主,收藏up主)或其相似UP主的作品,UP主及相似UP主下的作品是提前离线召回…

react---生命周期

目录 1.新旧生命周期对比 2.常用的3个钩子函数 3.生命周期(旧) 4.生命周期(新) React 中为我们提供了一些生命周期钩子函数,让我们能在 React 执行的重要阶段,在钩子函数中做一些事情。 1.新旧生命周期…