Автор статьи: Артем Михайлов

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

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

К примеру модель популяционной динамики может помочь вам предсказать, как изменения в климате или доступности пищи повлияют на численность и здоровье этой популяции.

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

Основные принципы биологического моделирования


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

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

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

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

4. Верификация и валидация: Модели должны быть верифицированы (проверены на соответствие математическим уравнениям) и валидированы (проверены на соответствие реальным данным). Это важный этап, чтобы удостовериться, что модель корректно описывает биологический процесс.

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

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

1. NumPy: NumPy — это фундаментальная библиотека для работы с массивами данных в Python. Она предоставляет эффективные структуры данных и функции для выполнения математических операций. NumPy особенно полезен при решении дифференциальных уравнений и обработке численных данных.

import numpy as np

# Создание массива
arr = np.array([1, 2, 3, 4, 5])

# Выполнение операции над массивом
squared_arr = arr**2

print(squared_arr)

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

from scipy.integrate import solve_ivp

# Определение дифференциального уравнения
def population_growth(t, y):
    return 0.1 * y

# Начальные условия
initial_population = [100]

# Решение дифференциального уравнения
solution = solve_ivp(population_growth, [0, 10], initial_population, t_eval=np.arange(0, 10, 0.1))

print(solution.y[0])

3. Biopython: Biopython — это библиотека, разработанная специально для биоинформатики. Она предоставляет инструменты для работы с последовательностями ДНК, РНК и белками, а также анализа структур биологических молекул.

from Bio import SeqIO

# Чтение последовательности ДНК из файла
record = SeqIO.read("sequence.fasta", "fasta")
print(record.seq)

4. OpenMM: OpenMM — это библиотека для моделирования молекулярной динамики. Она используется для изучения взаимодействия атомов и молекул внутри биологических систем, таких как белки и ДНК.

from simtk.openmm.app import *
from simtk.openmm import *
from simtk.unit import *

# Создание системы и добавление частиц
system = System()
system.addParticle(1.0 * amu)
system.addParticle(2.0 * amu)

# Создание потенциала
force = CustomBondForce("k * (r - r0)^2")
force.addGlobalParameter("k", 100.0 * kilojoules_per_mole / nanometer**2)
force.addGlobalParameter("r0", 0.1 * nanometer)
force.addBond(0, 1)

# Создание интегратора
integrator = VerletIntegrator(0.001 * picoseconds)

# Создание симуляции
simulation = Simulation(Topology(), system, integrator)

# Запуск симуляции
simulation.context.setPositions([[0, 0, 0], [1, 0, 0]])
simulation.step(1000)

5. Matplotlib: Matplotlib — это библиотека для создания графиков и визуализации данных. Она позволяет строить красочные графики для иллюстрации результатов биологического моделирования.

import matplotlib.pyplot as plt

# Создание данных для графика
x = np.linspace(0, 10, 100)
y = np.sin(x)

# Построение графика
plt.plot(x, y)
plt.xlabel("Время")
plt.ylabel("Значение")
plt.title("График синусоиды")
plt.show()

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

Моделирование популяционных динамик


Модель Лотки-Вольтерры, также известная как модель хищник-жертва, является одной из классических моделей, используемых для описания взаимодействия между популяциями двух видов в экологии. Эта модель была предложена Вито Вольтеррой и Альфредом Лоткой в начале 20-го века и представляет собой систему дифференциальных уравнений, описывающих изменение численности двух видов: хищников и жертв.

В модели учитывается следующее:
  • Численность жертв (например, кроликов).
  • Численность хищников (например, лис).
  • Cкорость роста численности жертв без воздействия хищников.
  • Cкорость, с которой хищники успешно охотятся на жертв.
  • Cкорость, с которой хищники потребляют их добычу.
  • Cкорость роста численности хищников при наличии достаточной пищи.

Реализуем модель Лотки-Вольтерры с использованием библиотеки NumPy. Прежде всего, мы определим параметры модели и напишем функцию, которая будет вычислять производные численности жертв и хищников по времени.

import numpy as np
import matplotlib.pyplot as plt

# Параметры модели Лотки-Вольтерры
r = 0.1  # Скорость роста жертв без хищников
a = 0.02  # Скорость, с которой хищники охотятся на жертв
b = 0.3  # Скорость, с которой хищники потребляют добычу
m = 0.01  # Скорость роста хищников при наличии пищи

# Временные параметры
dt = 0.001  # Шаг времени
t_max = 100  # Максимальное время моделирования

# Начальные условия
N0 = 40  # Начальная численность жертв
P0 = 9   # Начальная численность хищников

# Создаем массивы для хранения численности жертв и хищников во времени
num_steps = int(t_max / dt) + 1
N = np.zeros(num_steps)
P = np.zeros(num_steps)
time = np.linspace(0, t_max, num_steps)

# Функция для вычисления производных
def compute_derivatives(N, P):
    dNdt = r * N - a * N * P
    dPdt = -b * P + m * N * P
    return dNdt, dPdt

# Итерационное вычисление численности жертв и хищников с добавлением случайных возмущений
for i in range(num_steps - 1):
    dNdt, dPdt = compute_derivatives(N[i], P[i])
    
    # Добавляем случайные возмущения
    noise_N = np.random.normal(0, 0.1)
    noise_P = np.random.normal(0, 0.1)
    
    N[i + 1] = N[i] + (dNdt + noise_N) * dt
    P[i + 1] = P[i] + (dPdt + noise_P) * dt

# Визуализация результатов
plt.figure(figsize=(12, 6))
plt.plot(time, N, label='Численность жертв (N)')
plt.plot(time, P, label='Численность хищников (P)')
plt.xlabel('Время')
plt.ylabel('Численность')
plt.title('Модель Лотки-Вольтерры с изменениями')
plt.legend()
plt.grid(True)
plt.show()

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



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

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

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

Модель Сиссеры описывает следующие аспекты:
  • Численность жертв в момент времени.
  • Численность хищников в момент времени.
  • Численность добычи (пищи) в момент времени.
  • Скорость роста численности жертв без воздействия хищников.
  • Скорость, с которой хищники охотятся на жертв.
  • Скорость, с которой хищники потребляют добычу.
  • Скорость роста численности хищников при наличии пищи.
  • Эффективность превращения добычи в хищников (сколько добычи требуется для рождения нового хищника).

Реализуем модель Сиссеры в Python с использованием библиотеки NumPy и визуализируем ее результаты:

import numpy as np
import matplotlib.pyplot as plt

# Параметры модели Сиссеры
r = 0.1  # Скорость роста жертв без хищников
a = 0.02  # Скорость, с которой хищники охотятся на жертв
b = 0.3  # Скорость, с которой хищники потребляют добычу
c = 0.01  # Скорость роста хищников при наличии пищи
e = 0.1   # Эффективность превращения добычи в хищников (сколько добычи требуется для рождения нового хищника)

# Временные параметры
dt = 0.001  # Шаг времени
t_max = 100  # Максимальное время моделирования

# Начальные условия
N0 = 40  # Начальная численность жертв
P0 = 9   # Начальная численность хищников
F0 = 200 # Начальная численность добычи

# Создаем массивы для хранения численности жертв, хищников и добычи во времени
num_steps = int(t_max / dt) + 1
N = np.zeros(num_steps)
P = np.zeros(num_steps)
F = np.zeros(num_steps)
time = np.linspace(0, t_max, num_steps)

# Функция для вычисления производных
def compute_derivatives(N, P, F):
    dNdt = r * N - a * N * P - b * N * F
    dPdt = -c * P + e * a * N * P
    dFdt = -b * F + e * a * N * P
    return dNdt, dPdt, dFdt

# Итерационное вычисление численности с добавлением случайных возмущений
for i in range(num_steps - 1):
    dNdt, dPdt, dFdt = compute_derivatives(N[i], P[i], F[i])
    
    # Добавляем случайные возмущения
    noise_N = np.random.normal(0, 0.1)
    noise_P = np.random.normal(0, 0.1)
    noise_F = np.random.normal(0, 0.1)
    
    N[i + 1] = N[i] + (dNdt + noise_N) * dt
    P[i + 1] = P[i] + (dPdt + noise_P) * dt
    F[i + 1] = F[i] + (dFdt + noise_F) * dt

# Визуализация результатов
plt.figure(figsize=(12, 6))
plt.plot(time, N, label='Численность жертв (N)')
plt.plot(time, P, label='Численность хищников (P)')
plt.plot(time, F, label='Численность добычи (F)')
plt.xlabel('Время')
plt.ylabel('Численность')
plt.title('Модель Сиссеры с изменениями')
plt.legend()
plt.grid(True)
plt.show()

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

Важно отметить, что эта модель более сложна, чем модель Лотки-Вольтерры, и позволяет исследовать более сложные сценарии взаимодействия популяций в экосистеме.




Моделирование распространения инфекционных болезней


Инфекционные болезни являются серьезной проблемой для общества и областью, где моделирование может сыграть критическую роль. В этой статье мы рассмотрим две популярные модели для анализа и прогнозирования распространения инфекционных болезней: модель SIR (Susceptible-Infectious-Recovered) и модель SEIR (Susceptible-Exposed-Infectious-Recovered).

Модель SIR (Susceptible-Infectious-Recovered)


Модель SIR является одной из самых простых и широко используемых моделей для анализа распространения инфекционных болезней. Она разделяет население на три категории: восприимчивые (S — Susceptible), инфицированные (I — Infectious) и выздоровевшие (R — Recovered). Модель основана на следующих предположениях:
  • Все особи начинают в категории S.
  • Инфекция передается только от инфицированных к восприимчивым.
  • Инфицированные со временем выздоравливают и переходят в категорию R.

   from scipy.integrate import solve_ivp
   import numpy as np
   import matplotlib.pyplot as plt
   from Bio import Phylo

   # Параметры модели
   beta = 0.3  # Коэффициент передачи инфекции
   gamma = 0.1  # Коэффициент выздоровления

   # Временные параметры
   t_start = 0
   t_end = 200
   t_interval = (t_start, t_end)

   # Начальные условия
   S0 = 0.9  # Начальная доля восприимчивых
   I0 = 0.1  # Начальная доля инфицированных
   R0 = 0.0  # Начальная доля выздоровевших

   # Функция для модели SIR
   def sir_model(t, y):
       S, I, R = y
       dSdt = -beta * S * I
       dIdt = beta * S * I - gamma * I
       dRdt = gamma * I
       return [dSdt, dIdt, dRdt]

   # Решение модели с помощью solve_ivp
   sol = solve_ivp(sir_model, t_interval, [S0, I0, R0], t_eval=np.linspace(t_start, t_end, 1000))

   # Визуализация результатов
   plt.figure(figsize=(12, 6))
   plt.plot(sol.t, sol.y[0], label='Восприимчивые (S)')
   plt.plot(sol.t, sol.y[1], label='Инфицированные (I)')
   plt.plot(sol.t, sol.y[2], label='Выздоровевшие (R)')
   plt.xlabel('Время')
   plt.ylabel('Доля населения')
   plt.title('Модель SIR для распространения инфекции')
   plt.legend()
   plt.grid(True)
   plt.show()



В этом примере мы задаем параметры модели, реализуем дифференциальные уравнения SIR и используем функцию solve_ivp из библиотеки SciPy для решения этих уравнений. Затем мы строим графики доли восприимчивых, инфицированных и выздоровевших в течение времени.

Модель SEIR (Susceptible-Exposed-Infectious-Recovered)


Модель SEIR расширяет модель SIR, включая категорию экспоненциально инфицированных (E — Exposed), которые были инфицированы, но еще не стали инфекционными. Эта модель полезна для анализа болезней с инкубационным периодом, когда инфицированные лица не могут передавать инфекцию сразу после заражения.

   from scipy.integrate import solve_ivp
   import numpy as np
   import matplotlib.pyplot as plt

   # Параметры модели
   beta = 0.3  # Коэффициент передачи инфекции
   sigma = 0.2  # Скорость перехода из E в I
   gamma = 0.1  # Коэффициент выздоровления

   # Временные параметры
   t_start = 0
   t_end = 200
   t_interval = (t_start, t_end)

   # Начальные условия
   S0 = 0.9  # Начальная доля восприимчивых
   E0 = 0.1  # Начальная доля экспоненциально инфицированных
   I0 = 0.0  # Начальная доля инфицированных
   R0 = 0.0  # Начальная доля выздоровевших

   # Функция для модели SEIR
   def seir_model(t, y):
       S, E, I, R = y
       dSdt = -beta * S * I
       dEdt = beta * S * I - sigma * E
       dIdt = sigma * E - gamma * I
       dRdt = gamma * I
       return [dSdt, dEdt, dIdt, dRdt]

   # Решение модели с помощью solve_ivp
   sol = solve_ivp(seir_model, t_interval, [S0, E0, I0, R0], t_eval=np.linspace(t_start, t_end, 1000))

   # Визуализация результатов
   plt.figure(figsize=(12, 6))
   plt.plot(sol.t, sol.y[0], label='Восприимчивые (S)')
   plt.plot(sol.t, sol.y[1], label='Экспоненциально инфицированные (E)')
   plt.plot(sol.t, sol.y[2], label='Инфицированные (I)')
   plt.plot(sol.t, sol.y[3], label='Выздоровевшие (R)')
   plt.xlabel('Время')
   plt.ylabel('Доля населения')
   plt.title('Модель SEIR для распространения инфекции с инкубационным периодом')
   plt.legend()
   plt.grid(True)
   plt.show()


Этот пример аналогичен модели SIR, но включает категорию экспоненциально инфицированных и соответствующие параметры. Модель SEIR позволяет более точно моделировать инфекционные болезни с учетом инкубационного периода.

Моделирование генных сетей


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

Генные сети представляют собой графы, в которых узлами являются гены или белки, а ребра представляют собой взаимодействия между ними. Существует два основных типа взаимодействий:

1. Физические взаимодействия: Это взаимодействия между белками, которые могут быть физически связаны вместе. Примером такого взаимодействия является связь между ферментом и его субстратом.

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

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

NetworkX — это мощная библиотека Python для работы с графами и сетями. Она предоставляет инструменты для создания, анализа и визуализации графов, что делает ее отличным выбором для моделирования генных сетей.

Давайте начнем с установки библиотеки NetworkX, если у вас ее нет:

pip install networkx

Cоздадим простой граф генной сети с несколькими узлами и ребрами. В этом примере у нас будут три гена, и мы определим, какие из них взаимодействуют друг с другом.

import networkx as nx
import matplotlib.pyplot as plt

# Создаем пустой граф
gene_network = nx.Graph()

# Добавляем узлы (гены)
gene_network.add_node("GeneA")
gene_network.add_node("GeneB")
gene_network.add_node("GeneC")

# Добавляем ребра (взаимодействия)
gene_network.add_edge("GeneA", "GeneB")
gene_network.add_edge("GeneB", "GeneC")

# Визуализация графа
pos = nx.spring_layout(gene_network, seed=42)  # Определяем расположение узлов
nx.draw(gene_network, pos, with_labels=True

, node_size=500, node_color="skyblue", font_size=10, font_color="black", font_weight="bold", width=2, edge_color="gray")
plt.title("Простой граф генной сети")
plt.show()


В этом примере мы создали пустой граф, добавили узлы (гены) и определили, какие из них взаимодействуют друг с другом, добавив ребра (взаимодействия). Затем мы визуализировали граф с помощью библиотеки Matplotlib.

Анализ структуры генных сетей с помощью Python


Теперь, когда у нас есть представление о том, как создавать графы генных сетей, давайте рассмотрим, как анализировать их структуру. Важными метриками анализа генных сетей являются:

1. Степень узлов (Node Degree): Это количество связей (ребер), связанных с узлом. Эта метрика может помочь выявить наиболее важные гены или белки в сети.

2. Центральность (Centrality): Это метрика, определяющая, насколько узел центральный в графе. Наиболее распространенными метриками центральности являются центральность по посредничеству (Betweenness Centrality) и центральность по близости (Closeness Centrality).

3. Кластеризация (Clustering): Эта метрика позволяет определить, насколько близко связаны узлы в графе. Высокая кластеризация может указывать на сильные модульные структуры в сети.

Проведем анализ простого графа генной сети, который мы создали ранее:

# Анализ структуры графа
degree_centrality = nx.degree_centrality(gene_network)
betweenness_centrality = nx.betweenness_centrality(gene_network)
closeness_centrality = nx.closeness_centrality(gene_network)
clustering_coefficient = nx.clustering(gene_network)

# Вывод результатов
for node in gene_network.nodes:
    print(f"Узел: {node}")
    print(f"Степень узла: {degree_centrality[node]}")
    print(f"Центральность по посредничеству: {betweenness_centrality[node]}")
    print(f"Центральность по близости: {closeness_centrality[node]}")
    print(f"Коэффициент кластеризации: {clustering_coefficient[node]}")
    print("-" * 30)


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

Рассмотрим еще два примера генных сетей и их кодовую реализацию в Python с использованием библиотеки NetworkX:

Генная сеть в дрожжах (Saccharomyces cerevisiae)


Дрожжи (Saccharomyces cerevisiae) — это один из наиболее изученных организмов в молекулярной биологии. Генная сеть дрожжей представляет собой сложную сеть взаимодействия между их генами и белками. Давайте создадим простую генную сеть дрожжей и визуализируем ее:

import networkx as nx
import matplotlib.pyplot as plt

# Создаем пустой граф
yeast_gene_network = nx.Graph()

# Добавляем узлы (гены)
yeast_genes = ["YGR198W", "YPL248C", "YDR277C", "YBR118W", "YPL268W"]
yeast_gene_network.add_nodes_from(yeast_genes)

# Добавляем ребра (взаимодействия)
yeast_gene_network.add_edge("YGR198W", "YPL248C")
yeast_gene_network.add_edge("YPL248C", "YDR277C")
yeast_gene_network.add_edge("YBR118W", "YPL268W")

# Визуализация графа
pos = nx.spring_layout(yeast_gene_network, seed=42)  # Определяем расположение узлов
nx.draw(yeast_gene_network, pos, with_labels=True, node_size=500, node_color="skyblue",
        font_size=10, font_color="black", font_weight="bold", width=2, edge_color="gray")
plt.title("Генная сеть дрожжей")
plt.show()


В этом примере мы создали генную сеть дрожжей с несколькими узлами (генами) и ребрами (взаимодействиями) между ними. Визуализация позволяет нам увидеть структуру сети.

Генная сеть человека


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

import networkx as nx
import matplotlib.pyplot as plt

# Создаем пустой граф
human_gene_network = nx.Graph()

# Добавляем узлы (гены)
human_genes = ["TP53", "BRCA1", "EGFR", "CDH1", "KRAS"]
human_gene_network.add_nodes_from(human_genes)

# Добавляем ребра (взаимодействия)
human_gene_network.add_edge("TP53", "BRCA1")
human_gene_network.add_edge("EGFR", "CDH1")
human_gene_network.add_edge("CDH1", "KRAS")

# Визуализация графа
pos = nx.spring_layout(human_gene_network, seed=42)  # Определяем расположение узлов
nx.draw(human_gene_network, pos, with_labels=True, node_size=500, node_color="skyblue",
        font_size=10, font_color="black", font_weight="bold", width=2, edge_color="gray")
plt.title("Простая генная сеть человека")
plt.show()


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

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

Заключение


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

Комментарии (1)


  1. belch84
    13.09.2023 05:54

    Модель SEIR (Susceptible-Exposed-Infectious-Recovered)
    Существуют и более сложные варианты этой модели, например, SEIQRD (Q-Quarantined, D-Dead), которая учитывает количество заболевших и находящихся на карантине, а также количество умерших. Вот анимированное изображние, на котором показано влияние параметра «скорость заражения» на развитие эпидемии
    Динамика эпидемии COVID-19