sirs模型_基于plotly的数据可视化——经典传染病模型

2023-11-20 21:10

本文主要是介绍sirs模型_基于plotly的数据可视化——经典传染病模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

e93645571af7c3131b11345c5e7a464c.png

本文只讲述如何使用Python将模型中的微分方程进行可视化,具体各个模型的理论细节,请移步其他专业传染病动力学文章。

SI模型

SI模型只适合研究具有高传染风险又不能被治愈的病(比如HIV)已经患病的人就不能再被传染了 。人群分为两类 :易感者(S-susceptiable)和感染者(I-infective)

SI-Model

#SI-Modelimport scipy.integrate as spi
import numpy as np
import plotly as py
import plotly.graph_objects as go
pyplt = py.offline.plotfig = go.Figure()
# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0
# I_0为感染者的初始人数
I_0 = 1
# S_0为易感者的初始人数
S_0 = N - I_0
# T为传播时间
T = 150# INI为初始状态下的数组
INI = (S_0,I_0)def funcSI(inivalue,_):Y = np.zeros(2)X = inivalue# 易感个体变化Y[0] = - (beta * X[0] * X[1]) / N + gamma * X[1]# 感染个体变化Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]return YT_range = np.arange(0,T + 1)RES = spi.odeint(funcSI,INI,T_range)fig.add_trace(go.Scatter(y = RES[:,0],mode = 'lines', # 线性图name = '感染者'
))fig.add_trace(go.Scatter(y = RES[:,1],mode = 'lines', # 线性图name = '易感者'
))fig.update_layout(yaxis={'title':'人数'},xaxis={'title':'天数'},title={'text':'SI-Model','xref':'paper','x':0.5,},hovermode="x",#height=600,template="plotly_white",
)fig.show()

4dacb86b1f2a32a086a6cba5bd887fce.png
SI-Model

SIS模型

SIS模型适合研究具有传染性和反复性的流行病,和SI模型做比较,区别就是计算感染者的增加数时要 减去被治愈的人数

SIS-Model

#SIS-Modelimport scipy.integrate as spi
import numpy as np
import plotly.graph_objects as go
pyplt = py.offline.plotfig = go.Figure()
# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0.05
# I_0为感染者的初始人数
I_0 = 1
# S_0为易感者的初始人数
S_0 = N - I_0
# T为传播时间
T = 150# INI为初始状态下的数组
INI = (S_0,I_0)def funcSIS(inivalue,_):Y = np.zeros(2)X = inivalue# 易感个体变化Y[0] = - (beta * X[0]) / N * X[1] + gamma * X[1]# 感染个体变化Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]return YT_range = np.arange(0,T + 1)RES = spi.odeint(funcSIS,INI,T_range)fig.add_trace(go.Scatter(y = RES[:,0],mode = 'lines', # 线性图name = '感染者'
))fig.add_trace(go.Scatter(y = RES[:,1],mode = 'lines', # 线性图name = '易感者'
))fig.update_layout(yaxis={'title':'人数'},xaxis={'title':'天数'},title={'text':'SIS-Model','xref':'paper','x':0.5,},hovermode="x",#height=600,template="plotly_white",
)fig.show()

a5d569a69f66dbcc0321b1415e2cd615.png
SIS-Model

SIR模型

SIR模型适合研究没有潜伏期的急性传染病,治疗后能够痊愈并具有抗病性。模型加入移出者(Removed),即被治愈的病人不会再被传染。

SIR-Model

#SIR-Model
import scipy.integrate as spi
import numpy as np
import plotly.graph_objects as go
pyplt = py.offline.plotfig = go.Figure()
# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0.05
# I_0为感染者的初始人数
I_0 = 1
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - R_0
# T为传播时间
T = 150# INI为初始状态下的数组
INI = (S_0,I_0,R_0)def funcSIR(inivalue,_):Y = np.zeros(3)X = inivalue# 易感个体变化Y[0] = - (beta * X[0] * X[1]) / N# 感染个体变化Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]# 治愈个体变化Y[2] = gamma * X[1]return YT_range = np.arange(0,T + 1)RES = spi.odeint(funcSIR,INI,T_range)fig.add_trace(go.Scatter(y = RES[:,0],mode = 'lines', # 线性图name = '感染者'
))fig.add_trace(go.Scatter(y = RES[:,1],mode = 'lines', # 线性图name = '易感者'
))
fig.add_trace(go.Scatter(y = RES[:,2],mode = 'lines', # 线性图name = '治愈者'
))fig.update_layout(yaxis={'title':'人数'},xaxis={'title':'天数'},title={'text':'SIR-Model','xref':'paper','x':0.5,},hovermode="x",#height=600,template="plotly_white",
)fig.show()

ef35be34e5e687ee60cda8839ba5e6ee.png
SIR-Model

SIRS模型

现实情况却是部分传染病并不会痊愈后拥有终身抗体,即被治愈的病人 仍会再被传染。SIRS模型相对SIR模型加入抗体时间

SIRS-Model

#SIRS-Model
import scipy.integrate as spi
import numpy as np
import plotly.graph_objects as go
pyplt = py.offline.plot
fig = go.Figure()
# N为人群总数
N = 10000
# β为传染率系数
beta = 0.25
# gamma为恢复率系数
gamma = 0.05
# Ts为抗体持续时间
Ts = 15
# I_0为感染者的初始人数
I_0 = 1
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - R_0
# T为传播时间
T = 150# INI为初始状态下的数组
INI = (S_0,I_0,R_0)def funcSIRS(inivalue,_):Y = np.zeros(3)X = inivalue# 易感个体变化Y[0] = - (beta * X[0] * X[1]) / N + X[2] / Ts# 感染个体变化Y[1] = (beta * X[0] * X[1]) / N - gamma * X[1]# 治愈个体变化Y[2] = gamma * X[1] - X[2] / Tsreturn YT_range = np.arange(0,T + 1)RES = spi.odeint(funcSIRS,INI,T_range)fig.add_trace(go.Scatter(y = RES[:,0],mode = 'lines', # 线性图name = '感染者'
))fig.add_trace(go.Scatter(y = RES[:,1],mode = 'lines', # 线性图name = '易感者'
))
fig.add_trace(go.Scatter(y = RES[:,2],mode = 'lines', # 线性图name = '治愈者'
))fig.update_layout(yaxis={'title':'人数'},xaxis={'title':'天数'},title={'text':'SIRS-Model','xref':'paper','x':0.5,},hovermode="x",#height=600,template="plotly_white",
)fig.show()

91a6282ef0beb03b0865fd02a5f36774.png
SIRS-Model

SEIR模型

SIR模型忽略了太多因素了导致和实际情况有较大出入,比如潜伏期,药物,出生死亡等等。接来下可以把 潜伏期考虑进去,新增一个人群,叫 潜伏者E(exposed)

SEIR-Model

#SEIR-Model
import scipy.integrate as spi
import numpy as np
import plotly.graph_objects as go
pyplt = py.offline.plot
fig = go.Figure()# N为人群总数
N = 10000
# β为传染率系数
beta = 0.5
# gamma为恢复率系数
gamma = 0.1
# Te为疾病潜伏期
Te = 14
# I_0为感染者的初始人数
I_0 = 1
# E_0为潜伏者的初始人数
E_0 = 0
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - E_0 - R_0
# T为传播时间
T = 150# INI为初始状态下的数组
INI = (S_0,E_0,I_0,R_0)def funcSEIR(inivalue,_):Y = np.zeros(4)X = inivalue# 易感个体变化Y[0] = - (beta * X[0] * X[2]) / N# 潜伏个体变化Y[1] = (beta * X[0] * X[2]) / N - X[1] / Te# 感染个体变化Y[2] = X[1] / Te - gamma * X[2]# 治愈个体变化Y[3] = gamma * X[2]return YT_range = np.arange(0,T + 1)RES = spi.odeint(funcSEIR,INI,T_range)fig.add_trace(go.Scatter(y = RES[:,0],mode = 'lines', # 线性图name = '易感者'
))fig.add_trace(go.Scatter(y = RES[:,1],mode = 'lines', # 线性图name = '潜伏者',line=dict(color="yellow")
))
fig.add_trace(go.Scatter(y = RES[:,2],mode = 'lines', # 线性图name = '感染者',line=dict(color="red")
))
fig.add_trace(go.Scatter(y = RES[:,3],mode = 'lines', # 线性图name = '治愈者',line=dict(color="green")
))fig.update_layout(yaxis={'title':'人数'},xaxis={'title':'天数'},title={'text':'SERI-Model','xref':'paper','x':0.5,},hovermode="x",#height=600,template="plotly_white",
)fig.show()

13c682dbb26277249d1b689a69658ebb.png
SERI-Model

SEIRS模型

SEIRS模型即对SEIR模型 添加抗体存在时长

SEIRS-Model

#SEIRS-Model
import scipy.integrate as spi
import numpy as np
import plotly.graph_objects as go
pyplt = py.offline.plot
fig = go.Figure()# N为人群总数
N = 10000
# β为传染率系数
beta = 0.5
# gamma为恢复率系数
gamma = 0.1
# Ts为抗体持续时间
Ts = 15
# Te为疾病潜伏期
Te = 14
# I_0为感染者的初始人数
I_0 = 1
# E_0为潜伏者的初始人数
E_0 = 0
# R_0为治愈者的初始人数
R_0 = 0
# S_0为易感者的初始人数
S_0 = N - I_0 - E_0 - R_0
# T为传播时间
T = 150# INI为初始状态下的数组
INI = (S_0,E_0,I_0,R_0)def funcSEIRS(inivalue,_):Y = np.zeros(4)X = inivalue# 易感个体变化Y[0] = - (beta * X[0] * X[2]) / N + X[3] / Ts# 潜伏个体变化Y[1] = (beta * X[0] * X[2]) / N - X[1] / Te# 感染个体变化Y[2] = X[1] / Te - gamma * X[2]# 治愈个体变化Y[3] = gamma * X[2] - X[3] / Tsreturn YT_range = np.arange(0,T + 1)RES = spi.odeint(funcSEIRS,INI,T_range)fig.add_trace(go.Scatter(y = RES[:,0],mode = 'lines', # 线性图name = '易感者'
))fig.add_trace(go.Scatter(y = RES[:,1],mode = 'lines', # 线性图name = '潜伏者',line=dict(color="orange")
))
fig.add_trace(go.Scatter(y = RES[:,2],mode = 'lines', # 线性图name = '感染者',line=dict(color="red")
))
fig.add_trace(go.Scatter(y = RES[:,3],mode = 'lines', # 线性图name = '治愈者',line=dict(color="green")
))fig.update_layout(yaxis={'title':'人数'},xaxis={'title':'天数'},title={'text':'SERIS-Model','xref':'paper','x':0.5,},hovermode="x",#height=600,template="plotly_white",
)fig.show()

143fb5dffcd3748974dc1a58b99bfa8b.png
SERIS-Model
病毒其实不可怕,你宅我宅它就挂
病毒其实不可怕,戴好口罩它也挂

参考:

关于传染病的数学模型有哪些?​www.zhihu.com
363fc313654168a2e1d3d5eef1b461d1.png
关于传染病的数学模型有哪些?​www.zhihu.com
fd1db1c8609d9317a05c6b69d5d04c2a.png
https://www.bilibili.com/video/av85508117​www.bilibili.com

这篇关于sirs模型_基于plotly的数据可视化——经典传染病模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_39769703/article/details/111011183
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/397449

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名