Модель SIR
Чтобы понять, как болезнь проходит через население, не нужно следить за каждым человеком — достаточно разбить людей на несколько групп и описать, как они перетекают друг в друга.
Модель SIR — простейшая компартментная модель эпидемии, которая делит население на три группы: восприимчивые (S), заражённые (I) и выздоровевшие с иммунитетом (R), и описывает переходы S → I → 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 дней.
За один день из группы S в группу I перетекает beta * S * I / N человек. Разберём этот член по частям. Доля восприимчивых среди всех — это S / N. Каждый из I заражённых контактирует с людьми, и часть этих контактов приходится на восприимчивых. Произведение S * 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 → I → R.
- Член
beta * S * I / Nзадаёт новые заражения через встречи восприимчивых и заражённых, членgamma * I— выздоровления. - beta управляет заразностью, gamma — скоростью выздоровления; среднее время болезни равно 1/gamma.
- Сумма S + I + R сохраняется — это удобная проверка корректности.
- Главное упрощение — однородное перемешивание: все контактируют со всеми с равной вероятностью.