用python实现传染病模型传染病模型

article/2025/9/25 11:55:00

用python实现传染病模型

  • 1.SI模型
    • 1.1 代码实现
    • 1.2 模型的结果
  • 2.SIS (治愈后仍然还是易感者)
    • 2.1 代码实现
    • 2.2模型的结果
  • 3 SIR模型(治愈后直接移除)
    • 3.2代码实现
    • 3.2绘制图像:
  • 4.SEIR 模型(新增一个人群,叫潜伏者E)
    • 4.1代码实现
    • 4.2模型的结果

参考文章为:https://www.kesci.com/mw/project/60161bf6ac79f40016b7d7d9

1.SI模型

示意图:

Image Name

我们假设城市有一千万(N=10的7次方)人,每个患者每天接触感染每天0.8人(lamda=0.8),初始感染人数为45人(i0 = 45/N),我们来模拟70天(T=70)的情况。

1.1 代码实现

import numpy as np
import matplotlib.pyplot as plt
#population N = 1e7#simuation TimeT = 70
# susceptiable ratio 易感染比例
s = np.zeros([T])
# infective ratio 感染比例
i = np.zeros([T])# 由我们的实验可以知道,lamda是有取值范围的,似乎超过1就不可以了
# concat ratelamda = 0.9# initial infective people i[0] = 45.0 / N
s[0] = 1-i[0]for t in range(T-1):i[t+1] = i[t] + i[t]  * lamda * (1.0 - i[t])s[t+1] = 1 - i[t+1]

1.2 模型的结果

#感染者随着天数的变化曲线
fig, ax = plt.subplots(figsize=(8,4))
ax.plot(i, c='r', lw=2)
ax.plot(s, c='b', lw=2)ax.set_xlabel('Day',fontsize=20)
ax.set_ylabel('Infective Ratio', fontsize=20)
ax.grid(1)
plt.xticks(fontsize=20)plt.yticks(fontsize=20);

在这里插入图片描述

由上图可见,大约在25天左右,全部人群都会变成感染者,感染率为1

lamda的现实意义就是该城市的卫生水平,衡量的是消毒,隔离这些措施执行得怎么样。

回到传染病模型,按照SI模型计算的结果,我们全人类都会患病,这好可怕!原因是我们忽略了一个很重要的因素,那就是我们有奋斗在一线的医护人员,我们会被治愈!所以SI模型只适合研究具有高传染风险又不能被治愈的病(比如HIV)。

但是对于其他病,我们是可以靠医疗和自身免疫系统康复的,那么紧接着的一个问题就是,被治愈后还会再被传染上嘛?根据这个问题的回答不同,我们有了两个不同的模型,SIR 和 SIS。现在可以揭晓,SIR的R的含义了,就是移出者(Removed),现实含义就是指被治愈后不会再被感染的人。 而SIS表示治愈后仍然还是易感者。下面我们用python来分别实现这两个模型。

2.SIS (治愈后仍然还是易感者)

为了实现这个模型,我们需要引入新的一个参数,治愈率 γ \gamma γ。好啦,先上我们的新示意图:

Image Name

和SI模型做比较,区别就是计算感染者的增加数时要减去被治愈的人数。
所以这时候每天的增加的感染者为: λ × i N × s − γ × i N \lambda \times i N \times s-\gamma \times i N λ×iN×sγ×iN ,
增加的感染率为: λ × i × s − γ i \lambda \times i \times s-\gamma i λ×i×sγi
模型完成啦,修改python代码:

2.1 代码实现

# susceptiable ratio
s = np.zeros([T])# infective ratioi = np.zeros([T])# concat rate(这个其实是有效的感染率)lamda = 1.0# recover rate(治愈率)gamma = 0.5# initial infective people i[0] = 45.0 / N
s[0] = 1-i[0]for t in range(T-1):i[t+1] = i[t] + i[t] * (1- i[t])* lamda - i[t] * gammas[t+1] = 1 - i[t+1]

2.2模型的结果

 fig, ax = plt.subplots(figsize=(8,4))
ax.plot(i, c='r', lw=2)
ax.plot(s, c='b', lw=2)ax.set_xlabel('Day',fontsize=20)
ax.set_ylabel('Infective Ratio', fontsize=20)
ax.grid(1)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20);

在这里插入图片描述
可以看到,达到最大感染率的时间退后10天左右,最后感染和治愈达到动态平衡,人群中有始终有一半的人感染着。所以,SIS模型适合研究具有传染性和反复性的流行病,比如常见流感。同样的,感兴趣的话,改变lamda和gamma的值,观察曲线的变化。和lamda不同的是,gamma的现实意义就是对这种疾病的治疗水平。

3 SIR模型(治愈后直接移除)

加入了移出者,被治愈的病人不会再被传染,先上我们的新示意图:

Image Name

SIR 模型
注意到这里,人群被分成了三类,不再只有I和S,所以相比于之前的模型,我们需要找到新的约束关系。现在我们需要分别计算三种人每天的增加量了:

  • 易感者:每天都在被传染,所以一直在减少,减少量为被传染的人数: λ N i s \lambda N i s λNis
  • 感染者:增加了被感染的人,减少了治愈的人: λ N i s − γ N i \lambda N i s-\gamma N i λNisγNi
  • 移出者:增加了治愈的人: γ N i \gamma N i γNi

建模完成,修改python代码,并且假设人群普遍易感,新型疾病,初始没有移出者。

γ = 0.0821 , λ = 0.2586 , 初 始 易 感 人 数 为 一 千 万 , 初 始 感 染 10 人 , 那 么 我 们 的 城 市 总 人 数 N = 1 e 7 + 10 \gamma=0.0821,\lambda=0.2586 ,初始易感人数为一千万, 初始感染10人,那么我们的城市总人数 N=1 e 7+10 γ=0.0821,λ=0.2586,10N=1e7+10

3.2代码实现

# populationN = 1e7 + 10 # simuation Time / Day
T = 170# susceptiable ratios = np.zeros([T])# infective ratioi = np.zeros([T])#remove ratio
r = np.zeros([T])# contact ratelamda = 0.2586# recover rate gamma = 0.0821# initial infective peoplei[0] = 10.0 / Ns[0] = 1e7 / Nfor t in range(T-1):i[t+1] = i[t]+i[t]* lamda * s[t] - gamma*i[t]s[t+1] = s[t] - lamda * i[t]*s[t]r[t+1] =r[t] + gamma * i[t]

3.2绘制图像:

fig, ax = plt.subplots(figsize=(10,6))
ax.plot(s, c='b', lw=2, label='S')
ax.plot(i, c='r', lw=2, label='I')
ax.plot(r, c='g', lw=2, label='R')
ax.set_xlabel('Day',fontsize=20)
ax.set_ylabel('Infective Ratio', fontsize=20)
ax.grid(1)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend();

在这里插入图片描述
感染人数峰值发生在一个月左右,最大感染人数不到人群的20%, 但是最终人群的80%都会得此病(就是最终的移出者的比例)。SIR模型适合研究没有潜伏期的急性传染病,治疗后能够痊愈并具有抗病性。

4.SEIR 模型(新增一个人群,叫潜伏者E)

但是,SIR模型和实际情况的出入会比较大,因为忽略了太多因素了,比如说潜伏期,比如说政策调控,药物,出生死亡等等。下面我们可以和前面一样,把潜伏期考虑进去,新增一个人群,叫潜伏者E(exposed):

Image Name

SEIR模型
同样的我们需要计算各人群每天的增加量:

S:每天减少: λ N i s \lambda N i s λNis

E:每天增加传染,减少发病: λ N i s − σ N e \lambda N i s-\sigma N e λNisσNe

I:每天增加发病,减少治愈: σ N e − γ N i \sigma N e-\gamma N i σNeγNi

R:每天增加治愈: γ N i \gamma N i γNi

建模完成,修改我们的python程序,这里的 σ \sigma σ可以理解为潜伏期的倒数。给的4天。新型冠状病毒给目前临床的潜伏期是3-14天。

4.1代码实现

# population
N = 1e7 + 10 + 5
# simuation Time / Day
T = 170
# susceptiable ratio
s = np.zeros([T])
# exposed ratio
e = np.zeros([T])
# infective ratio
i = np.zeros([T])
# remove ratio
r = np.zeros([T])# contact rate
lamda = 0.5
# recover rate
gamma = 0.0821# 潜伏期# exposed periodsigma = 1 / 4# initial infective people
i[0] = 10.0 / N
s[0] = 1e7 / N
e[0] = 40.0 / Nfor t in range(T-1):s[t + 1] = s[t] - lamda * s[t] * i[t]e[t + 1] = e[t] + lamda * s[t] * i[t] - sigma * e[t]i[t + 1] = i[t] + sigma * e[t] - gamma * i[t]r[t + 1] = r[t] + gamma * i[t]

4.2模型的结果

fig, ax = plt.subplots(figsize=(10,6))
ax.plot(s, c='b', lw=2, label='S')
ax.plot(e, c='orange', lw=2, label='E')
ax.plot(i, c='r', lw=2, label='I')
ax.plot(r, c='g', lw=2, label='R')
ax.set_xlabel('Day',fontsize=20)
ax.set_ylabel('Infective Ratio', fontsize=20)
ax.grid(1)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend();

在这里插入图片描述


http://chatgpt.dhexx.cn/article/q4DTgsaV.shtml

相关文章

基于SEIR传染病模型的新冠肺炎疫情预测

整理一下暑假参加的数学建模训练题:) 仅供学习理解传染病模型 源代码仅供参考:MathematicalModeling/COVID-19 at main AOYLAOTANG/MathematicalModeling GitHub 目录 一、题目介绍 二、问题分析 2.1问题一: 2.2问题二&am…

传染病模型(1)——SI模型及matlab详解

前言 常见的传染病模型按照具体的传染病的特点可分为 SI、SIS、SIR、SIRS、SEIR 模型。其中“S”“E”“I”“R”的现实含义如下: S (Susceptible),易感者,指缺乏免疫能力健康人,与感染者接触后容易受到感染; E (Ex…

Python:SEIR传染病模型

Hello,大家好!好久没有更新了,今天给大家介绍一个非常经典的模型——SEIR传染病模型! SEIR传染病模型 模型介绍S、E、I、R代表的含义模型建立变量解释建立微分方程转化迭代形式 Python实现总结获得源代码 模型介绍 传染病的基本…

经典的传染病模型简介 + SIS情况分析

传染病模型简介 SIS情况分析 简介各类经典传染病模型(基础形式)SIS模型假设符号说明微分方程组模型结论 经典传染病模型的缺陷 简介 研究传染病模型,对社会经济和维持秩序有重大意义,尤其在过去的2020年,新冠疫情爆发…

传染病模型

参考:https://www.zhihu.com/question/367466399?fromgroupmessage 假定人群分为4种,分别是: SUSCEPTIBLES:易感者,潜在的可感染人群。EXPOSED:潜伏者,已经被感染没有表现出来的人群。INFECTIVES&#xf…

微分方程传染病模型之指数模型-SI模型-SIS模型-SIR模型

传染病(瘟疫)经常在世界各地流行,如霍乱、天花、艾滋病、SARS、新型冠状病毒、H5N1病毒等,建立传染病的数学模型,分析其变化规律,防止其蔓延是一项艰巨的任务,这里就一般的传染规律讨论传染病的…

数学模型:传染病模型

传染病模型 需要考虑的问题基本方法模型1模型2(SI模型)模型3(SIS模型)模型4(SIR模型) 需要考虑的问题 描述传染病的传播过程分析受感染人数的变化规律预报传染病高潮到来的时刻预防传染病蔓延的手段 基本…

传染病模型知识储备

一、模型中的人群分类 S (Susceptible),易感者,指缺乏免疫能力健康人,与感染者接触后容易受到感染; E (Exposed),暴露者 ,指接触过感染者但暂无传染性的人,可用于存在潜伏期的传染病&#xff…

传染病模型-SIR

一、模型背景 传染病模型指传染病的基本数学模型,主要研究传染病的传播速度、空间范围、传播途径、动力学机理等问题,以指导对传染病的有效地预防和控制。常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型,本文着重介绍其中的SI…

C语言用函数、递归的方法求n的阶乘

函数fac代码 当n<1时&#xff0c;结果为1 当n>1时&#xff0c;n只要乘前一个n的阶乘值就是n的阶乘&#xff0c;即&#xff1a;n*fac(n-1) int fac(int n) {if(n<1)return 1;elsereturn n*fac(n-1); } 主函数代码 int main() {int n0;int ret0;scanf("%d&quo…

通过C语言实现函数的递归 ---自己调用自己

Hellow&#xff0c;我是jack&#xff0c;今天给大家分享的是C语言实现函数的递归调用。 在使用递归调用时&#xff0c;我们应明白以下几点&#xff1a; 1.存在限制条件 限制条件不存在时&#xff0c;不在递归 2.递归越来越接近结尾 3.递归层次不能太深 注意这几点就是让我们在…

C++语言基础--递归函数

对于很多编程初学者来说&#xff0c;递归算法是学习语言的最大障碍之一。可能也有一大部分人知道递归&#xff0c;也能看的懂递归&#xff0c;但在实际做题过程中&#xff0c;却不知道怎么使用 递归的定义 1、很官方的说法 递归&#xff0c;在数学与计算机科学中&#xff0c;…

11.函数(C语言)+递归函数(超清晰图解递归)

函数 1.函数是什么&#xff1f;2.库函数1&#xff09;库函数的基本知识2&#xff09;初识几个库函数 3.自定义函数自定义函数的组成 4.函数参数1 )实际参数&#xff08;实参&#xff09;&#xff1a;2) 形式参数&#xff08;形参&#xff09;&#xff1a; 5.函数调用1) 传值调用…

C语言之函数递归

前言   从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&#xff0c;正在给小和尚讲故事呢&#xff01;故事是什么呢&#xff1f;"从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&#xff0c;正在给小和尚讲故事呢&#xff01;故事是什么呢&…

C语言——函数递归

文章目录 前言递归的概念递归的两个必要条件例题1.递归实现阶乘2.递归实现strlen函数3.计算一个正整数各位数字的和4.递归实现整数n的整数k次方5.递归实现斐波那契数6.递归实现字符串逆序7.汉诺塔8.青蛙跳台阶9.将一个十进制数以二进制的形式打印 前言 本文总结了几个递归基础例…

C语言的递归函数

递归函数&#xff08;一&#xff09; 递归就是一个函数在它的函数体内调用它自身。 执行递归函数将反复调用其自身&#xff0c;每调用一次就进入新的一层。 注意递归函数必须有结束条件 递归函数&#xff08;二&#xff09; 5的阶乘这个例子进行一下剖析&#xff0c;看一看他…

函数递归调用(c语言为例)

定义:在调用一个函数的过程中又出现直接或间接调用该函数本身&#xff0c;称为函数的递归调用。 int fun(int x){return fun(x2);//在执行f函数的过程中又要调用f函数 } 在调用函数f的过程中&#xff0c;又要调用f函数&#xff0c;这是直接调用本函数&#xff0c;如图1 图 1 如…

【C语言】函数递归(详解)

文章目录 函数递归什么是递归&#xff1f;递归的俩个必要条件代码引例1栈溢出&#xff08;Stack Overflow&#xff09; 合理使用递归代码引例3代码引例4解释要合理使用递归 结束语 函数递归 程序调用自身的编程技巧称为递归 recursion&#xff09; 函数自己调用自己就是递归 …

php熔断,微服务-API熔断原理

伴随微服务&#xff0c;出现了很多新鲜的名词&#xff0c;其实剥去外衣并没有那么高大上。 今天要谈到的&#xff0c;叫做”熔断”&#xff0c;一个典型的开源实现是Hystrix(JAVA实现)。 背景 一个分布式系统中&#xff0c;服务间互相调用错综复杂&#xff0c;假设某个基础服务…

接口熔断 java_SpringCloud(五):服务熔断与熔断监控

一、概念部分 1.什么是熔断器? 熔断,就是断开与服务器的连接,熔断器是在服务不可用的时候主动断开,以免造成更多的雪崩效应,他是保护服务高可用的最后一道防线。 2.为什么需要熔断器? 为保证服务高可用,最先想到的是服务集群,但集群并不能完全的保证服务高可用, 当某个…