【复杂网络】使用SIR模型模拟疾病传播

使用SIR模型模拟疾病传播

使用SIR模型模拟疾病传播

一、原理介绍

1.1 SIR模型概述

SIR模型是流行病学中用于描述传染病传播的一种经典模型。它将人群分为三类:

  • 易感者(S):未感染但易受感染的人群。
  • 感染者(I):当前感染并能够传播疾病的人群。
  • 治愈者(R):已经感染并痊愈或死亡的人群。

1.2 模型方程

SIR模型通过以下方程描述不同状态人群的变化:

  • ( S(t+1) = S(t) - \alpha S(t) ) (易感者减少)
  • ( I(t+1) = I(t) - \beta I(t) ) (感染者减少)
  • ( R(t+1) = R(t) + \beta I(t) ) (治愈者增加)

这里,( \alpha ) 是传染率,表示易感者被感染的概率;( \beta ) 是治愈率,表示感染者康复的概率。

举例说明

假设一个社区中有1000人,其中950人是易感者,30人是感染者,20人是治愈者。如果传染率(( \alpha ))为0.3,治愈率(( \beta ))为0.1,那么在每个时间步,易感者和感染者的人数将根据上述方程进行更新。这种动态变化帮助我们了解疾病的传播速度和影响范围。

二、实证研究

2.1 参数设置

在进行仿真之前,我们需要设置模型的参数,包括传染率和治愈率。以下是代码示例:

alpha = 0.25  # 传染概率
beta = 0.65   # 治愈概率

2.2 仿真

接下来,我们将使用Python代码实现SIR模型的仿真。我们首先获取数据集,然后初始化节点状态并选择感染源。以下是核心代码:

import io
import random
import urllib.request as urllib
import zipfile
import matplotlib.pyplot as plt
import networkx as nx

# 下载和解析数据集
url = "http://www-personal.umich.edu/~mejn/netdata/football.zip"
sock = urllib.urlopen(url)
s = io.BytesIO(sock.read())
sock.close()
zf = zipfile.ZipFile(s)
gml = zf.read("football.gml").decode().split("\n")[1:]
G = nx.parse_gml(gml)

# 初始化节点状态
for node in G:
    G.nodes[node]['state'] = 0  # 用state标识状态

# 选择感染源
seed = 'Arkansas'  # 选定感染源
G.nodes[seed]['state'] = 1  # 表示Arkansas是感染的

# 模拟传播过程
max_iter_num = 200
all_infect_nodes = [seed]
all_remove_nodes = []
infect = []
recover = []

for i in range(max_iter_num):
    new_infect = []
    new_remove = []

    infect.append(len(all_infect_nodes))
    recover.append(len(all_remove_nodes))

    for v in all_infect_nodes:
        for nbr in G.neighbors(v):
            if G.nodes[nbr]['state'] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驭风少年君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值