Біофізика · Обчислювальна нейронаука · ЗДР
📅 Квітень 2026 ⏱ ≈ 14 хв читання 🎯 Середній–Просунутий · Останнє оновлення: 28 травня 2026 р.

Нейрон Ходжкіна-Гакслі — потенціал дії з іонних струмів

У 1952 році Алан Ходжкін та Ендрю Гакслі опублікували набір з чотирьох зв'язаних звичайних диференціальних рівнянь, які відтворювали нервовий імпульс із базової фізики: закону Ома, застосованого до потенціал-залежних іонних каналів. Модель здобула Нобелівську премію, започаткувала обчислювальну нейронауку й досі є золотим стандартом для симуляції окремого нейрона. Ця стаття виводить рівняння з нуля та реалізує їх чистим JavaScript.

1. Нейрон як електричне коло

Плазматична мембрана розділяє заряд через свою товщину ~7 нм, діючи як конденсатор з ємністю Cm ≈ 1 мкФ/см². Іонні канали — білкові пори, що відкриваються й закриваються у відповідь на напругу — діють як потенціал-залежні резистори. Рушійна сила для кожного виду іонів — це різниця між мембранним потенціалом V та нернстівським (рівноважним) потенціалом E.

C_m · dV/dt = I_ext − I_Na − I_K − I_L

I_Na = g_Na · m³h · (V − E_Na) // натрієвий струм I_K = g_K · n⁴ · (V − E_K) // калієвий струм I_L = g_L · (V − E_L) // витоку (Cl⁻ + інше)

У своїх експериментах із фіксацією потенціалу на гігантських аксонах кальмара Ходжкін та Гакслі прямо виміряли провідності gNa та gK і отримали числові параметри, що відповідають даним. Набір параметрів нижче відтворює оригінальні результати 1952 року.

Стандартні параметри HH (гігантський аксон кальмара при 6,3°C):
Cm = 1 мкФ/см², g̅Na = 120 мСм/см², ENa = +50 мВ
K = 36 мСм/см², EK = −77 мВ
gL = 0.3 мСм/см², EL = −54.4 мВ
Потенціал спокою ≈ −65 мВ

2. Чотири рівняння Ходжкіна-Гакслі

Повна система — це чотири зв'язані ЗДР: одне для напруги V і три для ворітних змінних m, h, n — кожна з яких представляє ймовірність того, що певні ворота в білку іонного каналу перебувають у відкритому стані.

dV/dt = (1/C_m) · [I_ext − g̅_Na m³h(V−E_Na) − g̅_K n⁴(V−E_K) − g_L(V−E_L)]

dm/dt = α_m(V)(1−m) − β_m(V)·m dh/dt = α_h(V)(1−h) − β_h(V)·h dn/dt = α_n(V)(1−n) − β_n(V)·n

Кожна ворітна змінна підкоряється кінетиці першого порядку: вона релаксує до свого стаціонарного значення m(V) = α_m/(α_m + β_m) зі сталою часу τm(V) = 1/(α_m + β_m). Швидкості α та β — емпіричні функції V, підігнані до даних фіксації потенціалу.

Член m³ у INa відображає те, що натрієвий канал потребує одночасного відкриття трьох незалежних активаційних воріт. Множник h — це ворота інактивації: вони починають відкритими (~0,6), але закриваються в міру деполяризації мембрани, перекриваючи струм Na⁺ і завершуючи потенціал дії. Член n⁴ у IK відображає чотири однакові субодиниці.

3. Ворітні змінні m, h, n — альфа/бета-кінетика

Функції швидкості нижче дійсні, коли напруга V виміряна в мВ. Вони містять усувні сингулярності за певних напруг (коли знаменник → 0), які слід обробляти чисельно за правилом Лопіталя.

// Усі напруги в мВ; швидкості в мс⁻¹
// V — це відхилення від спокою: використовуйте V_shifted = V_membrane − (−65)

function alpha_m(V) {
  const dv = 10 - V;
  return Math.abs(dv) < 1e-7
    ? 1                                    // границя за Лопіталем
    : 0.1 * dv / (Math.exp(dv / 10) - 1);
}
function beta_m(V)  { return 4    * Math.exp(-V / 18); }

function alpha_h(V) { return 0.07 * Math.exp(-V / 20); }
function beta_h(V)  { return 1    / (Math.exp((30 - V) / 10) + 1); }

function alpha_n(V) {
  const dv = 10 - V;
  return Math.abs(dv) < 1e-7
    ? 0.1
    : 0.01 * dv / (Math.exp(dv / 10) - 1);
}
function beta_n(V)  { return 0.125 * Math.exp(-V / 80); }
Угода: оригінальна стаття HH використовує угоду відхилення від спокою, де V = 0 відповідає −65 мВ. Сучасні формулювання переходять до абсолютних мВ (потенціал спокою −65 мВ). Обидва правильні; просто будьте послідовними щодо того, яку форму α/β ви використовуєте.

4. Чисельне інтегрування з RK4

Потенціал дії триває ~1 мс, а найшвидша ворітна змінна (m) має τm ≈ 0,1 мс на порозі. Безпечний крок часу — dt = 0,01 мс. Метод Ейлера нестійкий для цієї системи за такого кроку; RK4 і стійкий, і має четвертий порядок точності.

function derivatives(V, m, h, n, Iext) {
  const INa = 120 * m**3 * h * (V - 50);
  const IK  =  36 * n**4     * (V + 77);
  const IL  = 0.3             * (V + 54.4);
  return {
    dV: Iext - INa - IK - IL,             // Cm = 1
    dm: alpha_m(V) * (1 - m) - beta_m(V) * m,
    dh: alpha_h(V) * (1 - h) - beta_h(V) * h,
    dn: alpha_n(V) * (1 - n) - beta_n(V) * n,
  };
}

function stepRK4(V, m, h, n, Iext, dt) {
  const k1 = derivatives(V, m, h, n, Iext);
  const k2 = derivatives(V + dt/2*k1.dV, m + dt/2*k1.dm,
                          h + dt/2*k1.dh, n + dt/2*k1.dn, Iext);
  const k3 = derivatives(V + dt/2*k2.dV, m + dt/2*k2.dm,
                          h + dt/2*k2.dh, n + dt/2*k2.dn, Iext);
  const k4 = derivatives(V + dt*k3.dV, m + dt*k3.dm,
                          h + dt*k3.dh, n + dt*k3.dn, Iext);
  return {
    V: V + dt/6 * (k1.dV + 2*k2.dV + 2*k3.dV + k4.dV),
    m: m + dt/6 * (k1.dm + 2*k2.dm + 2*k3.dm + k4.dm),
    h: h + dt/6 * (k1.dh + 2*k2.dh + 2*k3.dh + k4.dh),
    n: n + dt/6 * (k1.dn + 2*k2.dn + 2*k3.dn + k4.dn),
  };
}

5. Фази потенціалу дії

Подайте короткий струмовий імпульс (Iext = 10 мкА/см² протягом 0,5 мс), і мембранний потенціал пройде через чотири окремі фази:

① Спокій (~−65 мВ)

m ≈ 0,05, h ≈ 0,60, n ≈ 0,32. Вхідний струм Na⁺ та вихідний струм K⁺ перебувають у рівновазі.

② Наростання (−65 → +40 мВ)

Деполяризація швидко відкриває ворота m (τ_m ~ 0,1 мс). Масивний вхід Na⁺. h ще відкриті.

③ Пік (+30 до +40 мВ)

Ворота інактивації h закриваються, перекриваючи I_Na. Ворота n відкриваються, вихід K⁺ розпочинає реполяризацію.

④ Слідова гіперполяризація (≈ −75 мВ)

Ворота n закриваються повільно; коротка гіперполяризація нижче спокою. Рефрактерний період запобігає повторному збудженню.

Властивість «усе або нічого» виникає з порогу: слабкі стимули спричиняють підпорогову відповідь, що згасає; стимули вище ~−55 мВ запускають повний спайк. Це емерджентна властивість нелінійного зв'язку між m, h та V.

6. Повна реалізація на JavaScript

class HHNeuron {
  constructor() {
    this.V  = -10;   // відхилення від спокою: −65 мВ абсолютно → 0 тут
    this.m  = this._minf(this.V);
    this.h  = this._hinf(this.V);
    this.n  = this._ninf(this.V);
    this.dt = 0.01;   // мс
  }

  _alpha_m(V) { const d=10-V; return Math.abs(d)<1e-7 ? 1 : 0.1*d/(Math.exp(d/10)-1); }
  _beta_m(V)  { return 4    * Math.exp(-V/18); }
  _alpha_h(V) { return 0.07 * Math.exp(-V/20); }
  _beta_h(V)  { return 1    / (Math.exp((30-V)/10)+1); }
  _alpha_n(V) { const d=10-V; return Math.abs(d)<1e-7 ? 0.1 : 0.01*d/(Math.exp(d/10)-1); }
  _beta_n(V)  { return 0.125 * Math.exp(-V/80); }

  _minf(V) { const a=this._alpha_m(V); return a/(a+this._beta_m(V)); }
  _hinf(V) { const a=this._alpha_h(V); return a/(a+this._beta_h(V)); }
  _ninf(V) { const a=this._alpha_n(V); return a/(a+this._beta_n(V)); }

  _deriv(V, m, h, n, I) {
    return {
      dV: I - 120*m**3*h*(V-50) - 36*n**4*(V+77) - 0.3*(V+54.4),
      dm: this._alpha_m(V)*(1-m) - this._beta_m(V)*m,
      dh: this._alpha_h(V)*(1-h) - this._beta_h(V)*h,
      dn: this._alpha_n(V)*(1-n) - this._beta_n(V)*n,
    };
  }

  step(Iext = 0) {
    const dt = this.dt;
    let {V, m, h, n} = this;
    const k1 = this._deriv(V, m, h, n, Iext);
    const k2 = this._deriv(V+dt/2*k1.dV, m+dt/2*k1.dm, h+dt/2*k1.dh, n+dt/2*k1.dn, Iext);
    const k3 = this._deriv(V+dt/2*k2.dV, m+dt/2*k2.dm, h+dt/2*k2.dh, n+dt/2*k2.dn, Iext);
    const k4 = this._deriv(V+dt*k3.dV, m+dt*k3.dm, h+dt*k3.dh, n+dt*k3.dn, Iext);
    this.V = V + dt/6*(k1.dV+2*k2.dV+2*k3.dV+k4.dV);
    this.m = m + dt/6*(k1.dm+2*k2.dm+2*k3.dm+k4.dm);
    this.h = h + dt/6*(k1.dh+2*k2.dh+2*k3.dh+k4.dh);
    this.n = n + dt/6*(k1.dn+2*k2.dn+2*k3.dn+k4.dn);
    return this.V + (-65);  // перетворення в абсолютні мВ
  }
}

// Запускаємо 30-мс симуляцію з імпульсом 10 мкА/см² від t=1 до t=2 мс
const neuron = new HHNeuron();
const trace  = [];
for (let t = 0; t <= 30; t += 0.01) {
  const I = (t >= 1 && t <= 2) ? 10 : 0;
  trace.push({ t, V: neuron.step(I) });
}
// trace тепер містить [{ t: 0, V: -65 }, ..., { t: 5.2, V: +38 }, ...]

7. 2D-збудлива тканина та спіральні хвилі

Коли багато HH-нейронів зв'язані на сітці через щілинні контакти (дифузійний зв'язок), система стає збудливим середовищем. Напруга поширюється від збуджених клітин до сусідів у спокої: це серцева або кіркова хвиля. Кабельне рівняння додає дифузійний член до рівняння напруги:

C_m · ∂V/∂t = D∇²V − I_Na − I_K − I_L + I_ext

У 2D розірвана плоска хвиля закручується у повторно-входячу спіраль — обчислювальний аналог небезпечних серцевих аритмій, як-от фібриляція шлуночків. Кінчик спіралі обертається з періодом, що визначається рефрактерним часом тканини. Поперечнопольова стимуляція під час уразливого вікна може індукувати або припиняти спіралі.

Для простої реалізації кожна клітина — окремий HH-нейрон. Зв'язок додається як додатковий струм: I_diff = D × Σ(V_neighbour − V_self). Сітка 100×100 з D ≈ 0,5 см²/с та dt = 0,05 мс комфортно працює в реальному часі на сучасному обладнанні.

Подивіться в дії

Спостерігайте, як спалахують потенціали дії й виникають спіральні хвилі на 2D-сітці нейронної тканини — з налаштовуваною позицією стимулу, силою дифузії та зв'язком інгібітора.

Відкрити симуляцію →

8. Розширення та застосування

Фітцг'ю-Нагумо: спрощена модель

Для великомасштабних симуляцій тканини повна 4-змінна модель HH витратна. Модель Фітцг'ю-Нагумо зводить її до 2 змінних (швидкий активатор u, повільна змінна відновлення w), зберігаючи водночас збудливість і структуру біфуркацій. Вона працює у 4 рази швидше й схоплює спіральні хвилі, біжучі імпульси та коливання.

du/dt = u − u³/3 − w + I_ext dw/dt = ε · (u + a − b·w) // ε ≪ 1: повільне відновлення

Багатокомпартментні нейрони

Реальні нейрони не є точковими об'єктами. Дендритні дерева складаються з багатьох циліндричних компартментів, зв'язаних осьовим опором. Кабельне рівняння (компартментна модель Ралла) розглядає кожен сегмент як HH-подібну ділянку, з'єднану із сусідами провідністю gc = A/(Ra·Δx), даючи лінійну систему ЗДР, яку для стійкості можна розв'язувати неявними методами (Кранка-Ніколсон).

Стохастичні іонні канали

Окремі канали дискретні — вони або відкриваються, або закриваються — і їхня поведінка в малих нейронах імовірнісна. Стохастичний HH замінює ЗДР для m, h, n біноміальними оновленнями ланцюга Маркова, породжуючи канальний шум і спонтанне спайкування за підпорогових струмів. Це реалізується з переходами Binomial(N_channel, α·dt).