生成一段Python代码,模拟无标度网络中的SIS病毒传播模型。其中,节点有三类,对应的传染率分为0.1,0.2,0.3三个等级,对应的节点的恢复率分为0.1,0.2,0.3三个等级。画出感染人数和恢复人数随时间变化的图像。
时间: 2024-06-10 13:06:29 浏览: 217
好的,根据您的要求,我会帮您生成一段Python代码,来模拟无标度网络中的SIS病毒传播模型。以下是代码:
```
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
# 定义节点的传染率和恢复率等级
beta = [0.1, 0.2, 0.3]
gamma = [0.1, 0.2, 0.3]
# 定义SIS传播模型
def SIS_model(G, beta, gamma, T):
n = len(G)
S = np.zeros((n, T+1))
I = np.zeros((n, T+1))
# 随机选择一个感染节点开始传播病毒
start_node = np.random.choice(n)
I[start_node][0] = 1
S[start_node][0] = 0
# 开始模拟传播过程
for t in range(T):
for i in range(n):
# 如果节点i已经感染,则计算其恢复概率
if I[i][t] == 1:
r = np.random.uniform(0, 1)
if r < gamma[G.nodes[i]['gamma']]:
I[i][t+1] = 0
S[i][t+1] = 1
else:
I[i][t+1] = 1
S[i][t+1] = 0
# 如果节点i未感染,则计算其被感染概率
else:
neighbors = list(G.neighbors(i))
for j in neighbors:
if I[j][t] == 1 and S[i][t+1] == 0:
r = np.random.uniform(0, 1)
if r < beta[G.nodes[j]['beta']]:
I[i][t+1] = 1
S[i][t+1] = 0
break
else:
S[i][t+1] = 1
return S, I
# 生成无标度网络
G = nx.extended_barabasi_albert_graph(500, 1, 0.01)
# 为节点随机分配传染率和恢复率等级
for i in range(len(G)):
G.nodes[i]['beta'] = np.random.choice([0,1,2])
G.nodes[i]['gamma'] = np.random.choice([0,1,2])
# 运行SIS传播模型
S, I = SIS_model(G, beta, gamma, 200)
# 绘制感染人数和恢复人数随时间变化的图像
x = range(201)
y1 = np.sum(I, axis=0)
y2 = np.sum(S, axis=0)
plt.plot(x, y1, label='Infected')
plt.plot(x, y2, label='Susceptible')
plt.xlabel('Time')
plt.ylabel('Number of People')
plt.legend()
plt.show()
```
运行以上代码,您将会得到一张感染人数和恢复人数随时间变化的图像。请注意,这只是一个简单的模拟示例,并不代表真实情况。同时,如果您需要更多的节点,可以根据需要修改代码中的节点数量以及参数值。
阅读全文