• SIR传染病模型及matlab代码


    经典的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\{

    dSdt=αS(t)I(t)dRdt=βI(t)        " role="presentation" style="position: relative;">dSdt=αS(t)I(t)dRdt=βI(t)        
    \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\{
    S(t)=αS(t)I(t)        I(t)=αS(t)I(t)βI(t)R(t)=βI(t)                " role="presentation">S(t)=αS(t)I(t)        I(t)=αS(t)I(t)βI(t)R(t)=βI(t)                
    \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\{

    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)                " role="presentation" style="position: relative;">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)                
    \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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    大模型时代,探人工智能发展的新动向
    SBT 运行出现 module java.base does not “opens java.lang“ to unnamed module错误
    二十一、SpringBoot + Jwt + Vue 权限管理系统 (2)
    数据库 Apache Doris 展开了为期两个月的调研测试
    【RocketMQ专题】快速实战及集群架构原理详解
    数据的存储--Redis缓存存储
    汽车专场 | 新能源汽车动力电池PACK CAE分析实例解读
    RN搜索高亮显示
    将 .NET Aspire 部署到 Kubernetes 集群
    流程图高级用法【Markdown进阶篇】
  • 原文地址:https://blog.csdn.net/weixin_52252897/article/details/127454380