请给出一个SIR的动力学模型的代码实现
时间: 2023-09-14 20:05:21 浏览: 97
### 回答1:
下面是一个典型的SIR动力学模型的代码实现: # 引入必要的库
import numpy as np
import matplotlib.pyplot as plt # 建立SIR动力学模型
def SIR(S, I, R, beta, gamma):
dS = -beta * S * I
dI = beta * S * I - gamma * I
dR = gamma * I
return (dS, dI, dR)# 初始化参数
S0 = 950
I0 = 50
R0 = 0
beta = 0.2
gamma = 0.1# 计算结果
t = np.arange(0, 100, 0.1)
S = np.zeros(len(t))
I = np.zeros(len(t))
R = np.zeros(len(t))
S[0] = S0
I[0] = I0
R[0] = R0
for i in range(1, len(t)):
dS, dI, dR = SIR(S[i-1], I[i-1], R[i-1], beta, gamma)
S[i] = S[i-1] + dS
I[i] = I[i-1] + dI
R[i] = R[i-1] + dR# 画出结果
plt.plot(t, S, label='Susceptible')
plt.plot(t, I, label='Infected')
plt.plot(t, R, label='Recovered')
plt.xlabel('Time (days)')
plt.ylabel('Number')
plt.title('SIR dynamics')
plt.legend()
plt.show()
### 回答2:
以下是一个基本的SIR模型的Python代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义模型参数
beta = 0.2 # 控制传染率
gamma = 0.1 # 控制康复率
N = 1000 # 总人数
I0 = 1 # 初始感染人数
R0 = 0 # 初始康复人数
S0 = N - I0 - R0 # 初始易感人数
# 定义时间相关参数
T = 100 # 模拟时间步长
dt = 0.1 # 时间步长大小
t = np.linspace(0, T, int(T / dt) + 1)
# 初始化数组
S = np.zeros(len(t))
I = np.zeros(len(t))
R = np.zeros(len(t))
# 设置初始条件
S[0] = S0
I[0] = I0
R[0] = R0
# 模拟模型的动态演化
for i in range(1, len(t)):
dSdt = -beta * S[i-1] * I[i-1] / N
dIdt = beta * S[i-1] * I[i-1] / N - gamma * I[i-1]
dRdt = gamma * I[i-1]
S[i] = S[i-1] + dt * dSdt
I[i] = I[i-1] + dt * dIdt
R[i] = R[i-1] + dt * dRdt
# 绘制模型演化图
plt.plot(t, S, label='Susceptible')
plt.plot(t, I, label='Infected')
plt.plot(t, R, label='Recovered')
plt.xlabel('Time')
plt.ylabel('Population')
plt.legend()
plt.title('SIR Model')
plt.show()
```
这段代码实现了一个基本的SIR模型,通过定义模型参数、时间相关参数和初始条件,再通过迭代计算模拟模型的动态演化,并绘制出三个人群(易感人群、感染人群和康复人群)随时间变化的曲线。