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

这里总结了五个模型,分别是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:

clear all;
close all;
clc;

%%SI模型
[t,h] = ode45(@SI,[ ],.01为初始感染人口占比
plot(t,h,'r');
hold on;
plot(t,-h,'g');
legend('感染人口占比I','健康人口占比S');
title('SI模型')

%%SIS模型
figure;
[t,h] = ode45(@SIS,[ ],.01为初始感染人口占比
plot(t,h,'r');
hold on;
plot(t,-h,'g');
legend('感染人口占比I','健康人口占比S');
title('SIS模型')

%%SIR模型
figure;
[t,h] = ode45(@SIR,[ ],[0.01 0.99]);    %[初始感染人口占比 初始健康人口占比]
plot(t,h(:,),),'b');
hold on;
plot(t,-h(:,),'g');
legend('感染人口占比I','健康人口占比S','治愈人口占比R');
title('SIR模型')

%%SIRS模型
figure;
[t,h] = ode45(@SIRS,[ ],[]); %[初始感染人口占比 初始健康人口占比 初始治愈人口占比]
plot(t,h(:,),),'b');
hold on;
plot(t,h(:,),'g');
legend('感染人口占比I','健康人口占比S','治愈人口占比R');
title('SIRS模型')

%%SEIR模型
figure;
[t,h] = ode45(@SEIR,[ ],[]);  %[初始感染人口占比 初始健康人口占比 初始潜伏人口占比 初始治愈人口占比]
plot(t,h(:,),'r');
hold on;
plot(t,h(:,),'b');
plot(t,h(:,),'m');
plot(t,h(:,),'g');
legend('感染人口占比I','健康人口占比S','潜伏人口占比E','治愈人口占比R');
title('SEIR模型')

SI.m:

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

SIS.m:

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

SIR.m:

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

SIRS.m:

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

SEIR.m:

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

模型结果如下:

SI模型:

SIS模型:

SIR模型:

SIRS模型:

SEIR模型:

参考:

https://baike.baidu.com/item/%E4%BC%A0%E6%9F%93%E7%97%85%E6%A8%A1%E5%9E%8B/5130035

matlab练习程序(传染病模型)的更多相关文章

  1. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  2. MATLAB随机森林回归模型

    MATLAB随机森林回归模型: 调用matlab自带的TreeBagger.m T=textread('E:\datasets-orreview\discretized-regression\10bi ...

  3. Backbone.js 为复杂Javascript应用程序提供模型(models)、集合(collections)、视图(views)的结构

    Backbone.js 为复杂Javascript应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和 自定义事件:集合附有可枚举函数 ...

  4. 基本的传染病模型:SI、SIS、SIR及其Python代码实现

    本文主要参考博客:http://chengjunwang.com/en/2013/08/learn-basic-epidemic-models-with-python/.该博客有一些笔误,并且有些地方 ...

  5. 简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型

    如何在ADO中使用接口的抽象数据提供程序 在cofig中 appSettings下,配置数据连接类型 <appSettings> <!--这个键值映射到枚举值中的某个值--> ...

  6. 基于MATLAB搭建的DDS模型

    基于MATLAB搭建的DDS模型 说明: 累加器输出ufix_16_6数据,通过cast切除小数部分,在累加的过程中,带小数进行运算最后对结果进行处理,这样提高了计算精度. 关于ROM的使用: 直接设 ...

  7. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  8. 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul

    本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...

  9. matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读

    静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...

随机推荐

  1. JSP技术(三)

    JSP指令 指令是JSP语法元素的第一种类型.它们指示JSP转换器如何翻译JSP页面为Servlet.JSP定义了多个指令,但只有page和include最重要.而taglib.tag.attribu ...

  2. 【PAT甲级】1102 Invert a Binary Tree (25 分)(层次遍历和中序遍历)

    题意: 输入一个正整数N(<=10),接着输入0~N-1每个结点的左右儿子结点,输出这颗二叉树的反转的层次遍历和中序遍历. AAAAAccepted code: #define HAVE_STR ...

  3. Python 摄像头 树莓派 USB mjpb

    import cv2 import urllib.request import numpy as np import sys host = "192.168.1.109:8080" ...

  4. zookeeper集群搭建记录

    本文仅记录zookeeper集群搭建的过程,留待日后查看.使用. 一.硬件机器: 192.168.183.195 master-node 192.168.183.194 data-node1 192. ...

  5. django 创建管理员用户

    7.2 create 创建管理员用户: python manage.py run server python manage.py createsuperuser password :123456789 ...

  6. 用Eclipse+Maven+Jetty构建Java Web开发环境(详细笔记)

    (软件环境) 『系统』Windows 10 x64 『JAVA』JDK 1.8.0_91 『Eclipse』 Eclipse-oxygen 『Maven』 apache-maven-3.6.3 『Je ...

  7. 8.5-Day1T3--Asm.Def 的一秒

    题目大意 略... (吐槽这题面...让我毫无阅读兴趣) 题解 首先要求出在以两条斜线为新坐标轴下,每个点的坐标 那么....按x先排序 再求y的最长上升子序列 复杂度O(nlogn)吧 记得开lon ...

  8. 关于websockets的压测工具

    这是在workerman群中得到的信息,记录在此: loadrunner  jemeter

  9. 【visio】 设计

    1."设计" 包含了 页面.布局和主题相关设置 2."页面设置" 包含:打印.绘制区域.打印区域.页面缩放.页属性以及替换文字. 替换文字 放在页面设置里,这个 ...

  10. 吴裕雄 python 机器学习——模型选择数据集切分

    import numpy as np from sklearn.model_selection import train_test_split,KFold,StratifiedKFold,LeaveO ...