数学建模SIR传染病模型代码及注释
时间: 2023-09-16 15:12:43 浏览: 80
以下是一个简单的SIR传染病模型的Python代码及注释:
```python
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
# 定义SIR模型的微分方程
def sir_model(y, t, beta, gamma):
S, I, R = y
dSdt = -beta * S * I
dIdt = beta * S * I - gamma * I
dRdt = gamma * I
return [dSdt, dIdt, dRdt]
# 定义初始状态和参数
S0 = 0.99 # 初始易感人群比例
I0 = 0.01 # 初始感染人群比例
R0 = 0 # 初始恢复人群比例
beta = 0.2 # 接触率,表示一个人每天接触到的人数
gamma = 0.1 # 恢复率,表示一个人每天从感染状态转变为恢复状态的概率
t = np.linspace(0, 100, 1000) # 时间范围和间隔
# 解微分方程
solution = odeint(sir_model, [S0, I0, R0], t, args=(beta, gamma))
S, I, R = solution.T
# 绘制结果
fig = plt.figure(figsize=(10,6))
plt.plot(t, S, label='Susceptible')
plt.plot(t, I, label='Infected')
plt.plot(t, R, label='Recovered')
plt.xlabel('Time (days)')
plt.ylabel('Proportion of population')
plt.title('SIR Model')
plt.legend()
plt.show()
```
注释:
- `import numpy as np` 和 `from scipy.integrate import odeint` 导入Numpy和Scipy库中的 `odeint` 函数,用于解微分方程。
- `def sir_model(y, t, beta, gamma)` 定义一个函数,它接受当前状态 `y`、时间 `t`、接触率 `beta` 和恢复率 `gamma` 作为参数,并返回下一个状态的导数。
- `S0 = 0.99`, `I0 = 0.01`, `R0 = 0`, `beta = 0.2`, `gamma = 0.1` 和 `t = np.linspace(0, 100, 1000)` 定义初始状态和模型参数。在本例中,我们假设有一个人口总数为1的社区,其中99%的人是易感人群,1%的人是感染人群,没有恢复人群。我们还假设每个感染人群每天会接触到2个人,每天有10%的感染人群会恢复。我们将模型运行100天,每天计算一次。
- `solution = odeint(sir_model, [S0, I0, R0], t, args=(beta, gamma))` 调用 `odeint` 函数解微分方程。它接受初始状态 `[S0, I0, R0]`、时间范围 `t`、微分方程函数 `sir_model` 和其他参数 `args=(beta, gamma)` 作为输入,然后返回解的数组 `solution`。
- `S, I, R = solution.T` 将解数组 `solution` 转置,然后将每个状态的数组分配给 `S`、`I` 和 `R` 变量。
- `fig = plt.figure(figsize=(10,6))`, `plt.plot(t, S, label='Susceptible')`, `plt.plot(t, I, label='Infected')`, `plt.plot(t, R, label='Recovered')`, `plt.xlabel('Time (days)')`, `plt.ylabel('Proportion of population')`, `plt.title('SIR Model')`, `plt.legend()`, `plt.show()` 绘制结果。我们创建一个10x6英寸的图形窗口,然后使用 `plt.plot` 函数绘制每个状态的曲线。我们还添加了一些标签和标题,最后使用 `plt.show` 函数显示图形。
阅读全文