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

article/2025/11/7 23:05:33

一、定义

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

  • 微分方程的阶数:所含导数或微分的最高阶数,如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 YT_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 YT_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 YT_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] / Tsreturn YT_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 YT_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 YT_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 YT_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] / Tsreturn YT_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://chatgpt.dhexx.cn/article/7XJTJVJO.shtml

相关文章

Malthus模型预测人口增长

最近在学习人口数量的预测时,除了用 Malthus 和 Logistic 这两种方法进行拟合之外,还有一个新的方法——Leslie矩阵模型。 首先先讲讲 Malthus 拟合,这是由英国的人口学家 Malthus 提出,用于预测人口增长状况的一种方法;令时刻 t 的人口数为 x(t) ,不妨将 x(t) 看作是个…

数据拟合丨人口预测模型

数据拟合丨人口预测模型 路漫漫其修远兮,吾将上下而求索 下表所列是某地区1971一2000年的人口数据,试给出该地区人口增长的数学模型。 年 份时间变量 t t =年份-1970人口 y" role="presentation">yy/人年 份时间变量 t t =年份-197…

人口预测模型及matlab代码

目录 题目 1949年—1994年我国人口数据资料如下: 年 份 xi 49 54 59 64 69 74 79 84 89 94 人口数 yi 5.4 6.0 6.7 7.0 8.1 9.1 9.8 10.3 11.3 11.8 建模分析我国人口增长的规律, 预报1999年我国人口数(亿)。 1. 在坐标系上作观测数据的散点…

人口预测模型

预测人口模型 利用灰色预测模型预测人口 应用 灰色预测模型(Gray Forecast Model)是通过少量的、不完全的信息,建立数学模型并做出预测的一种预测方法。是处理小样本(4个就可以)预测问题的有效工具,而对…

基于logistic模型,GM模型和Leslie模型全国人口预测

目录 摘要....................................................................................................................... 1 一 问题重述......................................................................................................... 1 1.1 …

数学建模——人口预测模型

人口预测模型 多项式拟合假设特点代码实现代码实现思路代码 BP神经网络特点代码实现实现思路代码 Logistic模型特点代码实现原理代码 多项式拟合 假设 把人口增长看做是一个多项式函数人口增长没有限制,可以一直增长 特点 已有数据拟合的很好,不论数…

uC/OS任务创建函数OSTaskCreate ()参数详解

要使用 uC/OS 的任务必须先声明任务控制块和创建任务,调用 OSTaskCreate () 函数可以创建一个任务。OSTaskCreate () 函数的信息如下表所示。

UCOSIII os_task函数

认识任务管理的函数 建立任务:OSTaskCreate()堆栈检验:OSTaskStkChk()删除任务:OSTaskDel()改变任务优先级:OSTaskChangePrio()挂起任务:OSTaskSuspend()恢复任务:OSTaskResume() 任务可以是一个无线的循…

[uCOS/RTOS]uC/OS-II中的任务堆栈大小检测

在uC/OS-II系统中,创建任务的时候除了需要配置任务的优先级以外,还需要对任务堆栈大小进行分配。而对于单片机这种RAM并不是非常大的微控制器来说,RAM显得格外珍贵,如果任务堆栈分配大了,会导致RAM不够用,分…

FreeRTOS-Task

Task FreeRTOS中Task为调度单位,是独立的运行实例,具有自己的堆栈空 间。Task通常是无限循环执行,不允许以任何方式退出实现函数(return 语句或者运行结束)。如果Task真的不需要了,需要显式的调用delete 函…

AUTOSAR OS Introduction -- Part 2(Task Property)

Event Event 主要用于为Extended Task 提供多个同步点,每个Event 可以关联多个Task Event Trigger condition 显示调用SetEvent通过Alarm TriggerCallback & OS API WaitEvent 只要表达式中任意一个EVENT 被收到,Task state则切换至Ready, 等待调度表按照优先级进行…

UCOS-Ⅲ查看任务堆栈空间:OSTaskStkChk()函数

UCOS-Ⅲ查看任务堆栈空间:OSTaskStkChk()函数 文章目录 前言一、准备工作二、使用步骤1.创建堆栈检测任务2.在头文件os_cfg.h开启宏OS_CFG_STAT_TASK_STK_CHK_EN3.在堆栈检测任务使用OSTaskStkChk()函数 三、结果 前言 硬件的RAM资源有限,UCOSⅢ提供了一…

【UCOSIII操作系统】任务篇(1)创建任务

UCOSIII操作系统 UCOSIII操作系统——任务篇(1)创建任务一、UCOSIII——任务 简介二、创建任务流程1、定义任务栈2、定义任务控制块TCB3、定义任务主体函数4、创建任务 三、任务的状态 UCOSIII其他内容导航不迷路 UCOSIII操作系统-简介 【UCOSIII操作系统…

FreeRTOS中taskENTER_CRITICAL()和taskEXIT_CRITICAL()函数运用

以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码 的执行不被中断,在进入临界段之前须关中断,而临界段代…

OSTaskCreateExt()建立任务

ucosII创建任务的硬性要求: 1.任务必须被创建在多任务启动前或运行的任务中 2.任务不能在ISR(中断)中创建 3.任务必须在死循环中,且不能有返回 OSTaskCreateExt()建立任务 NT8U OSTaskCreateExt (void (*task)(void *pd), …

赢在微点答案专区英语_英语u校园读写2答案unit3,u校园新标准大学英语视听说3单元测试答案搜题公众号...

英语u校园读写2答案unit3,u校园新标准大学英语视听说3单元测试答案搜题公众号,u校园大学英语读写4第一单元答案查题APP更多相关问题A.婴儿期 B.幼儿期 C.学龄前期 D.学龄期 E.青春期关于自我,正确的说法是(…

新视野大学英语视听说第三版答案

Unit 1 Unit 2 Unit 3 Unit 4 Unit 5 Unit 6 Unit 7 Unit 8

视听说教程(第三版)4 quiz 1

视听说教程(第三版)4 quiz 1 Reading Comprehension Section A Passage One Questions 1 to 5 are based on the following passage. We all want to raise kids who are happy and successful, but we often mistakenly think that money is the key …

welearn 视听说1-4

词汇题(55道) 1. You should carefully think over_____ the manager said at the meeting. A. that B. which C. what D. whose 1.选C,考察宾语从句连接词,主句谓语动词think over后面缺宾语,后面的宾语从句谓语动…

使用RemObjects Pascal Script

摘自RemObjects Wiki 本文提供RemObjects Pascal Script的整体概要并演示如何创建一些简单的脚本. Pascal Script包括两个不同部分: 编译器 (uPSCompiler.pas)运行时 (uPSRuntime.pas) 两部分彼此独立.可以分开使用,或通过TPSScript 控件使用他们,这个控件定义在uPSComponent.p…