基于小世界网络模型的SEIR的实现python,并用二维折线图表示SEIR的人数
时间: 2023-06-13 17:02:25 浏览: 314
SEIR模型是一种常用的传染病传播模型,它将人群分为四类:易感者(Susceptible)、潜伏者(Exposed)、感染者(Infectious)和康复者(Recovered)。基于小世界网络模型的SEIR模型可以更好地模拟现实中的人际关系和社交网络,因此更加准确地预测疫情传播趋势。
下面是用Python实现基于小世界网络模型的SEIR模型,并用二维折线图表示SEIR的人数的代码:
```python
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
def seir_model(N, beta, gamma, sigma, p, T):
"""
:param N: 人口总数
:param beta: 感染率
:param gamma: 恢复率
:param sigma: 潜伏期转化为感染期的概率
:param p: 重连概率
:param T: 模拟时间
"""
G = nx.watts_strogatz_graph(N, 10, p) # 生成小世界网络模型
S = [N-1] # 初始易感者人数
E = [0] # 初始潜伏者人数
I = [1] # 初始感染者人数
R = [0] # 初始康复者人数
for t in range(T):
S_t = S[-1]
E_t = E[-1]
I_t = I[-1]
R_t = R[-1]
# 计算每个人的状态转移概率
p1 = beta * I_t / N
p2 = sigma
p3 = gamma
# 随机选择一个人进行状态转移
n = np.random.randint(N)
if n in G.neighbors(n):
k = np.random.choice(list(G.neighbors(n)))
else:
k = n
if n not in I and n not in E: # 易感者状态转移
if np.random.random() < p1:
S_t -= 1
E_t += 1
elif n in E: # 潜伏者状态转移
if np.random.random() < p2:
E_t -= 1
I_t += 1
elif n in I: # 感染者状态转移
if np.random.random() < p3:
I_t -= 1
R_t += 1
# 小世界网络模型重连
if np.random.random() < p:
edges = list(G.edges(n))
if len(edges) > 0:
new_k = np.random.choice(list(G.neighbors(n)))
G.remove_edge(n, k)
G.add_edge(n, new_k)
# 更新人数
S.append(S_t)
E.append(E_t)
I.append(I_t)
R.append(R_t)
# 画图表示SEIR的人数
plt.plot(range(T+1), S, label='Susceptible')
plt.plot(range(T+1), E, label='Exposed')
plt.plot(range(T+1), I, label='Infectious')
plt.plot(range(T+1), R, label='Recovered')
plt.legend()
plt.title('SEIR Model')
plt.xlabel('Time')
plt.ylabel('Number of People')
plt.show()
# 设置参数
N = 1000 # 人口总数
beta = 0.3 # 感染率
gamma = 0.1 # 恢复率
sigma = 0.2 # 潜伏期转化为感染期的概率
p = 0.3 # 重连概率
T = 100 # 模拟时间
seir_model(N, beta, gamma, sigma, p, T)
```
运行上述代码,即可查看基于小世界网络模型的SEIR模型的人数变化情况。
阅读全文