Модель 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$ сохраняется — это удобная проверка корректности.
- Главное упрощение — однородное перемешивание: все контактируют со всеми с равной вероятностью.