SIR传染病模型及matlab代码

24 篇文章 2 订阅
16 篇文章 1 订阅

经典的SIR模型由克马克与麦肯德里克在1927年提出,当时的研究背景是伦敦正在流行黑死病。SIR模型将所有人(在传染性强的病毒面前,假设所有人均可能被感染,但已痊愈者将免疫)分为三类:还没被感染者,数量为 S S S(单位:千人);正感染者,数量为 I I I(单位:千人);已痊愈或死亡者,数量为 R R R(单位:千人)。显然 S S S I I I R R R均为关于时间 t t t(单位:天)的函数,将其设为 S ( t ) S(t) S(t) I ( t ) I(t) I(t) R ( t ) R(t) R(t),显然 S ( t ) + I ( t ) + R ( t ) = M S(t)+I(t)+R(t)=M S(t)+I(t)+R(t)=M,其中 M M M为总人口数(单位:千人)。SIR模型构建了 S ( t ) S(t) S(t) I ( t ) I(t) I(t) R ( t ) R(t) R(t)三者之间的动力学关系。

连续的SIR

由于人数的最小改变单位为1,是系统单位的千分之一,因此可以假设 S ( t ) S(t) S(t) I ( t ) I(t) I(t) R ( t ) R(t) R(t)均为随时间 t t t变化的连续函数。又由于可导函数可以任意精度逼近连续函数(可导函数类在连续函数类中稠密,这是微分拓扑的一个基本结果),于是可以进一步假设 S ( t ) S(t) S(t) I ( t ) I(t) I(t) R ( t ) R(t) R(t)均为随时间 t t t变化的可导函数,即 S ′ ( t ) S'(t) S(t) I ′ ( t ) I'(t) I(t) R ′ ( t ) R'(t) R(t)均存在,分别表示“还没感染人数”“正感染人数”“已痊愈或死亡人数”的变化速度。

关于病毒传播的两个常识性认知如下。

(1)“还没被感染人数” S ( t ) S(t) S(t)逐渐减少。 S ( t ) S(t) S(t)越大, S ( t ) S(t) S(t)下降越快;“正感染人数” I ( t ) I(t) I(t)越大, S ( t ) S(t) S(t)下降越快。而且 S ( t ) S(t) S(t)越大, I ( t ) I(t) I(t) S ( t ) S(t) S(t)下降速度的影响越明显。

(2)“已痊愈或已死亡人数” R ( t ) R(t) R(t)的变化速度和 I ( t ) I(t) I(t)正相关。

根据(1)和(2), S ′ ( t ) S'(t) S(t)和乘积 S ( t ) I ( t ) S(t)I(t) S(t)I(t)负相关, R ′ ( t ) R'(t) R(t) I ( t ) I(t) I(t)正相关,于是有
{ d S d t = − α S ( t ) I ( t ) d R d t = β I ( t )          \left\{ \begin{aligned} \dfrac{dS}{dt}=-\alpha S(t)I(t) \\ \dfrac{dR}{dt}=\beta I(t)~~~~~~~~ \\ \end{aligned} \right. dtdS=αS(t)I(t)dtdR=βI(t)        
其中 α > 0 \alpha >0 α>0 β > 0 \beta >0 β>0分别为待定的正比例常数。再注意到
S ( t ) + I ( t ) + R ( t ) = M S(t)+I(t)+R(t)=M S(t)+I(t)+R(t)=M
如果假设总人口数 M M M不变,对上式两边求导可得
S ′ ( t ) + I ′ ( t ) + R ′ ( t ) = 0 S'(t)+I'(t)+R'(t)=0 S(t)+I(t)+R(t)=0
于是得到微分方程组
{ S ′ ( t ) = − α S ( t ) I ( t )          I ′ ( t ) = α S ( t ) I ( t ) − β I ( t ) R ′ ( t ) = β I ( t )                  \left\{ \begin{aligned} S'(t)=-\alpha S(t)I(t)~~~~~~~~\\ I'(t)=\alpha S(t)I(t)-\beta I(t) \\ R'(t)=\beta I(t)~~~~~~~~~~~~~~~~ \end{aligned} \right. S(t)=αS(t)I(t)        I(t)=αS(t)I(t)βI(t)R(t)=βI(t)                
这便是经典的SIR模型,模型中含有两个系统参数 α \alpha α β \beta β,它们的现实意义分别为“病毒在人群中的强度”与“正感染者转化为已痊愈或已死亡者的比例”,当病毒未产生便以前,克认为参数 α \alpha α β \beta β均为正定常数。

离散情形

因为连续的SIR模型可以用微积分作为处理工具,所以更加便于推导性质。但是微分方程组难以求出解析解,面对这种情况,常用的解决办法是离散化模型以便数值模拟。最基本的离散化办法是“用平均变化率代替斜率”,即用
Δ f ( t ) Δ t = f ( t + Δ t ) − f ( t ) Δ t \frac{\Delta f(t)}{\Delta t}=\frac{f(t+\Delta t)-f(t)}{\Delta t} ΔtΔf(t)=Δtf(t+Δt)f(t)
代替 f ′ ( t ) f'(t) f(t)。鉴于目前基本的采样时间单位为1天,则令 Δ t = 1 \Delta t=1 Δt=1,于是可得
f ( t + 1 ) − f ( t ) 1 ≈ f ′ ( t ) \frac{f(t+1)-f(t)}{1}\approx f'(t) 1f(t+1)f(t)f(t)

f ( t + 1 ) ≈ f ( t ) + f ′ ( t ) f(t+1)\approx f(t)+f'(t) f(t+1)f(t)+f(t)
这样就得到了从 t t t时刻状态估计 t + 1 t+1 t+1时刻状态的近似递推关系,这种方法被称为欧拉近似法。

利用欧拉近似法,可以将模型离散化为如下的离散模型
{ S ( n + 1 ) = S ( n ) − α S ( n ) I ( n )            I ( n + 1 ) = I ( n ) + α S ( n ) I ( n ) − β I ( n ) R ( n + 1 ) = R ( n ) + β I ( n )                  \left\{ \begin{aligned} S(n+1)=S(n)-\alpha S(n)I(n)~~~~~~~~~~\\ I(n+1)=I(n)+\alpha S(n)I(n)-\beta I(n) \\ R(n+1)=R(n)+\beta I(n)~~~~~~~~~~~~~~~~ \end{aligned} \right. S(n+1)=S(n)αS(n)I(n)          I(n+1)=I(n)+αS(n)I(n)βI(n)R(n+1)=R(n)+βI(n)                
其中 n ∈ N + n\in N^+ nN+。通过代数变形,可推导数列 { I ( n ) } \{I(n)\} {I(n)}的递推关系。

n=100; 
M=10000; 
E=zeros(3,n);
E(1,1)=980; 
E(2,1)=20; 
E(3,1)=0;
alpha=0.0014; 
beta=0.6126;  
for t=1:n-1
    E(1,t+1)=E(1,t)-alpha.*E(1,t).*E(2,t);
    E(2,t+1)=E(2,t)+alpha.*E(1,t).*E(2,t)-beta.*E(2,t);
    E(3,t+1)=E(3,t)+beta.*E(2,t);
end
S=E(1,:); 
I=E(2,:); 
R=E(3,:); 
hold on
plot(S,'DisplayName','S','LineWidth',2);
plot(I,'DisplayName','I','LineWidth',2);
plot(R,'DisplayName','R','LineWidth',2);
legend('健康者人数','感染者人数','免疫者人数');
xlabel('迭代次数');
ylabel('人数');
grid on;
hold off;
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数小模.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值