基于小世界网络模型的SEIR的实现python
时间: 2023-06-13 11:02:45 浏览: 189
SEIR模型是一种常见的流行病学模型,SEIR模型是基于SIR模型的改进版,它不仅考虑了易感人群、感染人群和恢复人群,还考虑了潜伏期人群。基于小世界网络模型的SEIR模型是一种常见的扩展模型,可以考虑网络拓扑结构对疾病传播的影响。下面是基于Python实现的基于小世界网络模型的SEIR模型:
```python
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
# 定义SEIR模型的参数
beta = 0.3 # 感染率
gamma = 0.05 # 恢复率
sigma = 0.05 # 潜伏期转化为感染期的概率
N = 1000 # 总人口数
I0 = 10 # 初始感染人数
E0 = 0 # 初始潜伏期人数
R0 = 0 # 初始恢复人数
S0 = N - I0 - E0 - R0 # 初始易感人数
# 定义小世界网络模型的参数
k = 10 # 每个节点的相邻节点数
p = 0.1 # 重连边的概率
# 构建小世界网络
G = nx.watts_strogatz_graph(N, k, p)
# 确定初始状态
status = np.zeros(N)
status[0:I0] = 1 # 感染者
status[I0:I0 + E0] = 2 # 潜伏期
status[I0 + E0:N] = 0 # 易感者
# 迭代SEIR模型
for t in range(30):
# 计算每个节点的状态
for i in range(N):
if status[i] == 0: # 易感者
# 统计周围感染者的数量
infected_neighbors = 0
for j in G.neighbors(i):
if status[j] == 1 or status[j] == 2:
infected_neighbors += 1
# 计算被感染的概率
p_infection = 1 - (1 - beta) ** infected_neighbors
# 更新状态
if np.random.random() < p_infection:
status[i] = 2 # 变为潜伏期
elif status[i] == 2: # 潜伏期
if np.random.random() < sigma:
status[i] = 1 # 转为感染期
elif status[i] == 1: # 感染者
if np.random.random() < gamma:
status[i] = 3 # 变为恢复期
else: # 恢复者
pass
# 统计每种状态的人数
S = np.sum(status == 0)
E = np.sum(status == 2)
I = np.sum(status == 1)
R = np.sum(status == 3)
# 输出当前状态
print("t={}: S={}, E={}, I={}, R={}".format(t, S, E, I, R))
# 可视化当前状态
plt.clf()
nx.draw(G, pos=nx.spring_layout(G), node_color=status, cmap=plt.cm.Reds, node_size=30)
plt.show()
```
运行以上代码,可以看到SEIR模型在小世界网络模型上的扩展效果。可以通过调整参数来模拟不同的疫情传播情况,例如改变感染率、恢复率、潜伏期转化为感染期的概率等。
阅读全文