Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .translate/state/sir_model.md.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
source-sha: a1cd90c5ef6d6f05277318f47fe21eda60fa5e6b
synced-at: "2026-07-18"
model: claude-sonnet-5
mode: RESYNC
section-count: 5
tool-version: 0.17.0
77 changes: 46 additions & 31 deletions lectures/sir_model.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,20 @@ kernelspec:
display_name: Python 3
language: python
name: python3
translation:
title: 新冠病毒建模
headings:
Overview: 概述
The SIR Model: SIR模型
The SIR Model::Time Path: 时间路径
The SIR Model::Parameters: 参数
Implementation: 实现
Experiments: 实验
'Experiments::Experiment 1: Constant R0 Case': 实验1:固定R0的情况
'Experiments::Experiment 2: Changing Mitigation': 实验2:改变缓解措施
Ending Lockdown: 解除封锁
---

```{raw}
<div id="qe-notebook-header" align="right" style="text-align:right;">
<a href="https://quantecon.org/" title="quantecon.org">
Expand All @@ -16,9 +29,9 @@ kernelspec:
</div>
```

# 新冠病毒建模
# {index}`新冠病毒建模 <single: Modeling COVID 19>`

```{contents}
```{contents} Contents
:depth: 2
```

Expand Down Expand Up @@ -55,7 +68,7 @@ import numpy as np
from numpy import exp
```

最后,我们使用SciPy的数值例程odeint来求解微分方程
我们还将使用SciPy的数值例程odeint来求解微分方程

```{code-cell} ipython3
from scipy.integrate import odeint
Expand All @@ -65,17 +78,17 @@ from scipy.integrate import odeint

## SIR模型

我们要分析的是一个包含四个状态的SIR模型。在这个模型中,每个人都必须处于以下四种状态之一:
我们要分析的这个版本的SIR模型包含四个状态。

假设人口中的每个人都必须处于这四种状态之一。

这些状态是:易感者(S)、暴露者(E)、感染者(I)和移出者(R)。

- 易感者(S):尚未感染,可能被感染的人群
- 潜伏者(E):已感染但尚未具有传染性的人群
- 感染者(I):已感染且具有传染性的人群
- 移出者($R$):已经康复或死亡的人群
说明:

需要注意的是:
- 一旦康复,就会获得免疫力,不会再次感染
- 处于移出状态($R$)的人包括康复者和死亡者
- 潜伏期的人虽然已感染,但还不能传染给他人
* 处于R状态的人已经被感染,并且已经康复或死亡。
* 假设康复者已获得免疫力。
* 暴露组中的人尚不具有传染性。

### 时间路径

Expand All @@ -96,47 +109,49 @@ from scipy.integrate import odeint
\begin{aligned}
\dot s(t) & = - \beta(t) \, s(t) \, i(t)
\\
\dot e(t) & = \beta(t) \, s(t) \, i(t) - \sigma e(t)
\dot e(t) & = \beta(t) \, s(t) \, i(t) - σ e(t)
\\
\dot i(t) & = \sigma e(t) - \gamma i(t)
\dot i(t) & = σ e(t) - γ i(t)
Comment on lines 111 to +114
\end{aligned}
```

在这些方程中,

* $\beta(t)$ 被称为*传播率*(个体与他人接触并使其暴露于病毒的速率)。
* $\sigma$ 被称为*感染率*(暴露者转变为感染者的速率)
* $\gamma$ 被称为*恢复率*(感染者康复或死亡的速率)。
* $\beta(t)$ 被称为**传播率**(个体与他人接触并使其暴露于病毒的速率)。
* $\sigma$ 被称为**感染率**(暴露者转变为感染者的速率)
* $\gamma$ 被称为**恢复率**(感染者康复或死亡的速率)。
* 点符号 $\dot y$ 表示时间导数 $dy/dt$。

我们不需要单独建模处于 $R$ 状态的人口比例 $r$,因为这些状态构成一个分区。

具体来说,"已移除"的人口比例为 $r = 1 - s - e - i$。

我们还将追踪累计病例数 $c = i + r$
我们还将追踪 $c = i + r$,即累计病例数

(即所有已感染或曾经感染的人)。

对于适当定义的$F$(见下面的代码), 系统{eq}`sir_system`可以用向量形式表示为
系统{eq}`sir_system`可以用向量形式表示为

```{math}
:label: dfcv

\dot x = F(x, t), \qquad x := (s, e, i)
```

其中$F$的具体定义参见下面的代码。

### 参数

参数$\sigma$和$\gamma$由病毒的生物学特性决定,因此被视为固定值。

根据Atkeson的笔记,我们采用以下参数值:

* $\sigma = 1/5.2$ - 这意味着平均潜伏期为5.2天
* $\gamma = 1/18$ - 这表示患者平均需要18天才能康复或死亡
* $\sigma = 1/5.2$ - 这意味着平均潜伏期为5.2天
* $\gamma = 1/18$ - 这表示患者平均需要18天才能康复或死亡

传播率被构造为

* $\beta(t) := R(t) \gamma$,其中$R(t)$是时间$t$时的*有效再生数*。
* $\beta(t) := R(t) \gamma$,其中$R(t)$是时间$t$时的**有效再生数**。

(这个符号表示有点令人困惑,因为$R(t)$与表示已移除状态的符号$R$不同。)

Expand Down Expand Up @@ -203,7 +218,8 @@ x_0 = s_0, e_0, i_0
```{code-cell} ipython3
def solve_path(R0, t_vec, x_init=x_0):
"""
给定R0的时间路径,计算感染人数i(t)和累计病例c(t)的演变轨迹。
给定R0的时间路径,通过数值积分求解i(t)和c(t)。

"""
G = lambda x, t: F(x, t, R0)
s_path, e_path, i_path = odeint(G, x_init, t_vec).transpose()
Expand Down Expand Up @@ -333,18 +349,17 @@ plot_paths(i_paths, labels)
plot_paths(c_paths, labels)
```

## 解除封锁措施的影响分析
## 解除封锁

接下来我们将基于Andrew Atkeson的[研究](https://drive.google.com/file/d/1uS7n-7zq5gfSgrL3S0HByExmpq4Bn3oh/view),探讨不同时机解除封锁措施对疫情发展的影响
以下内容复现了Andrew Atkeson关于解除封锁时机的[附加研究结果](https://drive.google.com/file/d/1uS7n-7zq5gfSgrL3S0HByExmpq4Bn3oh/view)。

我们对比两种解封方案:

1. 短期封锁方案:实施30天严格封锁($R_t = 0.5$),之后17个月放开管控($R_t = 2$)
2. 长期封锁方案:实施120天严格封锁($R_t = 0.5$),之后14个月放开管控($R_t = 2$)
1. $R_t = 0.5$持续30天,之后17个月$R_t = 2$。这相当于30天后解除封锁。
2. $R_t = 0.5$持续120天,之后14个月$R_t = 2$。这相当于4个月后解除封锁。

模型的初始条件设定为:
- 25,000名活跃感染者
- 75,000名处于潜伏期的感染者(已感染但尚未具有传染性)
这里所考虑的参数设定模型初始时有25,000名活跃感染者,
以及75,000名已经暴露于病毒、即将具有传染性的人群。

```{code-cell} ipython3
# 初始条件
Expand Down Expand Up @@ -398,4 +413,4 @@ paths = [path * ν * γ * pop_size for path in i_paths]
plot_paths(paths, labels)
```

如果我们能够将感染高峰推迟到疫苗研发出来之前,就有可能大幅降低最终的死亡人数
如果我们能够将感染高峰推迟到疫苗研发出来之前,就有可能降低累计死亡人数
Loading