基于SIR模型的疫情预测 matlab

article/2025/9/26 9:41:09

基于SIR模型的疫情预测

庚子年 庚辰月 丁丑日,疫情从爆发到今天,已经有100多万人感染,而我国有一群这样的逆行者他们以自己的生命筑起了我国的防疫长城,鲁迅先生曾说“我们从古以来,就有埋头苦干的人,有拼命硬干的人,有为民请命的人,有舍身求法的人,……虽是等于为帝王将相作家谱的所谓"正史",也往往掩不住他们的光耀,这就是中国的脊梁。”
愿逝者安息,山河无恙。

尘沉尘的第一篇博客

这是前一段时间,数学建模课的一道作业,一直想写一篇博客,但是想想真的拖了好久。

SIR
SIR模型是是一种传播模型,是信息传播过程的抽象描述。是传染病模型中最经典的模型,其中S表示易感者,I表示感染者,R表示移出者。

历史

传染病模型有着悠久的历史,一般认为始于1760年Daniel Bernoulli在他的一篇论文中对接种预防天花的研究。1927年Kermack与McKendrick在研究流行于伦敦的黑死病时提出了的SIR仓室模型,并于1932年继而建立了SIS模型,在对这些模型的研究基础上提出了传染病动力学中的阈值理论。

SIR模型的建立

基本假设
(1) 假设给定数据真实,不考虑人口的出生、死亡、流动等,该城市人口总数N是常数,即每年流入人口等于流出人口
(2) 假设人口当日所处的健康状态只分为健康人群、感染新型冠状病毒确诊病人和恢复者三类类;
(3) 假设人口不可流动,即无病人流入和流出该城市;
(4) 假设严格隔离的新型冠状病毒感染病人都不再传染他人;
符号说明
N——我们所研究区域的人口总数;
S——易感类,该类成员没有染上新型冠状病毒,也没有免疫能力,可以被传染上新型冠状病毒,设易感类人群t时刻在总人口中所占比例为s(t),S(t)=Ns(t);
I——感染者,该类成员已经成为真正的新型冠状病毒患者,能够把病毒传染给S类成员,设该类人群t时刻在总人口中的比例为i(t),I(t)=N
i(t);
R——免疫类,该类成员为新型冠状病毒康复者或因患病死亡,已经具有免疫力,不再对其他成员产生任何影响,设该类人群t时刻在总人口中的比例为r(t),R(t)=N*r(t);
a——在t时刻单位时间内被所有病人传染的人数为aNs(t)i(t);
b——在t时刻单位时间内恢复者数量为bNi(t)。
感染机制:
在这里插入图片描述
上面第一个式子表示 感染者的总人数为原有感染者的人数I(j)加上原有易感者S(i)被感染产生的I(i),a是感染率
第二个式子表示新增的移出者

易感者患病到移出的过程可用如下微分方程表示:在这里插入图片描述
在这里插入图片描述

模型求解

数据选取
我选取了河南省一月二十一日到二月二十日的数据来进行模型的建立和验证
(全部的数据的和代码会放在附件里:)
要得到sir方程的解析解十分困难,可借助matlab解得其数值解进行分析和预测,预测的关键在于感染系数a与恢复系数b的取值。

%该部分用于计算移出率b
%data1 是河南省1,21到2.20的数据   data是2.1到2.20的数据
load data1
for n = 1:length(r)-1r0(n) = (r(n+1) - r(n))./i(n);
end
b = mean(r0)%b取data数据结果为0.035 取data1数据结果为0.024 故在以后的程序中b取0.03

求解恢复系数b
查阅资料可知在以往的模型中常取恢复天数的倒数作为恢复系数,但是就当下情况来看无法获取本次疫情确切的恢复天数,所以我们在n天的样本中使用(当天的移出人数r(n)减去第二天的移出人数r(n+1))/当天的确诊者人数i(n),以此循环n-1次求平均得到恢复系数b,但是考虑到疫情在河南开始初始,当地对于病毒的检测手段治愈方法都相对落后,有一些感染者未被及时发现,以及恢复时间偏长。所以我们使用1.21到2.20的数据算出b1,再使用2.1到2.20的数据算出b2,将b1,b2取平均值得到b,这样我们赋予了后二十天的数据两倍的权重,可以对冲掉一部分因为前十一天数据的精度而产生的误差。最终我们得到b的取值为0.03。查阅资料得到2003年非典疫情的恢复时间为22天,而两次疫情有着很大的相似性,所以可见所求的恢复系数b据有一定的可信度。

function [ y ] = sir(t,x)
%描述sir模型的微分方程
%数组x前三个值分别为s i r初值,后两个值存储感染系数a 恢复系数b
y=[-x(4)*x(1)*x(2),x(4)*x(1)*x(2)-x(5)*x(2),x(5)*x(2),0,0]'; %s增长率,i增长率,r增长率
end
%用最小二乘法估计s(t)初值和感染系数a
%data1 是河南省1,21到2.20的数据   data是2.1到2.20的数据
clc
clear
load data.mat
b=0.03;   % 由Nmub计算所得
%该部分用于计算a和s的初值 采用最小二乘法
s0 = 1500:10:30000;  % 估计s初值的取值范围
for n = 1:length(s0)s1 = s0(n) + i(1) - i(2) - r(2);m = (s0(n) - s1)./(s0(n).*i(1));t = 1:8;[T,Y] = ode45('sir',t,[s0(n),i(1),r(1),m,b]);for p = 1:8SE(p) = (Y(p,2) - i(p)).^2;endSEE(n) = sum(SE); %此时的残差平方和
end
[v,address] = min(SEE);
s = s0(address); %残差平方和最小的s(t)初值
s1 = s + i(1) - i(2) - r(2);
m = (s - s1)./(s.*i(1)); %残差平方和最小的感染系数a
tspan = 1:70;
[T,Y] = ode45('sir',tspan,[s,i(1),r(1),m,b]);
a=m*Y(1)
figure(1);
t = 1:length(i);
plot(t,i,'rx-');
hold on;
y = Y(1:length(i),2);
y = y';
plot(t,y,'bo-');
legend('真实值','预测值');
xlabel('日期');ylabel('感染人数');
figure(2);
R = Y(1:length(r),3);
R = R';
plot(t,r,'rx-');
hold on;
plot(t,R,'bo-');
legend('真实值','预测值');
xlabel('日期');ylabel('移出人数');
save finaldat

求解感染率a和初始易感人群s
对于易感人群初值s(0)和感染系数a的估计采用最小二乘估计的方法,最小二乘估计的基本思路是先估计s(0)和a的取值区间,然后寻找区间内计算得到预测值与真实值残差平方和最小的一组值作为估计值进行预测。本方案遍历的s(0)区间为[5000,30000]. 求得感染率a=0.1805 初始易感者s=1520;结果如图


在这里插入图片描述这个模型忽略掉了好多因素所以可以看出它把初始的易感人群作为了感染的人口上限,所以在预测的时候有包含峰值时候的数据会好一些

我认为感染率在疫情的发展过程中一直发生着变化,政府加强宣传,人们提高防护意识和卫生习惯,以及相应的隔离措施都可以使感染率减小,而感染率的变化对于疫情的发展有着极大的影响,下面我采用模型在仅感染率发生变化的情况下对于25天内的疫情发展做出预测。

%用最小二乘法估计s(t)初值和感染系数a
%data1 是河南省1,21到2.20的数据   data是2.1到2.20的数据
clc
clear
load data.mat
b=0.03;   % 由Nmub计算所得
%该部分用于计算a和s的初值 采用最小二乘法
s0 = 1500:10:30000;  % 估计s初值的取值范围
for n = 1:length(s0)s1 = s0(n) + i(1) - i(2) - r(2);a = (s0(n) - s1)./(s0(n).*i(1));t = 1:8;[T,Y] = ode45('sir',t,[s0(n),i(1),r(1),a,b]);for p = 1:8SE(p) = (Y(p,2) - i(p)).^2;endSEE(n) = sum(SE); %此时的残差平方和
end
[v,address] = min(SEE);
s = s0(address); %残差平方和最小的s(t)初值
s1 = s + i(1) - i(2) - r(2);
a = (s - s1)./(s.*i(1));%残差平方和最小的感染系数a
tspan = 1:30;
[T,Y] = ode45('sir',tspan,[s,i(1),r(1),a,b]);%a变为原来1/2
a = a/2;
tspan = 1:30;
[T1,Y1] = ode45('sir',tspan,[s,i(1),r(1),a,b]);%a变为原来2倍
a = a*4;
tspan = 1:30;
[T2,Y2] = ode45('sir',tspan,[s,i(1),r(1),a,b]);figure(1);
t = 1:25;
y = Y(1:25,2);
y = y';
plot(t,y,'bo-');
hold on;y1 = Y1(1:25,2);
y1 = y1';
plot(t,y1,'rx-');y2 = Y2(1:25,2);
y2 = y2';
plot(t,y2,'yx-');legend('原感染率','原感染率/2','原感染率*2');
xlabel('日期');ylabel('感染人数');
title('不同感染率下25天内疫情趋势预测')

在这里插入图片描述
如图可以看出随着感染率的增加,感染人数上升更快并且峰值更大,以上预测中在第十天时感染率为a,a/2,2*a的情况下感染人数分别为1171,756,1567。可见各种防疫措施对于疫情的发展的确意义重大。

统一回复:
代码百度云链接,提取码:4226
emmm因为百度云链接经常失效,需要源源码请给我发邮件,我看到后会及时回复。
邮箱:chencc.mail@qq.com


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

相关文章

python实现SI、SIS、SIR、SIRS、SEIR、SEIRS模型

传染病传播模型 SISISSIRSIRSSEIR(相比较贴合新冠状病毒)SEIRS 在家闲着无事,搜了一些关于传染病模型的知识,在此做个总结。 SI 最简单的SI模型首先把人群分为2种,一种是易感者(Susceptibles),易感者是健康…

流行病模型(SIR Model)

流行病模型(SIR Model) by : ZhuoFei, Zhou 首先定义一个函数bernoulli(p) #以概率p判断是否会被感染或恢复 function bernoulli(p::Number)if rand(1)[1] < preturn trueelsereturn falseend endbernoulli (generic function with 1 method)恢复所需的时间函数recovery_…

SIR模型与R模拟

SIR病毒模型R模拟 文章目录 SIR病毒模型R模拟[toc]1.SIR病毒模型2.R模拟 1.SIR病毒模型 SIR病毒模型的的三个字母分别为病毒传播过程中的三种状态&#xff0c;其中 S&#xff0c;表示易感染者&#xff0c;即没有被感染病毒的人群I&#xff0c;表示已感染者&#xff0c;即被感…

【python】SIR模型实现

SIR模型python实现 SIR模型是传染病模型中最经典的模型&#xff0c;其中S表示易感者&#xff0c;I表示感染者&#xff0c;R表示恢复者。SIR模型中&#xff0c;染病人群为传染的源头,他通过一定的几率把传染病传给易感人群,他自己也有一定的几率/可以被治愈并免疫,或者死亡;易感…

传染病模型(3)——SIR模型及matlab运行结果

前言 常见的传染病模型按照具体的传染病的特点可分为 SI、SIS、SIR、SIRS、SEIR 模型。其中“S”“E”“I”“R”的现实含义如下&#xff1a; S (Susceptible)&#xff0c;易感者&#xff0c;指缺乏免疫能力健康人&#xff0c;与感染者接触后容易受到感染&#xff1b; E (Exp…

关于SIR模型性质的进一步摘录

1 SIR模型的性质 又是成为SIR搬运工的一天。以下内容来自陈卫老师在《大数据网络传播模型和算法》。纯纯自我记录&#xff0c;不够美观不够细致&#xff0c;不喜欢看出门左拐。 1.1 SIR模型中的basic reproduction rate&#xff08;基础再生数&#xff09; R 0 R_0 R0​ 它是…

SIR模型II

SIR II (Epidemic modeling) by Zhuofei(fregoticloud.com) jupyter notebook link 在这个模型中&#xff0c;考虑一个在一定空间内的流行病模型。人只能与附近的人交互作用&#xff0c;所以给人在一定的空间里随机运动。 首先&#xff0c;在一个2维平面&#xff0c;随机游走&…

SIR信息传播模型

SIR信息传播模型 SIR模型及python复现SIR模型SIR数学模型传播动力学方程python实现 模拟社交网络中SIR模型的信息传播过程 SIR模型及python复现 SIR模型 SIR模型是传染病模型中的经典模型&#xff0c;可以用在传染病过程中的模拟预测&#xff0c;也可以用作抽象表达社交网络中…

SIR模型 matlab模拟

需要一个单独的m文件&#xff1a; %即写上三个微分方程 function ySIRModel(t,x,lambda,mu) y[-lambda*x(1)*x(2),lambda*x(1)*x(2)-mu*x(2),mu*x(2)]; 再进行作图 >> ts0:1:100; >> lambda0.00001; >> mu1/14; >> x0[45400,2100,2500]; >> […

SIR及SEIR建模的简单示例

目录 概述1.一些定义1.1 一些名词1.2 一些符号1.3 一些定义 2.方法论2.1 SIR2.2 SEIR2.3 代际传播2.3.1 传播矩阵 3 模型实现3.1 参数设定3.2 SIR&#xff08;1&#xff09;模型&#xff08;2&#xff09;参数&#xff08;3&#xff09;计算&#xff08;4&#xff09;绘图 3.3 …

SIR模型python实现

python新手&#xff0c;代码不规范之处敬请见谅&#xff0c;第一次发帖排版也不太懂&#xff0c;各位将就看。 参考&#xff1a; SIR模型和Python实现_阿丢是丢心心的博客-CSDN博客_sir模型 【保姆级教程】使用python实现SIR模型&#xff08;包含数据集的制作与导入及最终结…

SI,SIS,SIR,SEIRD模型

SI&#xff0c;SIS&#xff0c;SIR&#xff0c;SEIRD模型 因为个人工作需要系统地整理SI&#xff0c;SIR以及SEIR模型&#xff0c;故对三个模型进行原理介绍以及对比。文中关于SI&#xff0c;SIS&#xff0c;SIR的所有的截图都来自西工大肖华勇老师在慕课上的分享&#xff0c;…

【数学建模】传染病SIR模型

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

SIR模型简单了解(Susceptible Infected Recovered Model)

SIR模型定义 SIR模型是一种传播模型&#xff0c;是信息传播过程的抽象描述。 SIR模型是传染病模型中最经典的模型&#xff0c;其中S表示易感者&#xff0c;I表示感染者&#xff0c;R表示移除者。 S&#xff1a;Susceptible&#xff0c;易感者 I&#xff1a;Infective&#xf…

【保姆级教程】使用python实现SIR模型(包含数据集的制作与导入及最终结果的可视化)

目录 一、SIR模型介绍 二、Python实现SIR模型 1.制作自己的数据集的两种方法&#xff08;csv格式&#xff09; &#xff08;1&#xff09;excel转为csv格式 &#xff08;2&#xff09;通过python对csv格式文件进行内容修改 2.导入数据集 &#xff08;1&#xff09;具体代码如下…

SIR模型和Python实现

一、SIR模型介绍 SIR模型时传染病中最基础最核心的模型&#xff0c;研究的是某个封闭地区的疫情传播规律。 SIR模型的动力学关系如下图&#xff1a; 健康人数S的变化与 健康人数S和正感人数I的乘积&#xff08;代表健康人数和正感人数的接触&#xff09;成正比&#xff0c;其…

SIR传染病模型(微分方程系列1)

一&#xff1a;基本参数 SIR模型是常见的一种描述传染病传播的数学模型&#xff0c;其基本假设是将人群分为以下三类&#xff1a; S:(Susceptible):易感人群&#xff0c;指未得病者&#xff0c;但缺乏免疫能力&#xff0c;与感病者接触后容易受到感染。 I:(Infective):患病人…

【整站下载器】小飞兔整站下载V5.0

小飞兔整站下载是一款只需输入一个网址就能下载一个网站的软件&#xff0c;它可以从Internet的任何地方抓回你想要的任何文件&#xff0c;整站下载主要是用来快速搭建网站、深层分析网站、网站克隆等。

【小飞兔整站下载】整站下载器哪个好用_整站下载工具哪个好

小飞兔整站下载是一款可以下载整个网站内容的软件&#xff0c;你只要输入一个网址&#xff0c;软件能自动分析网站链接、图片、样式、文件等资源&#xff0c;并能将整个网站下载到本地&#xff0c;能在本地正常跳转、浏览。 官网&#xff1a;https://xft.fzxgj.top/ 直接上图…

快速获取一个网站的所有资源,图片,html,css,js等等

今天介绍一款软件,可以快速获取一个网站的所有资源,图片,html,css,js… 以获取某车官网为例 我来展示一下这个软件的功能. 1、输入网站地址 2、下载文件 到此,爬取网站就结束了,有些网站的资源使用的是国外的js,css,速度会有些差异,但效果都是一样的.爬取下来就能使用.放…