О вечности, пандемии и немного о музыке

Эпиграф: Эта музыка будет вечной, если я заменю батарейки (Илья Кормильцев)

Если вы любите математику, возможно, вам будет интересно это небольшое математическое исследование. Эта задача пришла ко мне как предположение, и мне захотелось обосновать его математически, но выводы, которые я получил, оказались несколько неожиданными.

Т.к. сама математика и рассуждения элементарны, мы не будем ссылаться ни на какие источники и просто решим задачу с нуля.

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

»Как лучше пережить пандемию коронавируса: вводя ограничения, вакцинацию и весь спектр борьбы с распространением инфекции или позволить ситуации развиваться естественным путем

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

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

И вот об этой неоднозначности, или точнее об одном аспекте этой неоднозначности, я и хотел бы поговорить на языке математики.

Попробуем понять, как меры борьбы с пандемией влияют на ее длительность.

Это не так очевидно, как может показаться на первый взгляд. Давайте сначала рассмотрим вопрос на качественном уровне.

Качественный уровень

Что для нас важно, это то, что все меры прежде всего нацелены на понижение индекса (коэффициента) репродукции вируса R. Этот коэффициент — усредненное количество людей, которых заражает один заболевший.

Давайте предположим, что изначально коэффициент был довольно высоким, и количество заразившихся в разных странах быстро дошло до 10000. После этого была объявлена пандемия, были приняты меры, и коэффициент снизился. Если удалось сбить коэффициент до значений меньше 1, то эпидемия побеждена, но, если нет? Эффективные, согласованные действия требуют немалых организационных усилий, вложений и просто доброй воли, и с этим (как мы все видим) в современном мире не так все хорошо, как хотелось бы. Итак, что будет, если не удается сбить коэффициент до значения меньше 1?

Если коэффициент Rнизкий, но все же больше или равен единице, то это значит, что эпидемия вяло развивается или держится на том же уровне. Переболевшие и вакцинированные люди получают иммунитет, но он не вечен, а это значит, что если эпидемия длится достаточно долго, то действие иммунитета может закончиться, что может теоретически привести к «вечному» циклу.

С другой стороны, если коэффициент не сбивать, то очень быстро все могут переболеть, и это может быть настолько быстро, что иммунитет еще будет действовать, а это значит — конец пандемии. Казалось бы, неплохая альтернатива «вечности».

Но, обойдя Сциллу, мы рискуем столкнуться с Харибдой. Количество переболевших будет большим (теоретически, при большом коэффициенте, все человечество), количество жизненных циклов и, соответственно, число возможных мутаций вируса будет также большим, что приведет к повышенной вероятности возникновения нового штамма, который сможет обойти иммунную защиту переболевших, что опять-таки может привести к ситуации бесконечной пандемии.

Конечно, здесь мы вступаем в область полной неопределенности. Какова вероятность появления нового штамма, способного обойти выработанный иммунитет? Какова вероятность, что этот штамм будет столь же опасен? Может таким образом придет «хороший» штамм, неопасный для человека, а «плохие» штаммы «вымрут»?

То есть, на качественном уровне мы можем предположить, что меры борьбы с эпидемией могут привести к ее вечному циклу. Альтернативой является «естественный» процесс, но здесь также нет гарантий, что в силу изменчивости вируса, мы не получим ту же «вечность».

Теперь давайте рассмотрим все это с точки зрения математики.

Математическая модель

Начнем с модели. Мы создадим примитивную модель, основываясь на утверждениях, изложенных ниже. Конечно, надо всегда помнить, что это всего лишь модель, которая не учитывает многие факторы, которые могут оказаться существенными, но все-таки, она поможет нам увидеть некоторые интересные и не столь уж оторванные от жизни закономерности.

  1. Мы считаем, что все люди имеют равную вероятность заразиться и заразить, если они инфицированы.

  2. Инфицированный является заразным только в течении времени T. Это число является константой и одинаково для всех людей.

  3. Переболев, человек не может заболеть второй раз в течении времени действия иммунитета T_{imm}. Он также не может быть переносчиком инфекции. После этого времени, способность человека заразиться и заражать не отличается от не переболевших.

  4. Человек, получивший прививку, по иммунитету приравнивается к переболевшему.

  5. Мы будем пренебрегать фактором смертности.

  6. Для простоты вычислений мы будем считать, что люди заражаются синхронно, с интервалом T/2 (где T— это время, определенное в п.2). Таким образом, в точках 0, T/2, ... kT/2..мы имеем число инфицированных n_0, n_1, ... n_k, ...

    image-loader.svg

На данном этапе, не беря во внимание фактор вакцинации, и конечности времени действия иммунитета, с учетом п.3, мы можем составить рекуррентное выражение:

n_{k+1} = n_k R_0 \displaystyle\frac{N- \sum_{i=1}^kn_i}{N}

R_0 — это коэффициент репродукции вируса, в момент начала пандемии (когда мы объявили о начале пандемии), при условии, что все меры борьбы уже приняты, в том числе вакцинировано \sigma Nчеловек.
N = 7.5 * 10^9— это приблизительное число всех людей.

Теперь учтем тот факт, что иммунитет не действует бесконечно:

n_{k+1} = n_k R_0 \displaystyle\frac{N- \sum_{k-w}^kn_i}{N}

w = int(2*T_{imm}/T), где T_{imm} — время действия иммунитета, а функция int() отражает тот факт, что нам нужно выделить целую часть.

Остался один параметр. Давайте предположим, что мы все время поддерживаем уровень вакцинированных / ревакцинированных, как \sigma N. Что это дает? Отчасти, уровень вакцинированности уже учтен в R_0, в силу того, как мы определили этот коэффициент выше, но это также меняет и количество людей, которые подвержены этой инфекции на данный момент. С учетом этого последнего факта, нашу формулу можно записать в виде:

n_{k+1} = n_k R_0 \displaystyle\frac{(1-\sigma) N- \sum_{k-w}^kn_i}{(1-\sigma) N}

Теперь все готово, чтобы продолжить наше исследование численными методами.

Численный метод

Весь используемый в статье код вы найдете здесь.

Ниже приведена функция, написанная на Python, рекуррентно находящая все n_i в зависимости от R_0.

Я постарался взять параметры разумными или приближенными к жизни:

  • Население: N = 7 500 000 000

  • Начало пандемии: n_0 = 10000

  • Конец пандемии (когда количество инфицированных становится меньше этого числа, мы считаем, что болезнь побеждена): n\_end = 1000

  • Время, в течении которого инфицированный способен заражать других: T = 1месяц. Это значит, что временной шаг рекурсии (цикла)- полмесяца.

  • Продолжительность действия иммунитета в циклах: iwin = 24, что с учетом предыдущего пункта равно 12 месяцам или году

  • Если количество циклов становится равным 2400, что соответствует 100 годам, то мы считает эпидемию вечной: maxc = 2400

from cfractions import Fraction
  
# Population
N = 7500000000

# Ratio of vaccinated from all people
sigma = 0.7

# Start of pandemic - number of infected people in the beginning of the pandemic
n0 = 10000

# End of the pandemic. Number of infected people that we consider as the end of the pandemic
n_end = 1000

# Immunity window. If T = one month, then iwin = 24 corresponds to 1 year of immunity
iwin = 24

# Max number of itterations (cicles). If T = one moths then macx = 2400 corresponds to 100 years. We consider this time as infinity
maxc = 2400

def pandemic(R0):
  n = [n0, int(R0 * n0)]
  # The number of people who retained natural immunity after an illness
  S = n0
  # The total number of infected since the beginning of the pandemic
  S_total = n0
  for i in range(2, maxc + 1):
    if i > iwin:
      S = S + n[i-1] - n[i - iwin -1 ]
    else:
      S = S + n[i-1]
    n.append(int(n[i-1] * R0 * Fraction((int((1-sigma) * N) - S),int((1-sigma) * N))))
    S_total = S_total + n[i-1]
    # End of the pandemic
    if (n[i] < n_end):
      n.pop()
      break
    # All people are infected
    elif (S + n[i]) > (1-sigma) * N:
      n[i] = (1-sigma) * N - S
      S_total = S_total + n[i]
      break
  return (n, S_total)

Окно бесконечности

Давайте теперь посмотрим, как продолжительность эпидемии зависит от R_0. Пишем небольшую программу.

from pandemic import pandemic

for j in range (1,30):

 # R0 is changing from 0.5 to 2.0 with step = 0.05
 R0 = 0.5 + 0.05 * j
 (n, Sum) = pandemic(R0)
 if len(n) == 2401:
  l = 'infinity'
 else:
  l = ("%0.1f months" % (len(n) / 2))
 print ("R0 = %0.2f pandemic duration = %s" % (R0, l))

Что дает:

R0 = 0.55 pandemic duration = 2.0 months
R0 = 0.60 pandemic duration = 2.5 months
R0 = 0.65 pandemic duration = 3.0 months
R0 = 0.70 pandemic duration = 3.5 months
R0 = 0.75 pandemic duration = 4.0 months
R0 = 0.80 pandemic duration = 5.5 months
R0 = 0.85 pandemic duration = 7.5 months
R0 = 0.90 pandemic duration = 11.0 months
R0 = 0.95 pandemic duration = 22.5 months
R0 = 1.00 pandemic duration = infinity
R0 = 1.05 pandemic duration = infinity
R0 = 1.10 pandemic duration = infinity
R0 = 1.15 pandemic duration = infinity
R0 = 1.20 pandemic duration = infinity
R0 = 1.25 pandemic duration = infinity
R0 = 1.30 pandemic duration = infinity
R0 = 1.35 pandemic duration = infinity
R0 = 1.40 pandemic duration = infinity
R0 = 1.45 pandemic duration = infinity
R0 = 1.50 pandemic duration = infinity
R0 = 1.55 pandemic duration = infinity
R0 = 1.60 pandemic duration = infinity
R0 = 1.65 pandemic duration = 21.0 months
R0 = 1.70 pandemic duration = 19.5 months
R0 = 1.75 pandemic duration = 18.5 months
R0 = 1.80 pandemic duration = 17.5 months
R0 = 1.85 pandemic duration = 16.5 months
R0 = 1.90 pandemic duration = 16.0 months
R0 = 1.95 pandemic duration = 15.0 months

Мы видим, что все хорошо, когда R_0 <1, что ожидаемо.

Но мы также видим, что есть окно, в данном случае с точностью 0.05 это 1 \leq R_0 \leq 1.60, когда пандемия становится бесконечной. При изменении Nи коэффициента вакцинации \sigmaширина окна изменяется, но все же окно остается. Поэтому можно утверждать, что наличие такого окна — это закономерность.

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

Ложные победы, ложные новые волны

Это было неожиданным.

Давайте возьмем какой-то R_0 из окна «бесконечности», например, R_0 = 1.3и посмотрим повнимательнее, как будет выглядеть n[i]. Точнее нас будет интересовать отношение R = n[i]/n[i-1]

А выглядеть это будет вот так (график приведен для 10 лет):

image-loader.svg

Мы видим колебания с периодом 2T_{imm} (так, если время действия иммунитета 1 год, то это 2 года).

И мы видим, что каждые 2 года кажется, что эпидемия отступает, что коэффициент репродукции Rпадает, но в действительности это лишь синусоида. Это не вычислительная ошибка. Это связано с тем, что люди через год теряют иммунитет и пополняют собой число тех, кто может быть инфицирован.

Таким образом, когда R_0 находится в «окне бесконечности», то каждые 2 года (при длительности иммунитета в 1 год) мы имеем картину ложной победы над вирусом. Верно и обратное со смещением на один год — каждые 2 года мы имеем ложную «новую волну».

Большой коэффициент

Если коэффициент R_0выходит за пределы окна в сторону увеличения, то наблюдается взрывной рост заболеваемости.

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

Давайте предположим, что мы решили не применять никаких мер, понижающих R_0, в том числе и вакцинацию (\sigma = 0).

Давайте рассмотрим, как выглядит продолжительность эпидемии и суммарное количество заражений в этом случае.

from pandemic import pandemic

for j in range (1,30):

 # R0 is changing from 1.5 to 3.0 with step = 0.05
 R0 = 1.5 + 0.05 * j
 (n, Sum) = pandemic(R0)
 if len(n) == 2401:
  l = 'infinity'
 else:
  l = ("%0.1f months" % (len(n) / 2))
 print ("R0 = %0.2f, pandemic duration = %s, number of infected = %i" % (R0, l, Sum))

Результат:

R0 = 1.55, pandemic duration = infinity, number of infected = 220677815238
R0 = 1.60, pandemic duration = infinity, number of infected = 226811933605
R0 = 1.65, pandemic duration = 23.5 months, number of infected = 5370663038
R0 = 1.70, pandemic duration = 21.5 months, number of infected = 5576536938
R0 = 1.75, pandemic duration = 20.5 months, number of infected = 5766191369
R0 = 1.80, pandemic duration = 19.0 months, number of infected = 5941026595
R0 = 1.85, pandemic duration = 18.0 months, number of infected = 6102298423
R0 = 1.90, pandemic duration = 17.0 months, number of infected = 6251123149
R0 = 1.95, pandemic duration = 16.5 months, number of infected = 6388501089
R0 = 2.00, pandemic duration = 15.5 months, number of infected = 6515326099
R0 = 2.05, pandemic duration = 15.0 months, number of infected = 6632350267
R0 = 2.10, pandemic duration = 14.5 months, number of infected = 6740402465
R0 = 2.15, pandemic duration = 14.0 months, number of infected = 6839848643
R0 = 2.20, pandemic duration = 13.5 months, number of infected = 6931809975
R0 = 2.25, pandemic duration = 13.0 months, number of infected = 7015592149
R0 = 2.30, pandemic duration = 12.5 months, number of infected = 7093938104
R0 = 2.35, pandemic duration = 12.0 months, number of infected = 7163933404
R0 = 2.40, pandemic duration = 11.5 months, number of infected = 7227716019
R0 = 2.45, pandemic duration = 11.0 months, number of infected = 7290611131
R0 = 2.50, pandemic duration = 10.5 months, number of infected = 7339160188
R0 = 2.55, pandemic duration = 10.0 months, number of infected = 7381860825
R0 = 2.60, pandemic duration = 9.5 months, number of infected = 7437276401
R0 = 2.65, pandemic duration = 9.0 months, number of infected = 7476194427
R0 = 2.70, pandemic duration = 9.0 months, number of infected = 7480251053
R0 = 2.75, pandemic duration = 7.5 months, number of infected = 7500000000
R0 = 2.80, pandemic duration = 7.5 months, number of infected = 7500000000
R0 = 2.85, pandemic duration = 7.5 months, number of infected = 7500000000
R0 = 2.90, pandemic duration = 7.5 months, number of infected = 7500000000
R0 = 2.95, pandemic duration = 7.0 months, number of infected = 7500000000

При большом коэффициенте инфекция распространяется очень быстро, и в рамках нашей модели вся популяция должна переболеть.

Всего на данный момент по официальным данным коронавирусом переболело около 250 миллионов человек. Трудно сказать, насколько это соответствует реальности, но т.к. мы просто ищем закономерности, не сильно оторванные от жизни, то давайте предположим, что переболело уже полмиллиарда. Один из недавних штаммов, штамм Омикрон, вызывает опасение относительно эффективности существующих вакцин, и есть опасения, что он обходит иммунитет переболевших.

Поэтому в рамках нашей модели кажется разумным предположить, что миллиард заболевших с достаточно высокой вероятностью приводит к появлению штамма, который обходит иммунную защиту, выработанную во время заражения предыдущими штаммами. А это значит, что, если мы оценили правильно этот параметр, то большой коэффициент распространения без вакцинации нам не поможет, ведь переболеет больше одного миллиарда, и родится новый штамм и. «эта музыка будет вечной».

Посмотрим, как изменится суммарное количество переболевших в зависимости от уровня вакцинированности \sigma.

Если идти с шагом 0.05, то не трудно увидеть, что, лишь начиная с \sigma = 0.95мы получаем приемлимые значения.

Данные для \sigma = 0.95

R0 = 1.50, pandemic duration = infinity, number of infected = 10670873250
R0 = 1.55, pandemic duration = 21.0 months, number of infected = 245188791
R0 = 1.60, pandemic duration = 19.0 months, number of infected = 257349433
R0 = 1.65, pandemic duration = 18.0 months, number of infected = 268536232
R0 = 1.70, pandemic duration = 17.0 months, number of infected = 278831999
R0 = 1.75, pandemic duration = 16.0 months, number of infected = 288315365
R0 = 1.80, pandemic duration = 15.0 months, number of infected = 297056971
R0 = 1.85, pandemic duration = 14.5 months, number of infected = 305120690
R0 = 1.90, pandemic duration = 13.5 months, number of infected = 312561088
R0 = 1.95, pandemic duration = 13.0 months, number of infected = 319429784
R0 = 2.00, pandemic duration = 12.5 months, number of infected = 325770312
R0 = 2.05, pandemic duration = 12.0 months, number of infected = 331622342
R0 = 2.10, pandemic duration = 11.5 months, number of infected = 337023483
R0 = 2.15, pandemic duration = 11.0 months, number of infected = 341994871
R0 = 2.20, pandemic duration = 10.5 months, number of infected = 346591089
R0 = 2.25, pandemic duration = 10.0 months, number of infected = 350806484
R0 = 2.30, pandemic duration = 10.0 months, number of infected = 354637786
R0 = 2.35, pandemic duration = 9.5 months, number of infected = 358230933
R0 = 2.40, pandemic duration = 9.0 months, number of infected = 361532237
R0 = 2.45, pandemic duration = 9.0 months, number of infected = 364310607
R0 = 2.50, pandemic duration = 8.5 months, number of infected = 366808895
R0 = 2.55, pandemic duration = 8.0 months, number of infected = 369494043
R0 = 2.60, pandemic duration = 7.5 months, number of infected = 372023933
R0 = 2.65, pandemic duration = 7.5 months, number of infected = 373494263
R0 = 2.70, pandemic duration = 7.5 months, number of infected = 373945921
R0 = 2.75, pandemic duration = 7.0 months, number of infected = 374826496
R0 = 2.80, pandemic duration = 6.0 months, number of infected = 375000000
R0 = 2.85, pandemic duration = 6.0 months, number of infected = 375000000

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

Но это нереальная ситуация. Во-первых, вакцинация сама по себе дает защиту меньше95\%. Во-вторых, это должна быть супер-заразная инфекция, чтобы при таком уровне вакцинации коэффициент R_0был все же довольно высоким (помним, что мы определили этот коэффициент, как уже учитывающий все меры борьбы с пандемией). Ну и в-третьих, не думаю, что сейчас возможно за один год вакцинировать такое огромное количество людей.

В общем, нереально.

Население планеты, похоже, стало настолько большим, что мы представляем прекрасную естественную лабораторию для новых вирусов, и этот реактор, если он запущен, не так-то просто остановить.

Нагрузка на систему здравоохранения

Не хочется иметь вечную пандемию, согласитесь. Хочется выбраться за пределы «окна вечности». Вдруг мы ошиблись с вероятностью появления штамма, способного обойти иммунную защиту? Можно попытаться отслеживать новые штаммы и купировать их в момент появления. Но тогда, может быть, большой R_0за пределами окна все же является выходом из этой вечной круговерти?

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

Если всерьез рассматривать этот подход, то нужно учитывать и максимальное количество болеющих в моменте в зависимости от R_0.

image-loader.svg

Предположим, мы не вводим никаких мер, в том числе и вакцинацию. И таким образом, оказываемся за пределами «окна вечности». Предположим R_0 = 1,9. Тогда в соответствии с графиком выше, максимальное n_j будет 1 250 000 000, что с учетом того, что это за две недели, получаем прирост заболевших в районе ста миллионов в день.

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

Выводы

Давайте коротко подведем итог нашего исследования.

  1. С точки зрения данной модели, единственным способом победить пандемию является уменьшение усредненного по всем странам коэффициента распространения R_0до значения меньше 1. Нет смысла делать это в отдельно взятой стране. Важно именно среднее значение.

  2. Если это не удается, то в зависимости от того, насколько высоким является коэффициентR_0, модель дает 2 принципиально разных сценария.

  3. Существует «окно бесконечности», когда удерживание коэффициента в этом диапазоне приводит к бесконечной эпидемии. Это слабо зависит от того, сколько людей вакцинировано. Если коэффициент R_0находится в этом диапазоне, то мы имеем бесконечную эпидемию.

  4. Если R_0удерживается в «окне бесконечности», то зависимость заболевших от времени носит синусоидальный характер с периодом 2T_{imm}(2 года в нашей модели), что приводит к периодическим ложным новым волнам и ощущению ложных побед над вирусом.

  5. Выход R_0за пределы этого окна вверх приводит к тому, что эпидемия могла бы успеть закончиться за время действия иммунитета, но при этом число переболевших является значительным. В рамках нашей модели и параметров, которые мы задали, это приводит к циклическому появлению новых штаммов, способных обходить иммунные защиты выработанные как ответ на предыдущие штаммы и, как результат, мы опять получаем бесконечность.

  6. Для уменьшения нагрузки на систему здравоохранения и уменьшения смертности коэффициент R_0должен быть как можно меньше.

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

© Habrahabr.ru