微分方程(人口预测与传染病模型)

news2025/1/21 2:49:14

一、定义

  • 微分方程:含导数或微分的方程

  • 微分方程的阶数:所含导数或微分的最高阶数,如y’’’+2y’’-2x=0是三阶微分方程

  • 微分方程的解:使得微分方程成立的函数 例如y’-2x=0的解可以为或者x²+1

  • 微分方程的通解和特解:特解为满足等式条件即可

  • 初值条件:如y(0)=1

二、微分方程模型

1、人口预测模型

马尔萨斯模型
在这里插入图片描述

2、微分方程解析解

ODE 常微分方程
(求解析解的问题,Matlab代码简介,运算效率高)

% dy/dx = 2x , y(1) = 2
dsolve('Dy=2*x','y(1)=2','x')

% d2s/dt2 = -0.4 , s(0) = 0 , Ds(0) = 20
dsolve('D2s=-0.4','s(0)=0,Ds(0)=20','t')

% dy/dx = 2xy
dsolve('Dy=2*x*y','x')

% dM/dt = -nM , M(0) = M0
dsolve('DM=-n*M','M(0)=M0','t')

% dt/dh*KS(2gh)**(1/2)  = -pi(2h-h**2) , t(1) = 0
dsolve('Dt*K*S*(2*g*h)^(1/2)=-pi*(2*h-h^2)','t(1)=0','h')

% y**2+x**2*dy/dx = xy*dy/dx
dsolve('y^2+x^2*Dy=x*y*Dy','x')

% y''' = e**2x - cos(x)
dsolve('D3y=exp(2*x)-cos(x)','x')

三、传染病模型

今年疫情,传染病模型又将成为一波建模热潮,以下涉及传染病模型包括SI、SIS、SIR、SIRS、SEIR、SEIRS共六个模型:

  • 易感者S(Susceptible person):可感染人群
  • 感染者I(Infected individual):确诊人群
  • 潜伏者E(Exposed person):已经被传染但没有表现出来的人群
  • 康复者R(Recovered person):已痊愈的感染者

模型一:SI-Model

①原始模型

在这里插入图片描述
在这里插入图片描述

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as plt

# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0
# I_0为感染者的初始人数
I_0 = 1
# S_0为易感者的初始人数
S_0 = N - I_0
# T为传播时间
T = 150

# INI为初始状态下的数组
INI = (S_0,I_0)


def funcSI(inivalue,_):
    Y = np.zeros(2)
    X = inivalue
    # 易感个体变化
    Y[0] = - (beta * X[0] * X[1]) / N + gamma * X[1]
    # 感染个体变化
    Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]
    return Y

T_range = np.arange(0,T + 1)

RES = spi.odeint(funcSI,INI,T_range)


plt.plot(RES[:,0],color = 'darkblue',label = 'Susceptible',marker = '.')
plt.plot(RES[:,1],color = 'red',label = 'Infection',marker = '.')
plt.title('SI Model')
plt.legend()
plt.xlabel('Day')
plt.ylabel('Number')
plt.show()

感染者数量逐渐上升,易感染者数量逐渐下降,直至为0

在这里插入图片描述

②考虑某种因素使得参数β降低

如禁止大规模聚会、采取隔离措施

β降低

③考虑人口出生率和死亡率的因素

在这里插入图片描述
请添加图片描述

④考虑疾病死亡率的因素(不考虑人口出生率和死亡率)

在这里插入图片描述
在这里插入图片描述

⑤同时考虑疾病死亡率的因素和人口出生率和死亡率

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模型二:SIS-Model

①原始模型

假设从某种疾病恢复后仍然不能产生抗体,未来仍然可能患病,那我们会经历:感染-恢复-再感染,不断循环。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as plt

# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0.05
# I_0为感染者的初始人数
I_0 = 1
# S_0为易感者的初始人数
S_0 = N - I_0
# T为传播时间
T = 150

# INI为初始状态下的数组
INI = (S_0,I_0)


def funcSIS(inivalue,_):
    Y = np.zeros(2)
    X = inivalue
    # 易感个体变化
    Y[0] = - (beta * X[0]) / N * X[1] + gamma * X[1]
    # 感染个体变化
    Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]
    return Y

T_range = np.arange(0,T + 1)

RES = spi.odeint(funcSIS,INI,T_range)

plt.plot(RES[:,0],color = 'darkblue',label = 'Susceptible',marker = '.')
plt.plot(RES[:,1],color = 'red',label = 'Infection',marker = '.')
plt.title('SIS Model')
plt.legend()
plt.xlabel('Day')
plt.ylabel('Number')
plt.show()

当恢复系数gamma = 0.05时:
请添加图片描述
当恢复系数gamma = 0.1时:
请添加图片描述

②考虑某种因素使得α参数增加

如建立医院、升级医疗装备、开发疫苗

α增加

模型三:SIR-Model

①原始模型

某些疾病发病迅速,但康复后会产生抗体,不会再次被感染,如天花、麻疹等。
在这里插入图片描述
康复率为γ

在这里插入图片描述

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as plt

# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0.05
# I_0为感染者的初始人数
I_0 = 1
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - R_0
# T为传播时间
T = 150

# INI为初始状态下的数组
INI = (S_0,I_0,R_0)


def funcSIR(inivalue,_):
    Y = np.zeros(3)
    X = inivalue
    # 易感个体变化
    Y[0] = - (beta * X[0] * X[1]) / N
    # 感染个体变化
    Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]
    # 治愈个体变化
    Y[2] = gamma * X[1]
    return Y

T_range = np.arange(0,T + 1)

RES = spi.odeint(funcSIR,INI,T_range)


plt.plot(RES[:,0],color = 'darkblue',label = 'Susceptible',marker = '.')
plt.plot(RES[:,1],color = 'red',label = 'Infection',marker = '.')
plt.plot(RES[:,2],color = 'green',label = 'Recovery',marker = '.')
plt.title('SIR Model')
plt.legend()
plt.xlabel('Day')
plt.ylabel('Number')
plt.show()

易感者逐渐减少,感染者先增后减,康复者增加:
在这里插入图片描述

②考虑某种因素使得参数γ增加

如研发疫苗、升级医疗装备

γ增加

③考虑疾病死亡率的因素(不考虑人口出生率和死亡率的因素)

在这里插入图片描述
在这里插入图片描述

模型四:SIRS-Model

①原始模型

模型中康复者R可能会以a的转移率再次变为易感者S,可以看作是SIS和SIR的融合:
在这里插入图片描述
在这里插入图片描述
代码1:抗体持续时间为7天,七天后可被再次感染:

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as plt

# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0.05
# Ts为抗体持续时间
Ts = 7
# I_0为感染者的初始人数
I_0 = 1
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - R_0
# T为传播时间
T = 150

# INI为初始状态下的数组
INI = (S_0,I_0,R_0)


def funcSIRS(inivalue,_):
    Y = np.zeros(3)
    X = inivalue
    # 易感个体变化
    Y[0] = - (beta * X[0] * X[1]) / N + X[2] / Ts
    # 感染个体变化
    Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]
    # 治愈个体变化
    Y[2] = gamma * X[1] - X[2] / Ts
    return Y

T_range = np.arange(0,T + 1)

RES = spi.odeint(funcSIRS,INI,T_range)


plt.plot(RES[:,0],color = 'darkblue',label = 'Susceptible',marker = '.')
plt.plot(RES[:,1],color = 'red',label = 'Infection',marker = '.')
plt.plot(RES[:,2],color = 'green',label = 'Recovery',marker = '.')
plt.title('SIRS Model')
plt.legend()
plt.xlabel('Day')
plt.ylabel('Number')
plt.show()

在这里插入图片描述

代码2:a再次感染转移率为0.05

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as plt

# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0.05
# I_0为感染者的初始人数
I_0 = 1
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - R_0
# T为传播时间
T = 150
# a为再次感染的转移率
arfa = 0.05

# INI为初始状态下的数组
INI = (S_0,I_0,R_0)


def funcSIRS(inivalue,_):
    Y = np.zeros(3)
    X = inivalue
    # 易感个体变化
    Y[0] = - (beta * X[0] * X[1]) / N + arfa * X[2]
    # 感染个体变化
    Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]
    # 治愈个体变化
    Y[2] = gamma * X[1] - arfa * X[2]
    return Y

T_range = np.arange(0,T + 1)

RES = spi.odeint(funcSIRS,INI,T_range)


plt.plot(RES[:,0],color = 'darkblue',label = 'Susceptible',marker = '.')
plt.plot(RES[:,1],color = 'red',label = 'Infection',marker = '.')
plt.plot(RES[:,2],color = 'green',label = 'Recovery',marker = '.')
plt.title('SIRS Model')
plt.legend()
plt.xlabel('Day')
plt.ylabel('Number')
plt.show()

在这里插入图片描述

②考虑疾病死亡率的因素

在这里插入图片描述
在这里插入图片描述

②考虑抗体的因素

康复后,有部分人群获得抗体,成为完全康复者;有部分人群暂时不会获得抗体,未来还可能被感染,成为暂时康复者。
在这里插入图片描述
在这里插入图片描述

模型五:SEIR-Model

①原始模型

某些疾病具有潜伏期,被传染的人群会进入潜伏期E,潜伏着转化为感染者有一个速率σ,并且潜伏着不具有传染性。
在这里插入图片描述
在这里插入图片描述
代码1:潜伏期为14天

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as plt

# N为人群总数
N = 10000
# β为传染率系数
beta = 0.6
# gamma为恢复率系数
gamma = 0.1
# Te为疾病潜伏期
Te = 14
# I_0为感染者的初始人数
I_0 = 1
# E_0为潜伏者的初始人数
E_0 = 0
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - E_0 - R_0
# T为传播时间
T = 150

# INI为初始状态下的数组
INI = (S_0,E_0,I_0,R_0)


def funcSEIR(inivalue,_):
    Y = np.zeros(4)
    X = inivalue
    # 易感个体变化
    Y[0] = - (beta * X[0] * X[2]) / N
    # 潜伏个体变化
    Y[1] = (beta * X[0] * X[2]) / N - X[1] / Te
    # 感染个体变化
    Y[2] = X[1] / Te - gamma * X[2]
    # 治愈个体变化
    Y[3] = gamma * X[2]
    return Y

T_range = np.arange(0,T + 1)

RES = spi.odeint(funcSEIR,INI,T_range)


plt.plot(RES[:,0],color = 'darkblue',label = 'Susceptible',marker = '.')
plt.plot(RES[:,1],color = 'orange',label = 'Exposed',marker = '.')
plt.plot(RES[:,2],color = 'red',label = 'Infection',marker = '.')
plt.plot(RES[:,3],color = 'green',label = 'Recovery',marker = '.')

plt.title('SEIR Model')
plt.legend()
plt.xlabel('Day')
plt.ylabel('Number')
plt.show()

在这里插入图片描述
代码2:σ潜伏者转化为感染者速率为0.3

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as plt

# N为人群总数
N = 10000
# β为传染率系数
beta = 0.6
# gamma为恢复率系数
gamma = 0.1
# I_0为感染者的初始人数
I_0 = 1
# E_0为潜伏者的初始人数
E_0 = 0
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - E_0 - R_0
# T为传播时间
T = 150
# σ为潜伏者转化为感染者速率
sigama = 0.3

# INI为初始状态下的数组
INI = (S_0,E_0,I_0,R_0)


def funcSEIR(inivalue,_):
    Y = np.zeros(4)
    X = inivalue
    # 易感个体变化
    Y[0] = - (beta * X[0] * X[2]) / N
    # 潜伏个体变化
    Y[1] = (beta * X[0] * X[2]) / N - X[1] * sigama
    # 感染个体变化
    Y[2] = X[1] * sigama - gamma * X[2]
    # 治愈个体变化
    Y[3] = gamma * X[2]
    return Y

T_range = np.arange(0,T + 1)

RES = spi.odeint(funcSEIR,INI,T_range)


plt.plot(RES[:,0],color = 'darkblue',label = 'Susceptible',marker = '.')
plt.plot(RES[:,1],color = 'orange',label = 'Exposed',marker = '.')
plt.plot(RES[:,2],color = 'red',label = 'Infection',marker = '.')
plt.plot(RES[:,3],color = 'green',label = 'Recovery',marker = '.')

plt.title('SEIR Model')
plt.legend()
plt.xlabel('Day')
plt.ylabel('Number')
plt.show()

在这里插入图片描述

②考虑潜伏者(E)具有传染性的因素

假设易感染与感染者接触被传播强度为β1,易感染与潜伏着接触被传染强度被β2:
在这里插入图片描述
在这里插入图片描述

模型六:SEIRS-Model

①原始模型

抗体持续时间为7天,疾病潜伏期为14天:

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as plt

# N为人群总数
N = 10000
# β为传染率系数
beta = 0.6
# gamma为恢复率系数
gamma = 0.1
# Ts为抗体持续时间
Ts = 7
# Te为疾病潜伏期
Te = 14
# I_0为感染者的初始人数
I_0 = 1
# E_0为潜伏者的初始人数
E_0 = 0
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - E_0 - R_0
# T为传播时间
T = 150

# INI为初始状态下的数组
INI = (S_0,E_0,I_0,R_0)


def funcSEIRS(inivalue,_):
    Y = np.zeros(4)
    X = inivalue
    # 易感个体变化
    Y[0] = - (beta * X[0] * X[2]) / N + X[3] / Ts
    # 潜伏个体变化
    Y[1] = (beta * X[0] * X[2]) / N - X[1] / Te
    # 感染个体变化
    Y[2] = X[1] / Te - gamma * X[2]
    # 治愈个体变化
    Y[3] = gamma * X[2] - X[3] / Ts
    return Y

T_range = np.arange(0,T + 1)

RES = spi.odeint(funcSEIRS,INI,T_range)


plt.plot(RES[:,0],color = 'darkblue',label = 'Susceptible',marker = '.')
plt.plot(RES[:,1],color = 'orange',label = 'Exposed',marker = '.')
plt.plot(RES[:,2],color = 'red',label = 'Infection',marker = '.')
plt.plot(RES[:,3],color = 'green',label = 'Recovery',marker = '.')

plt.title('SEIRS Model')
plt.legend()
plt.xlabel('Day')
plt.ylabel('Number')
plt.show()

在这里插入图片描述

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

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

相关文章

基于Arduino Pro Micro的游戏手柄制作

基于Arduino Pro Micro的游戏手柄开发 1. Arduino IDE下载及安装 在Arduino官网Software | Arduino下载最新版Arduino IDE并安装。 或使用QQ群中提供的免安装版Arduino IDE,安装完成后Arduino Pro Micro的pin脚定义使用下面路径下的leonardo: 2. Arduino Pro Micr…

GrapeCity 文档处理商业系列Crack-6.0.2Version

GrapeCity 文档处理商业系列Crack文档 API 使用高速、直观的文档 API 全面控制您的文档 包括: Documents for Excel, .NET Documents for Data Viewer Documents for PDF Documents for PDF Viewer Documents for Word Documents for Imaging Documents for Image V…

数据库MySQL基础入门之MySQL隐式转换

一、问题描述 rootmysqldb 22:12: [xucl]> show create table t1\G *************************** 1. row *************************** Table: t1Create Table: CREATE TABLE t1 ( id varchar(255) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8 1 row in set (0.0…

ArcGIS基础实验操作100例--实验74灾害影响缓冲区分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验74 灾害影响缓冲区分析 目录 一、实验背景 二、实验数据 三、实验步骤 (…

剑指offer----C语言版----第十四天

表示数值的字符串 原题链接:剑指 Offer 20. 表示数值的字符串 - 力扣(LeetCode)1.1 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分&a…

常见胶片的分类和结构

胶片的分类方法非常多,本质上属于高分子材料范畴,很多类别已经超出笔者的认知范围,我们只对与档案数字资源长期保存和异质备份相关的胶片分类方法进行介绍。笔者整理了十大分类如下图所示: 各分类简要介绍 1. 按宽度尺寸分类 常…

【Linux】进程信号万字详解(上)

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…

194: vue+openlayers 根据卫星lat,lon,alt,俯仰角,方位角,绘制地面的拍摄的区域

第194个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中研究卫星的拍摄范围。 根据卫星的高度,经度,纬度,方位角,俯仰角以及拍摄的幅宽,幅长等参数,绘制拍摄的矩形框和中心点。这里用到了一些公式,参考代码,尤其是大部分使用的是弧度而非角度,需…

青铜到王者,8本最好的Python从入门到进阶的书

春节长假还有1周了,是时候囤一些书充充电了!新的一年群里很多小伙伴开始想学Python, 无论是准备转行的,还是想多学一份技能提高职场竞争力的,都想选择Python赛道,下面给大家推荐一些非常不错的Python入门到…

联合证券|利好叠加有望实质兑现 机构加码布局装修建材

组织加码布局装饰建材板块。据了解,受房地产利好方针带动、职业竞赛格式持续改进及原材料本钱下降等多重利好叠加,装饰建材板块有望迎来实质性利好,虽然曩昔两个多月来相关公司有所反弹,但组织以为行情仍然在路上。 多重利好推进 …

架构设计---高可用的处理

前言: 系统的高可用架构就是要在上述各种故障情况下,保证系统依然可用提供服务,具体包括以下几种架构方案。 冗余备份: 各种服务器故障是不可避免的,架构设计上就要保证,当服务器故障的时候,…

简短通俗理解动态规划算法--最短路径问题

问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径。在博客动态规划算法中介绍了动态规划的基本思想已经建立动态规划模型的步骤,下面将其中的方法分析最短路径问题。 最短路径有…

CBAM: Convolutional Block Attention Module

https://arxiv.org/pdf/1807.06521.pdf 摘要: 我们提出了卷积块注意模块(CBAM),一个简单而有效的用于前馈卷积神经网络的注意模块。给定中间特征图,我们的模块依次推导出沿通道和空间两个独立维度的注意图,然后将注意图乘到输入…

vue-seamless-scroll数据量少时,暂停滚动,继续滚动

需求内容 大屏项目:指定dom元素内,如果子元素内容过多,超出父元素的最高高度,可以发生自动滚动;如果子元素内容没有超出父元素的最高高度,不可以发生自动滚动。 . 实现方案 获取数据后并渲染到dom后&am…

并查集的查询与合并详解

文章目录 一、并查集的概念 二、并查集的实现 2、1 并查集不同集合(树)的形成 2、2 find()函数找一个元素集合的编号(元素所属于树的祖宗) 2、3 合并两个不同集合(合并两棵不同的树&#xff09…

SpringCloud学习笔记 - Nacos集群配置和配置持久化

1. 集群架构 要组成集群Nacos必须要有3个或以上的Nacos服务节点,官网推荐在生产服务中使用集群架构。 官网对Nacos集群架构的说明:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 总体来说有三种方式可以实现Nacos集群部署: …

恒远模式(flyweight)

简介:共享对象,当一个对象可以被多次利用的时候,并且对象内部相同,这个时候需要考虑让对象进行复用,而不是多次创建结构图:代码就不写了,因为我觉得这东西没啥用,因为一个对象对应的…

技术分享 | 测试平台开发-前端开发之Vue.js 框架

Vue.js 是一套用于构建用户界面的渐进式框架,在目前的前端开放中比较流行的前端框架。Vue 被设计成自底向上的逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或已有项目整合。但是学习 Vue.js 需要一定的 HTML、CSS、和 …

指针进阶(3)

tips 1. sizeof的返回类型时size_t。size_t就是为sizeof量身定做的,size_t就是unsigned int 2. strlen碰到\0会停下来,而sizeof则不会,也将其算作一个字符 3. 要注意这么两对东西: scanf()与gets(): \0 , \n , 空格 …

<TCP网络编程>——《计算机网络》

目录 1.TCP网络程序 1.1 TCP socket API 1.1.1 socket(): 1.1.2 bind():​ 1.1.3 listen(): ​ 1.1.4 accept(): 1.1.5 connect(): 2. 封装 TCP socket 2.1 实现一个简单的英译汉的功能 3.简单的TCP网络程序(多进程版本) 4. 简单的TCP网络程序(多线程版本) 5. 线程…