Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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