SIR模型

经典的SIR模型是一种发明于上个世纪早期的经典传染病模型,此模型能够较为粗略地展示出一种传染病的发病到结束的过程,其核心在于微分方程,其中三个主要量S是易感人群,I是感染人群,R是恢复人群

这三个量都是跟随时间变化的函数,即可以表示为,其中的t我们设定为一个单位时间,我们即有如下的公式:

然而要列出此种类似的方程我们需要一部分的理想化条件,这些理想化条件是比较重要的,

1.首先即城市的总人数不变,即:

S(t)+I(t)+R(t)=KS(t)+I(t)+R(t)=K S(t)+I(t)+R(t)=K
K为一个常数值,一个恒定量。

2.假设 t 时刻单位时间内,一个病人能传染的易感者数目与此环境内易感者总数s(t)成正比,设定比例系数为β,从而在t时刻单位时间内被所有病人传染的人数为βs(t)i(t)

3.t 时刻,单位时间内从染病者中移出的人数与病人数量成正比,比例系数为γ,单位时间内移出者的数量为γi(t)

故我们可以得知其作用的机制为:易感人数和系数以及感染人数同时作用于总的易感人数,同时恢复人数和恢复系数又对感染人数起到影响。但是同时这又是一个单向性的机制。

基于以上三个条件的假设,我们可以获得其人数变化的机制,也即

1.易感个体的下降率为(注:此处为负数):

2.感染个体的增长率为:

3.恢复个体的增长率为:

我们利用微分方程可以表示如下:(SIR核心的微分方程)

详细可参考知乎:经典传染病的SIR模型(基于MATLAB)

MATLAB实现

转自:SIR模型实现(matlab)

function dydt = odefun(t,y,A,B)
dydt = zeros(2,1);
dydt(1) = A*y(1)*y(2) - B*y(1);
dydt(2) = -A*y(1)*y(2);
end
clc
clear
close all;
A = 0.4;
B = 0.1;
I = 0.4;
S = 0.5;%ode
tspan = [0 50];
y0 = [I S];
[t, y] = ode45(@(t,y)odefun(t,y,A,B), tspan, y0);
r = 1-y(:,1)-y(:,2);%euler
n = size(r,1);
h = 50 / (n-1);
t_0 = [0:h:50]';
y_i = zeros(n,1);
y_s = zeros(n,1);
y_i(1) = I;
y_s(1) = S;
for i = 1:n-1y_i(i+1) = h*[A*y_i(i)*y_s(i) - B*y_i(i)]+y_i(i);y_s(i+1) = h*[-A*y_i(i)*y_s(i)]+y_s(i);
end
r_0 = 1 - y_i(:,1) - y_s(:,1);%画图
subplot(2,2,1);
plot(t,y(:,1),'-o',t,y(:,2),'-.',t,r,'g');
hold on;
legend('生病人数:i(t)','健康人数:s(t)','移除人数:r(t)','Location','Best');
ylabel('占人口比例%');
xlabel('时间t');
str = ['接触数λ/μ:',num2str(A/B),' 初始生病人数:',num2str(I),',初始健康人数:',num2str(S)];
text(15,0.4,str,'FontSize',10);
title('SIR模型(ode)');subplot(2,2,2);
plot(t_0,y_i,'-o',t_0,y_s,'-.',t_0,r_0,'g');
hold on;
legend('生病人数:i(t)','健康人数:s(t)','移除人数:r(t)','Location','Best');
ylabel('占人口比例%');
xlabel('时间t');
str = ['接触数λ/μ:',num2str(A/B),' 初始生病人数:',num2str(I),',初始健康人数:',num2str(S)];
text(15,0.4,str,'FontSize',10);
title('SIR模型(euler)');subplot(2,2,3);
plot(t_0,y_i,'r-',t,y(:,1),'-.');
diff = sum(abs(y_i - y(:,1)));
str1 = ['生病人数对比图i(t),    误差:',num2str(diff)];
title(str1);
legend('euler','ode','Location','Best');
ylabel('占人口比例%');
xlabel('时间t');subplot(2,2,4);
plot(t_0,y_s,'r-',t,y(:,2),'-.');
diff = sum(abs(y_s - y(:,2)));
str1 = ['健康人数对比图s(t),     误差:',num2str(diff)];
title(str1);
legend('euler','ode','Location','Best');
ylabel('占人口比例%');
xlabel('时间t');

python实现

转自:建立传染病SIR模型代码
其中β为感染率,γ为药物有效性,TS和ND分别为时间间隔和结束时间,TN为区域内人口数(单位为百万)

import scipy.integrate as spi
import numpy as np
import matplotlib.pyplot as pltbeta = 7e-3
gamma = 4e-3
TS = 1.0
ND = 1000.0
TN = 4.2
S0 = 0.998*TN
I0 = 0.002*TN
INPUT = (S0, I0, 0.0)def diff_eqs(INP, t):Y = np.zeros((3))V = INPY[0] = - beta * V[0] * V[1]Y[1] = beta * V[0] * V[1] - gamma * V[1]Y[2] = gamma * V[1]return Yt_start = 0.0
t_end = ND
t_inc = TS
t_range = np.arange(t_start, t_end + t_inc, t_inc)
RES = spi.odeint(diff_eqs, INPUT, t_range)print(RES)
with open('SIR.txt', 'w') as f:for each in RES:f.write(str(each))f.write('\n')
f.close()
# Ploting
plt.subplot(111)
plt.plot(RES[:, 1], '-r', label='Infectious')
plt.plot(RES[:, 0], '-g', label='Susceptibles')
plt.plot(RES[:, 2], '-k', label='Recovereds')
plt.legend(loc=0)
plt.title('SIR')
plt.xlabel('Time (day)')
plt.ylabel('Infectious Susceptibles and Recovereds (million)')
plt.show()

【数学建模】传染病SIR模型相关推荐

  1. 数学建模——逻辑回归模型Python代码

    数学建模--逻辑回归模型详解Python代码 程序用到的测试数据: 链接:https://pan.baidu.com/s/1LGD1MAxk2lxO93smSPNyZg 提取码:uukr 代码正文 i ...

  2. 数学建模——TOPSIS综合评价模型Python代码

    数学建模--TOPSIS综合评价模型Python代码 正常代码 import numpy as np # 导入numpy包并将其命名为np ##定义正向化的函数 def positivization( ...

  3. 常染色体的隐性疾病数学建模(代数模型)

    常染色体的隐性疾病数学建模(代数模型) 摘要:本文研究随交配代数的增长,常染色体隐性疾病的基因分布变化问题.使用代数模型,在正常人不与显性患者交配,但隐性患者可与正常人.隐性患者交配的情况下时,探究基 ...

  4. 数学建模基本算法模型Chapter1--线性规划

    数学建模基本算法模型Charpter1–线性规划(LP) By 进栈需检票 一.线性规划基本概念 1.Linear Programming (LP问题) 列出方程组不等式求解(基本形式) 包含目标函数 ...

  5. 数学建模传染病模型_数学建模| 时间序列模型

    1 数学建模 时间序列模型 1.与实践有关系的一组数据,叫做时间序列: 2.得到时间序列的数据后,要构建模型,其中平稳时间序列的模型,是本节课重点介绍的: 3.y=at+季节性+周期性 一.     ...

  6. 数学建模优化模型简单例题_数学建模之优化模型:存储模型

    点击上方「蓝字」关注我们 最近,为申报市级精品课程,我为我校"数学建模与科学计算"课程录制了讲课视频,下面是3.1节优化模型的第一个例子:存储模型.敬请大家批评指正! 优化模型是数 ...

  7. 【数学建模】线性规划模型MATLAB求解(最优化)

    文章目录 一.算法介绍 二.适用问题 三.算法总结 1.可以转化为线性规划的问题 四.应用场景举例 1. 例1.1: 2. 解: 2. 例1.2: 2. 解: 五.MATLAB操作 六.实际案例(投资 ...

  8. 【数学建模】非线性规划模型与01规划模型(最优化)

    文章目录 一.算法介绍 1. 01规划模型 二.适用问题 三.算法总结 四.应用场景举例 1.非线性规划模型 2.01规划模型 五.LINGO代码 1.非线性规划模型 2.01规划模型 六.实际案例 ...

  9. 二维动态规划降维误差一般为多少_数学建模常用算法模型

    数学模型的分类 按模型的数学方法分: 几何模型.图论模型.微分方程模型.概率模型.最优控制模型.规划论模型.马氏链模型等 按模型的特征分: 静态模型和动态模型,确定性模型和随机模型,离散模型和连续性模 ...

  10. 数学建模基本算法模型

    全国大学生数学建模竞赛中常用的算法模型包括但不限于以下几种: 线性回归模型:用于建立变量之间线性关系的模型,常用于预测和分析数据. 逻辑回归模型:用于建立变量之间的非线性关系,常用于分类问题和概率预测 ...

最新文章

  1. pandas使用read_csv读取文件数据、设置converters参数将百分比字符串转换为数字
  2. spring data jpa从入门到精通_Spring Data JPA的简单入门
  3. [css] 在页面上隐藏元素的方法有哪些?
  4. .net core2.0 Memcached.ClientLibrary
  5. 底层原理_自动装箱与拆箱底层原理
  6. 【POJ1083】 Moving Tables (并行的搬运)
  7. 苹果关闭iOS 14.1验证通道,阻止 iOS 14.2 降级
  8. c++ 定时器_Linux C/C++定时器的实现原理和使用方法
  9. 如何 SSH 到 Linux 服务器里的特定目录及执行命令?
  10. 微软从 Engine Yard 手中收购容器平台 Deis
  11. html单元格竖着排列,html表格,表头竖向固定,横向滚动的例子
  12. DevExpress WinForms v21.1 - 富文本编辑器、PDF Viewer全新升级
  13. center os 安装 mysql_MySQL数据库之center os 7 Mysql 安装
  14. java调用接报400_java调用webservice报400错误,请大神赐教
  15. 人机交互-3-评估的基础知识
  16. java开源规则引擎比较_常用规则引擎比较分析
  17. XStream null值序列化时不会显示标签
  18. image.shape[] 和array.shape[]的含义
  19. Lect2 Java 中的 Interface
  20. Java开发工程师需要掌握哪些技能?

热门文章

  1. ubuntu 版mysql客户端工具_ubuntu安装mysql可视化工具MySQL-workbench及简单操作
  2. 4600u黑苹果 r5_黑苹果集成显卡Intel HD Graphics 4400/4600 驱动方法
  3. EllSeg训练实验记录代码解析技巧tips
  4. 有道词典 Chrome取词插件
  5. EPS学习笔记2----------常用地物绘制基础
  6. Javaweb免费RDP报表工具常用函数的用法总结
  7. 如何选择和使用ACM LaTeX模板
  8. OpenCV-camShift 算法
  9. opencv3中camshift详解(二)camshift原理介绍
  10. ARFoundation系列讲解-教程目录