zoukankan      html  css  js  c++  java
  • MATLAB 传染病模型

    最近新型冠状病毒疫情越来越严重了,待在家中没法出去,学习一下经典传染病模型。

    这里总结了五个模型,分别是SI模型,SIS模型,SIR模型,SIRS模型,SEIR模型。

    这几种模型的特点先介绍一下。

    首先定义SEIR:

    S为易感者 (Susceptible),指未得病者,但缺乏免疫能力,与感染者接触后容易受到感染;

    E为暴露者 (Exposed),指接触过感染者,但暂无能力传染给其他人的人,对潜伏期长的传染病适用;

    I为感病者 (Infective),指染上传染病的人,可以传播给 S 类成员,将其变为 E 类或 I 类成员;

    R为康复者 (Recovered),指被隔离或因病愈而具有免疫力的人。如免疫期有限,R 类成员可以重新变为 S 类。

    一、SI模型

    该模型只考虑易感者和感病者,感病者不断去感染易感者。

    随着时间推移,该模型感染者越来越多直到所有人都感染。

    其微分方程为:

    其中beta为感染率。

    二、SIS模型 

    该模型依然只考虑易感者和感病者,感病者不断去感染易感者,这里感病者会得到治疗恢复成易感者,不过恢复后依然可能得病。

    随着时间推移,该模型感染者和易感者会达到动态平衡。

    其微分方程为:

    其中beta为感染率,gamma为治愈率。

    三、SIR模型

    该模型考虑易感者、感病者与康复者,其中感病者不断感染易感者,而感病者又不断接受治疗成为康复者,康复者因为得到抗体不会再成为易感者。

    随着时间推移,该模型康复者越来越多,最终所有人都成为康复者。

    其微分方程为:

    其中beta为感染率,gamma为治愈率。

    四、SIRS模型

    该模型考虑易感者、感病者与康复者,其中感病者不断感染易感者,而感病者不断接受治疗成为康复者,康复者获得抗体能够抵抗一段时间,不过最终还是会成为易感者。

    该模型和SIS模型很像,区别就是康复者能够抵抗一段时间,也就是有一定的复感率,而SIS模型的复感率为1。

    随着时间推移,该模型同样会达到一个动态平衡。

    其微分方程为:

    其中beta为感染率,gamma为治愈率,alpha为复感率。

    五、SEIR模型

    该模型四种参与者全部考虑,其中感病者不断感染易感者,易感者得到病毒会成为潜伏者,潜伏者依然能够使易感者感染,潜伏者有一定概率自己痊愈,感染者接受治疗也能够痊愈,痊愈后不再能够感染该病。

    随着时间推移,该模型最终也是所有人都会成为康复者。

    其微分方程为:

    其中beta为感染率,gamma1为潜伏期康复率,gamma2为患者康复率,alpha为潜伏期转阳率。

    各模型matlab代码如下,其中ode45为4阶龙格库塔法解微分方程,具体实现见上一篇文章:

    main.m:

     1 clear all;
     2 close all;
     3 clc;
     4 
     5 %%SI模型
     6 [t,h] = ode45(@SI,[0 120],0.01);    %0.01为初始感染人口占比
     7 plot(t,h,'r');
     8 hold on;
     9 plot(t,1-h,'g');
    10 legend('感染人口占比I','健康人口占比S');
    11 title('SI模型')
    12 
    13 %%SIS模型
    14 figure;
    15 [t,h] = ode45(@SIS,[0 120],0.01);   %0.01为初始感染人口占比
    16 plot(t,h,'r');
    17 hold on;
    18 plot(t,1-h,'g');
    19 legend('感染人口占比I','健康人口占比S');
    20 title('SIS模型')
    21 
    22 %%SIR模型
    23 figure;
    24 [t,h] = ode45(@SIR,[0 300],[0.01 0.99]);    %[初始感染人口占比 初始健康人口占比]
    25 plot(t,h(:,1),'r',t,h(:,2),'b');
    26 hold on;
    27 plot(t,1-h(:,2),'g');
    28 legend('感染人口占比I','健康人口占比S','治愈人口占比R');
    29 title('SIR模型')
    30 
    31 %%SIRS模型
    32 figure;
    33 [t,h] = ode45(@SIRS,[0 300],[0.01 0.99 0]); %[初始感染人口占比 初始健康人口占比 初始治愈人口占比]
    34 plot(t,h(:,1),'r',t,h(:,2),'b');
    35 hold on;
    36 plot(t,h(:,3),'g');
    37 legend('感染人口占比I','健康人口占比S','治愈人口占比R');
    38 title('SIRS模型')
    39 
    40 %%SEIR模型
    41 figure;
    42 [t,h] = ode45(@SEIR,[0 300],[0.01 0.98 0.01 0]);  %[初始感染人口占比 初始健康人口占比 初始潜伏人口占比 初始治愈人口占比]
    43 plot(t,h(:,1),'r');
    44 hold on;
    45 plot(t,h(:,2),'b');
    46 plot(t,h(:,3),'m');
    47 plot(t,h(:,4),'g');
    48 legend('感染人口占比I','健康人口占比S','潜伏人口占比E','治愈人口占比R');
    49 title('SEIR模型')

    SI.m:

    1 function dy=SI(t,x)
    2 beta = 0.1;    %感染率
    3 dy=beta*x*(1-x);

    SIS.m:

    1 function dy=SIS(t,x)
    2 beta = 0.1;    %感染率
    3 gamma= 0.02;    %治愈率
    4 dy=beta*x*(1-x)-gamma*x;

    SIR.m:

    1 function dy=SIR(t,x)
    2 beta = 0.1;    %感染率
    3 gamma = 0.02;    %治愈率
    4 dy=[beta*x(1)*x(2)-gamma*x(1);
    5     -beta*x(1)*x(2)];

    SIRS.m:

    1 function dy=SIRS(t,x)
    2 beta = 0.1;      %感染率
    3 gamma = 0.02;    %治愈率
    4 alpha = 0.01;    %治愈复感率
    5 dy=[beta*x(1)*x(2)-gamma*x(1);
    6     -beta*x(1)*x(2)+alpha*x(3)
    7     gamma*x(1) - alpha*x(3)];

    SEIR.m:

    1 function dy=SEIR(t,x)
    2 beta = 0.1;         %感染率
    3 gamma1 = 0.05;      %潜伏期治愈率
    4 gamma2 = 0.02;      %患者治愈率
    5 alpha = 0.5;        %潜伏期转阳率
    6 dy=[alpha*x(3) - gamma2*x(1);
    7     -beta*x(1)*x(2);
    8     beta*x(1)*x(2) - (alpha+gamma1)*x(3);
    9     gamma1*x(3)+gamma2*x(1)];

    模型结果如下:

    SI模型:

    SIS模型:

    SIR模型:

    SIRS模型:

    SEIR模型:

  • 相关阅读:
    Eclipse中Outline里各种图标的含义
    synchronized
    instanceof
    java代码实现rabbitMQ请求
    ftp服务的搭建及调用
    WebService学习总结(三)——使用JDK开发WebService
    Java Web Service 学习
    通俗理解阻塞、非阻塞,同步、异步。
    mongo VUE 操作
    【清华集训2014】主旋律
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13645469.html
Copyright © 2011-2022 走看看