Модель SIR

Чтобы понять, как болезнь проходит через население, не нужно следить за каждым человеком — достаточно разбить людей на несколько групп и описать, как они перетекают друг в друга.

Модель SIR — простейшая компартментная модель эпидемии, которая делит население на три группы: восприимчивые ($S$), заражённые ($I$) и выздоровевшие с иммунитетом ($R$), и описывает переходы $S \to I \to R$.

Название SIR — это первые буквы английских слов Susceptible, Infected, Recovered. Каждый человек в любой момент находится ровно в одной из трёх групп, а сумма $S + I + R$ остаётся равной общей численности населения $N$. Зачем нам такая модель? Она позволяет, зная всего два числа — заразность болезни и скорость выздоровления, — предсказать форму волны: когда будет пик, сколько людей переболеет и как быстро всё закончится. Это основа, на которой строятся более сложные модели и расчёты для систем здравоохранения.

Три группы и потоки между ними

Представим население как три сообщающихся резервуара. Люди не появляются и не исчезают — они только перетекают слева направо:

  заражение           выздоровление
S ----------> I ----------> R
(могут          (болеют,        (переболели,
 заболеть)       заражают)       не заражаются)

Группа S (Susceptible, восприимчивые) — те, кто ещё не болел и может заразиться. Группа I (Infected, заражённые) — те, кто болеет прямо сейчас и способен передать болезнь другим. Группа R (Recovered, выздоровевшие) — те, кто переболел и получил иммунитет, поэтому повторно не заражается и сам никого не заражает. Поток всегда направлен в одну сторону: из S в I и из I в R.

Два коэффициента: $\beta$ и $\gamma$

Скорость переходов задают два числа. $\beta$ — коэффициент заразности: насколько активно болезнь передаётся при контактах. $\gamma$ — скорость выздоровления: какая доля больных выздоравливает за один шаг времени. Если $\gamma = 0.1$, то в среднем человек болеет $1/\gamma = 10$ дней.

Систему переходов можно записать так:

$$\begin{cases} \frac{dS}{dt} = -\beta S I / N \\ \frac{dI}{dt} = \beta S I / N - \gamma I \\ \frac{dR}{dt} = \gamma I \end{cases}$$

За один день из группы $S$ в группу $I$ перетекает $\beta S I / N$ человек. Разберём этот член по частям. Доля восприимчивых среди всех — это $S/N$. Каждый из $I$ заражённых контактирует с людьми, и часть этих контактов приходится на восприимчивых. Произведение $S \cdot I$ отражает число возможных встреч «восприимчивый — заражённый»: чем больше и тех, и других, тем больше столкновений. Коэффициент $\beta$ превращает это в число новых заражений. Член $\gamma I$ — это выздоровления: фиксированная доля больных переходит в $R$.

Считаем эпидемию по шагам

Запишем модель как цикл по дням. На каждом шаге мы вычисляем новые заражения и выздоровления, а затем обновляем три группы.

def sir(S, I, R, beta, gamma, days):
    N = S + I + R
    out = []
    for d in range(days):
        new_inf = beta * S * I / N
        new_rec = gamma * I
        S -= new_inf
        I += new_inf - new_rec
        R += new_rec
        out.append((d, S, I, R))
    return out

res = sir(990, 10, 0, 0.3, 0.1, 60)
print(f"{'день':>4} {'S':>7} {'I':>7} {'R':>7}")
for d, S, I, R in res[::10]:
    print(f"{d:>4} {S:>7.1f} {I:>7.1f} {R:>7.1f}")
peak = max(res, key=lambda t: t[2])
print(f"Пик заражённых: день {peak[0]}, I={peak[2]:.1f}")

Вывод:

день       S       I       R
   0   987.0    12.0     1.0
  10   902.2    67.0    30.8
  20   594.4   239.0   166.6
  30   237.2   303.7   459.1
  40   108.1   181.0   710.9
  50    71.9    84.4   843.7
Пик заражённых: день 27, I=315.9

Мы начали с 990 восприимчивых и 10 заражённых. Сначала больных мало, и эпидемия разгоняется медленно. Затем число заражённых стремительно растёт, достигает пика около 316 человек на 27-й день, после чего идёт на спад: восприимчивых почти не осталось, заражать стало некого. К концу периода почти все оказались в группе R.

Как работает под капотом

Каждый день программа делает три действия. Сначала считает потоки new_inf и new_rec по текущим значениям $S$ и $I$ — важно, что оба потока вычисляются до обновления групп, иначе один поток исказил бы другой. Затем уменьшает $S$ на число заболевших. Затем меняет $I$: прибавляет новых заражённых и вычитает выздоровевших — отсюда характерный «горб», ведь пока приток больше оттока, $I$ растёт, а когда восприимчивых становится мало, приток падает и $I$ начинает убывать. Наконец, $R$ растёт на число выздоровевших.

Обратите внимание: сумма $S + I + R$ сохраняется на каждом шаге. Сколько вычли из одной группы, столько прибавили к соседней. Это свойство — хороший способ проверить, что в модели нет ошибки: если общее число людей «уплывает», значит, где-то перепутаны знаки.

В основе всего лежит ключевое упрощение — однородное перемешивание: мы считаем, что любой человек одинаково вероятно встречается с любым другим, как молекулы в хорошо размешанном растворе. Поэтому достаточно знать только количество людей в каждой группе, а не кто с кем конкретно контактирует. Реальность сложнее: люди живут в семьях, городах, ездят по разным маршрутам. Но даже это грубое приближение хорошо ловит общую форму волны.

Частые ошибки

  • Обновлять $S$, $I$, $R$ по очереди и использовать уже изменённое значение в следующем потоке. Все потоки за шаг нужно считать по «старым» значениям, а применять — потом.
  • Забыть разделить на $N$ в члене заражения. Без деления масштаб новых заражений зависит от размера популяции, и модель ломается.
  • Путать $\beta$ и $\gamma$. $\beta$ отвечает за рост числа больных, $\gamma$ — за их выздоровление; перестановка переворачивает динамику.
  • Ожидать, что переболеют ровно все. Эпидемия затухает раньше, потому что под конец заражённым уже почти некого встретить среди восприимчивых.
  • Считать дробных людей проблемой. В непрерывной модели $S$, $I$, $R$ — это вещественные числа (доли населения), и дробные значения — норма.

Итоги

  • Модель SIR делит население на три группы — $S$ (восприимчивые), $I$ (заражённые), $R$ (выздоровевшие) — и описывает поток $S \to I \to R$.
  • Член $\beta S I / N$ задаёт новые заражения через встречи восприимчивых и заражённых, член $\gamma I$ — выздоровления.
  • $\beta$ управляет заразностью, $\gamma$ — скоростью выздоровления; среднее время болезни равно $1/\gamma$.
  • Сумма $S + I + R$ сохраняется — это удобная проверка корректности.
  • Главное упрощение — однородное перемешивание: все контактируют со всеми с равной вероятностью.
Проверьте себя
1. Что описывает член beta * S * I / N в модели SIR?
AЧисло выздоровевших за день
BЧисло новых заражений за день через встречи восприимчивых и заражённых
CОбщую численность населения
DСкорость потери иммунитета
2. Что означает группа R в модели SIR?
AТех, кто рискует заболеть
BЗаражённых, способных передавать болезнь
CВыздоровевших с иммунитетом, которые не заражаются
DЛюдей в инкубационном периоде
3. Если gamma = 0.1, сколько в среднем длится болезнь?
A1 день
B10 дней
C100 дней
D0.1 дня
4. Какое упрощение лежит в основе базовой модели SIR?
AИммунитет быстро теряется
BНаселение однородно перемешано — все контактируют со всеми с равной вероятностью
CБолезнь не передаётся между людьми
DЧисленность населения постоянно растёт
py
Курс по теме
Пройдите курс «Python с нуля» — по шагам, с проверкой
8 уроков · ~14 ч · теория, упражнения и экзамен с бейджем
Открыть курс →