Біологія · Епідеміологія · ЗДР
📅 Березень 2026 ⏱ ≈ 9 хв читання 🎯 Початковий–середній · Останнє оновлення: 23 червня 2026 р.

Епідемічні моделі SIR та SEIR — популяційна біологія, R₀ та колективний імунітет

Модель SIR — запропонована Кермаком і Маккендріком у 1927 році — зводить епідемію до трьох диференціальних рівнянь і двох параметрів. Попри свою простоту, вона правильно прогнозує форму спалаху, час піку, остаточний розмір епідемії та критичний поріг вакцинації, відомий як колективний імунітет.

1. Компартменти SIR та припущення

Популяцію розміром N поділяють на три компартменти. Кожен індивід у будь-який момент належить рівно до одного з них:

S

Сприйнятливі — ще не інфіковані, можуть підхопити хворобу

I

Інфекційні — наразі інфіковані й здатні поширювати хворобу

R

Вибулі — одужалі (з імунітетом) або померлі; більше не передають інфекцію

Класична модель ґрунтується на трьох ідеалізаціях:

Чому «Вибулі», а не «Одужалі»? Цей компартмент об'єднує одужалих з імунітетом та померлих, оскільки і ті, й інші припиняють брати участь у передачі. У моделях з вітальною динамікою смерті відстежують окремо.

2. Система ЗДР — виведення

Позначимо через β швидкість передачі (контакти за одиницю часу × ймовірність передачі за контакт), а через γшвидкість одужання (1/γ = середня тривалість інфекції). Потік такий:

S → I зі швидкістю β · S · I / N
I → R зі швидкістю γ · I

dS/dt = −β · S · I / N
dI/dt = β · S · I / N − γ · I
dR/dt = γ · I

Перевірка збереження: dS/dt + dI/dt + dR/dt = 0 ⟹ S + I + R = N = const ✓

Член захворюваності β · S · I / N є частотозалежним: N у знаменнику означає, що подушова частота контактів фіксована незалежно від розміру популяції — це доречна форма для хвороб, що передаються безпосередньо, де контакти обмежені часом, а не щільністю населення.

Для густинозалежної передачі (наприклад, трансмісивні хвороби, де більше носіїв означає більше контактів) знаменник опускають: β · S · I.

3. Базове репродуктивне число R₀

R₀ (читається «R-нуль») — це середня кількість вторинних інфекцій, спричинених одним інфекційним індивідом, введеним до повністю сприйнятливої популяції. Це найкорисніша окрема епідеміологічна величина:

R₀ = β / γ

Виведення: на початку S ≈ N, тож
dI/dt ≈ (β − γ) · I → зростання тоді й лише тоді, коли β > γ → тобто R₀ > 1

R₀ < 1 → епідемія згасає (I одразу спадає)
R₀ = 1 → ендемічна рівновага
R₀ > 1 → епідемія зростає, доки S не вичерпається достатньо

Кір

R₀ ≈ 12–18
Одна з найзаразніших відомих хвороб.
Потрібне охоплення вакцинацією > 94%.

COVID-19 (початковий)

R₀ ≈ 2.5–3
Варіант Альфа: ≈4, Дельта: ≈6, Омікрон: ≈8–15.

Сезонний грип

R₀ ≈ 1.2–1.4
Відносно скромне; високе через загальну сприйнятливість.

Ебола (2014, Зах. Африка)

R₀ ≈ 1.5–2.5
Низьке порівняно з респіраторними хворобами; поширюється прямим контактом.

R₀ не слід плутати з ефективним репродуктивним числом Rₜ, яке враховує частковий імунітет та втручання: Rₜ = R₀ · S/N. Епідемія спадає, коли Rₜ опускається нижче 1.

4. Поріг колективного імунітету

На піку епідемії dI/dt = 0, що дає критичну частку сприйнятливих:

На піку: β · S* / N = γ
⟹ S* / N = γ / β = 1 / R₀

Частка, що має бути імунною, щоб запобігти зростанню:
h = 1 − 1/R₀

Приклади:
Кір (R₀ = 15): h = 1 − 1/15 ≈ 93%
COVID-19 (R₀ = 3): h = 1 − 1/3 ≈ 67%
Грип (R₀ = 1.3): h = 1 − 1/1.3 ≈ 23%

Якщо імунна частка перевищує h — чи то завдяки вакцинації, чи попередньому інфікуванню — одиничне занесення не може спричинити епідемію. Це популяційний (колективний) імунітет.

Остаточний розмір епідемії. Не всі сприйнятливі інфікуються; епідемія припиняється, коли S падає нижче S*, залишаючи частину сприйнятливих незачепленими. Остаточна частка інфікованих z задовольняє трансцендентне рівняння: z = 1 − exp(−R₀ · z), яке розв'язують чисельно (або методом Ньютона).

5. Модель SEIR — компартмент експонованих

Багато хвороб мають латентний період: індивіди вже інфіковані, але ще не заразні (COVID-19: ~5 днів; кір ~10 днів). SEIR додає компартмент Експоновані, щоб це врахувати:

S

Сприйнятливі

E

Експоновані (латентні — інфіковані, але ще не заразні)

I

Інфекційні

R

Вибулі

dS/dt = −β · S · I / N
dE/dt = β · S · I / N − σ · E
dI/dt = σ · E − γ · I
dR/dt = γ · I

σ = 1/(середній латентний період), напр. σ = 1/5 день⁻¹ для початкового варіанту COVID-19

SEIR R₀ = β/γ (та сама формула — латентний період зсуває час, але не поріг)

Латентний період затримує пік епідемії — саме тому відстеження контактів працює: експонованих індивідів можна виявити та ізолювати до того, як вони стануть заразними.

6. Реалізація на JavaScript із RK4

Ми використовуємо класичний розв'язувач ЗДР методом Рунге-Кутти четвертого порядку (RK4). Вектор стану — [S, E, I, R].

// ── Параметри моделі SEIR ─────────────────────────────────────────
const params = {
  N    : 1_000_000,  // загальна популяція
  beta : 0.3,        // швидкість передачі (день⁻¹)
  sigma: 1 / 5,     // швидкість інкубації (1/латентний період)
  gamma: 1 / 10,    // швидкість одужання (1/інфекційний період)
};

// ── Права частина SEIR ──────────────────────────────────────────
function seir([S, E, I, R], { N, beta, sigma, gamma }) {
  const force = beta * I / N;  // сила інфекції (на одного сприйнятливого)
  return [
    -force * S,               // dS/dt
     force * S - sigma * E,   // dE/dt
     sigma * E - gamma * I,   // dI/dt
     gamma * I                // dR/dt
  ];
}

// ── Один крок RK4 ──────────────────────────────────────────────
function rk4Step(f, y, dt, p) {
  const add = (a, b, s) => a.map((v, i) => v + b[i] * s);
  const k1 = f(y,                dt, p);
  const k2 = f(add(y, k1, dt/2), dt, p);
  const k3 = f(add(y, k2, dt/2), dt, p);
  const k4 = f(add(y, k3, dt),    dt, p);
  return y.map((v, i) =>
    v + (k1[i] + 2*k2[i] + 2*k3[i] + k4[i]) * dt / 6
  );
}

// Виправляємо rk4Step, щоб передати правильну сигнатуру
function rk4StepFixed(y, dt, p) {
  const add = (a, b, s) => a.map((v, i) => v + b[i] * s);
  const k1 = seir(y,                p);
  const k2 = seir(add(y, k1, dt/2), p);
  const k3 = seir(add(y, k2, dt/2), p);
  const k4 = seir(add(y, k3, dt),    p);
  return y.map((v, i) =>
    v + (k1[i] + 2*k2[i] + 2*k3[i] + k4[i]) * dt / 6
  );
}

// ── Запуск симуляції на 365 днів ───────────────────────────────────
function runSEIR(p, days = 365, dt = 0.25) {
  const results = [];
  let y = [p.N - 1, 0, 1, 0];  // S, E, I=1 початковий, R
  for (let t = 0; t <= days; t += dt) {
    results.push({ t, S: y[0], E: y[1], I: y[2], R: y[3] });
    y = rk4StepFixed(y, dt, p);
  }
  return results;
}

// Обчислюємо R₀ та поріг колективного імунітету
const R0     = params.beta / params.gamma;        // 0.3 / 0.1 = 3
const herd   = 1 - 1 / R0;                       // ≈ 0.667 = 66.7%
const result = runSEIR(params);
const peak   = result.reduce((mx, r) => r.I > mx.I ? r : mx, result[0]);
console.log(`R₀ = ${R0.toFixed(2)} | колективний імунітет = ${(herd*100).toFixed(1)}%`);
console.log(`Пік I = ${(peak.I/params.N*100).toFixed(2)}% від N на день ${peak.t.toFixed(0)}`);

Побудова графіка за допомогою Canvas 2D

function plotSEIR(canvas, results, N) {
  const ctx = canvas.getContext('2d');
  const { width: W, height: H } = canvas;
  ctx.clearRect(0, 0, W, H);

  const pad = { l: 50, r: 20, t: 20, b: 40 };
  const cw = W - pad.l - pad.r;
  const ch = H - pad.t - pad.b;

  const px = t  => pad.l + (t / results.at(-1).t) * cw;
  const py = v  => pad.t + ch - (v / N) * ch;

  const lines = [
    { key: 'S', color: '#60a5fa', label: 'Сприйнятливі'  },
    { key: 'E', color: '#f59e0b', label: 'Експоновані'      },
    { key: 'I', color: '#f97316', label: 'Інфекційні'   },
    { key: 'R', color: '#22c55e', label: 'Вибулі'      },
  ];

  for (const { key, color } of lines) {
    ctx.beginPath();
    ctx.strokeStyle = color;
    ctx.lineWidth   = 2;
    results.forEach((r, idx) => {
      idx === 0 ? ctx.moveTo(px(r.t), py(r[key]))
                 : ctx.lineTo(px(r.t), py(r[key]));
    });
    ctx.stroke();
  }
}

7. Розширення: вітальна динаміка, стохастичність, просторове поширення

SIR із вітальною динамікою

Додавання коефіцієнта народжуваності μ (рівного коефіцієнту смертності для сталого N) дає ендемічну рівновагу — збудник зберігається невизначено довго й коливається. Ендемічна рівновага становить S* = N/R₀, I* = μN(1 − 1/R₀)/γ.

Модель SIRS — згасання імунітету

Якщо імунітет згасає зі швидкістю ξ, одужалі індивіди повертаються до S. Це актуально для коронавірусів і грипу: R → S зі швидкістю ξ·R. Система може циклити, породжуючи сезонні хвилі, що спостерігаються при грипі.

Стохастичні моделі

Детерміновані моделі дають усереднені траєкторії; реальні спалахи містять випадковість. Два підходи:

Просторове поширення та метапопуляційні моделі

Реальні епідемії поширюються мережею взаємопов'язаних субпопуляцій (міста, регіони). Метапопуляційна модель застосовує динаміку SIR у межах кожної ділянки й додає міжділянкове змішування через матрицю мобільності — використовується для моделювання пандемій, що поширюються авіасполученням (модель GLEaM, MIT/Гарвард).

Вплив втручань на R₀: соціальне дистанціювання зменшує ефективне β. Вакцинація переводить індивідів з S до R до експозиції, зменшуючи S/N. Противірусне лікування скорочує заразність, збільшуючи ефективне γ. Кожне з цих явищ безпосередньо відображається у формулі R₀ = βS/(γN).