经典的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)三者之间的动力学关系。
由于人数的最小改变单位为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^+ n∈N+。通过代数变形,可推导数列 { 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;