پرش به محتویات

غشای غیرفعال: مدارِ RC

در فصلِ پتانسیل استراحت دیدیم که غشا در حالتِ استراحت چه ولتاژی دارد. اکنون می‌پرسیم: اگر جریانی به سلول تزریق کنیم، ولتاژ چگونه در زمان پاسخ می‌دهد؟ تا وقتی کانال‌های وابسته به ولتاژ خاموش‌اند (یعنی زیرِ آستانه)، پاسخِ غشا شگفت‌آور ساده است: غشا مانندِ یک مدارِ الکتریکیِ RC رفتار می‌کند. این ساده‌ترین و پرکاربردترین مدلِ نورون است و — همان‌طور که خواهیم دید — استخوان‌بندیِ همهٔ مدل‌های پیچیده‌ترِ فصل‌های بعد نیز هست.

در پایانِ این فصل خواهید توانست
  • غشا را با یک خازن، یک مقاومتِ نشتی و یک باتری مدل کنید.
  • معادلهٔ موازنهٔ جریان را بنویسید و آن را به‌صورتِ عددی حل کنید.
  • ثابتِ زمانیِ \(\tau=R_mC_m\) را تعریف کنید و از روی پاسخِ پله‌ای بخوانید.
  • توضیح دهید چرا غشا یک صافیِ پایین‌گذر است و بسامدِ برشِ آن را بیابید.

غشا یک مدارِ RC است

دولایهٔ لیپیدی یک عایقِ نازک میانِ دو محلولِ رساناست، و هر عایقی که میانِ دو رسانا قرار گیرد یک خازن می‌سازد. پس غشا یک ظرفیتِ خازنیِ \(C_m\) دارد و می‌تواند بار را روی دو سطحِ خود نگه دارد. در کنارِ آن، کانال‌های نشتی مسیرهایی برای عبورِ بار فراهم می‌کنند و نقشِ یک مقاومتِ \(R_m\) (یا رساناییِ \(g_L=1/R_m\)) را بازی می‌کنند؛ و چون هر دسته کانال یک پتانسیلِ تعادل دارد، یک باتریِ \(E_L\) نیز در این شاخه هست. بنابراین کوچک‌ترین مدلِ غشا، یک خازن به‌موازاتِ یک شاخهٔ مقاومت–باتری است.

Image title

مدلِ مداریِ ساده‌شدهٔ غشا: خازنِ \(C_m\) به‌موازاتِ یک شاخهٔ نشتی شاملِ مقاومتِ \(R_m\) و باتریِ \(E_L\).

معادلهٔ موازنهٔ جریان

قانونِ پایستگیِ بار همه‌چیز را تعیین می‌کند: جریانی که به غشا می‌رسد یا بارِ خازن را تغییر می‌دهد یا از شاخهٔ نشتی می‌گذرد. جریانِ خازنی \(C_m\,\frac{dV}{dt}\) و جریانِ نشتی \(g_L(V-E_L)\) است، پس با جریانِ تزریقیِ \(I_{\text{ext}}\):

\[ C_m\,\frac{dV_m}{dt} = -\,g_L\,(V_m - E_L) + I_{\text{ext}}. \]

این معادله، استخوان‌بندیِ همهٔ مدل‌های نورونیِ این کتاب است. مدلِ هاجکین–هاکسلی، مدل‌های ساده‌شده و حتی مدل‌های جمعیتی، همگی شکل‌هایی از همین موازنه‌اند؛ تنها چیزی که عوض می‌شود، توصیفِ جریان‌های یونی است. اینجا ساده‌ترین حالت را داریم: یک جریانِ نشتیِ خطی.

حلِ عددیِ این معادله با همان روشِ اویلرِ پیشرو چند خط بیش نیست:

import numpy as np

# passive (leaky) membrane:  C dV/dt = -g_L (V - E_L) + I_ext
C   = 100.0        # pF
g_L = 10.0         # nS      ->  tau = C / g_L = 10 ms
E_L = -70.0        # mV
tau = C / g_L      # ms

def simulate(I_ext, T=160.0, dt=0.05, V0=E_L):
    """Forward-Euler integration of the passive membrane; I_ext(t) in pA."""
    t = np.arange(0, T, dt)
    V = np.empty_like(t); V[0] = V0
    for n in range(len(t) - 1):
        dV = (-g_L * (V[n] - E_L) + I_ext(t[n])) / C
        V[n + 1] = V[n] + dV * dt
    return t, V

step = lambda tt: 120.0 if 20 <= tt < 90 else 0.0     # a 120 pA current step
t, V = simulate(step)

پاسخ به پلهٔ جریان و ثابتِ زمانی

برای یک جریانِ ثابتِ \(I_0\)، معادله یک جوابِ دقیقِ نمایی دارد. اگر سلول از \(E_L\) آغاز کند:

\[ V_m(t) = E_L + I_0 R_m\left(1 - e^{-t/\tau}\right),\qquad \tau = R_m C_m = \frac{C_m}{g_L}. \]

دو نکته: نخست، ولتاژِ پایا برابرِ \(V_\infty = E_L + I_0 R_m\) است — یعنی پاسخ با جریان خطی است (قانونِ اهم). دوم، سرعتِ رسیدن به این مقدار را ثابتِ زمانیِ \(\tau\) تعیین می‌کند: پس از یک \(\tau\)، ولتاژ ۶۳٪ راه را رفته است. مقدارِ نوعیِ \(\tau\) چند تا چند ده میلی‌ثانیه است و همین، مقیاسِ زمانیِ پاسخ‌های زیرآستانهٔ نورون را مشخص می‌کند.

Image title

پاسخِ غشای غیرفعال به یک پلهٔ جریان. بالا: جریانِ تزریقی. پایین: ولتاژ به‌صورتِ نمایی به سمتِ \(V_\infty=E_L+I_0R_m\) بالا می‌رود و پس از قطعِ جریان، نمایی به \(E_L\) بازمی‌گردد. نقطهٔ آبی، لحظهٔ \(t=\tau\) را نشان می‌دهد که در آن ولتاژ ۶۳٪ راه را پیموده است.

پس از قطعِ جریان، ولتاژ با همان \(\tau\) به استراحت بازمی‌گردد. توجه کنید که غشا هیچ حافظه‌ای فراتر از \(\tau\) ندارد: هر رویدادِ ورودی پس از چند \(\tau\) کاملاً فراموش می‌شود. همین ویژگی، غشای غیرفعال را به یک انباشتگرِ نشت‌دار (leaky integrator) بدل می‌کند — ایده‌ای که مستقیماً به مدلِ نورونِ یکپارچه‌و‌شلیک می‌انجامد.

غشا یک صافیِ پایین‌گذر است

اگر به‌جای یک پله، جریانی نوسانی با بسامدِ \(f\) تزریق کنیم، همان معادلهٔ خطی می‌گوید که ولتاژ نیز با همان بسامد نوسان می‌کند، اما با دامنه‌ای که به بسامد بستگی دارد. بهرهٔ دستگاه (نسبتِ دامنهٔ ولتاژ به دامنهٔ جریان) چنین است:

\[ |H(f)| = \frac{R_m}{\sqrt{1 + (2\pi f\,\tau)^2}}. \]

برای بسامدهای کوچک (\(2\pi f\tau \ll 1\)) بهره ثابت و برابرِ \(R_m\) است؛ اما برای بسامدهای بزرگ، خازن «فرصتِ» شارژ‌شدن نمی‌یابد و بهره مانندِ \(1/f\) افت می‌کند. مرزِ این دو رژیم، بسامدِ برش \(f_c = 1/(2\pi\tau)\) است. به‌بیانِ دیگر، غشا یک صافیِ پایین‌گذر است: تغییراتِ آهسته را می‌گذراند و تغییراتِ تندِ ورودی را صاف می‌کند.

Image title

غشا به‌مثابهٔ صافیِ پایین‌گذر. چپ: پاسخ به سه جریانِ نوسانیِ هم‌دامنه با بسامدهای متفاوت؛ هرچه بسامد بالاتر، دامنهٔ ولتاژ کوچک‌تر. راست: منحنیِ بهره بر حسبِ بسامد؛ زیرِ بسامدِ برشِ \(f_c\approx16\) هرتز بهره تقریباً ثابت است و بالای آن مانندِ \(1/f\) افت می‌کند.

# amplitude of the subthreshold voltage response to a sinusoidal current, vs frequency
freq = np.logspace(-0.3, 3, 400)               # Hz
gain = 1.0 / np.sqrt(1 + (2*np.pi*freq*tau/1000)**2)   # tau in ms -> /1000
f_c  = 1000.0 / (2*np.pi*tau)                   # cutoff frequency in Hz  (≈ 16 Hz)

این «پایین‌گذر بودن» پیامدهای مهمی برای پردازشِ اطلاعات دارد: نورون به‌تنهایی نمی‌تواند به تغییراتِ بسیار سریعِ ورودی پاسخِ زیرآستانه بدهد، و همین، یکی از دلایلی است که چرا اطلاعاتِ سریع در مغز اغلب با زمان‌بندیِ اسپایک‌ها کدگذاری می‌شود، نه با ولتاژِ زیرآستانه.


تمرین‌ها

هر تمرین با کدِ simulate همین فصل حل می‌شود. نخست خودتان بنویسید، سپس پاسخ را باز کنید.

تمرینِ ۱

قانونِ اهم. با کدِ simulate، پاسخِ پله‌ای را برای سه جریانِ \(I_0=60,120,240\) پیکوآمپر رسم کنید. نشان دهید که \(V_\infty-E_L\) با \(I_0\) خطی است و شیبِ آن \(R_m=1/g_L\) است.

پاسخ
for I0 in [60, 120, 240]:                      # pA
    t, V = simulate(lambda tt: I0 if 20 <= tt < 140 else 0.0)
    Vinf = V[t < 140][-1]                       # steady value before the step ends
    print(I0, round(Vinf - E_L, 2), "mV")       # 6, 12, 24 mV  -> linear

با \(g_L=10\) نانوزیمنس، \(R_m=1/g_L=100\) مگا‌اهم. پس \(V_\infty-E_L = I_0 R_m\): برای \(120\) پیکوآمپر برابرِ \(12\) میلی‌ولت. اگر \(V_\infty-E_L\) را بر حسبِ \(I_0\) رسم کنید یک خطِ راست با شیبِ \(R_m\) می‌گیرید — همان قانونِ اهم برای غشای زیرآستانه.

تمرینِ ۲

اندازه‌گیریِ \(\tau\). از یک شبیه‌سازیِ پله‌ای، ثابتِ زمانی را به‌صورتِ عددی برآورد کنید (زمانی که ولتاژ به ۶۳٪ مقدارِ نهایی می‌رسد) و با \(C/g_L\) بسنجید.

پاسخ
import numpy as np
t, V = simulate(lambda tt: 120.0 if tt >= 20 else 0.0)
V0, Vinf = E_L, V[-1]
target = V0 + 0.63*(Vinf - V0)                  # 63% of the way up
i = np.argmax((t >= 20) & (V >= target))
print("tau (measured) =", round(t[i] - 20, 2), "ms   vs  C/gL =", C/g_L)

زمانِ رسیدن به ۶۳٪ حدودِ \(10\) میلی‌ثانیه است، دقیقاً برابرِ \(\tau = C/g_L = 100/10 = 10\) میلی‌ثانیه. این روش، همان کاری است که یک الکتروفیزیولوژیست روی داده‌های واقعیِ پاسخِ پله‌ای انجام می‌دهد.

تمرینِ ۳

صافی. غشا را با جریان‌های نوسانیِ هم‌دامنه در بسامدهای گوناگون بِرانید، دامنهٔ ولتاژِ پایا را اندازه بگیرید، و منحنیِ بهره را بازتولید کنید. تأیید کنید که در \(f_c=1/(2\pi\tau)\) بهره به \(1/\sqrt2\) برابرِ مقدارِ کم‌بسامد افت می‌کند.

پاسخ
import numpy as np
def gain(f_hz, A=50.0):
    t, V = simulate(lambda tt: A*np.sin(2*np.pi*f_hz*tt/1000), T=400.0)
    tail = V[t > 200]                           # ignore the transient
    return (tail.max() - tail.min()) / 2        # voltage amplitude
f = np.logspace(0, 2.5, 20)
g = np.array([gain(fi) for fi in f])
fc = 1000/(2*np.pi*(C/g_L))                      # ~16 Hz
print("gain(fc)/gain(low) =", round(gain(fc)/g[0], 3))   # ~0.707 = 1/sqrt(2)

منحنیِ بهره در بسامدهای پایین تخت است و بالای \(f_c\approx16\) هرتز مانندِ \(1/f\) افت می‌کند؛ درست در \(f_c\) بهره به \(1/\sqrt2\approx0.707\) برابرِ مقدارِ کم‌بسامد می‌رسد — تعریفِ استانداردِ بسامدِ برش. این تأیید می‌کند که غشا یک صافیِ پایین‌گذرِ مرتبهٔ اول است.

تمرینِ ۴

انباشتگرِ نشت‌دار (LIF). به مدل یک آستانه بیفزایید: هرگاه \(V_m\) از یک مقدارِ آستانه گذشت، یک «اسپایک» ثبت کنید و \(V_m\) را به \(E_L\) بازنشانی کنید. بسامدِ شلیک را بر حسبِ جریانِ ثابت رسم کنید.

پاسخ
import numpy as np
def lif_rate(I0, Vth=-50.0, T=1000.0, dt=0.05):
    n = int(T/dt); V = E_L; spikes = 0
    for _ in range(n):
        V += (-g_L*(V - E_L) + I0)/C * dt
        if V >= Vth:                             # threshold crossed
            spikes += 1; V = E_L                 # emit spike and reset
    return spikes / (T/1000)                     # Hz
for I0 in [100, 150, 200, 300]:
    print(I0, "pA ->", round(lif_rate(I0), 1), "Hz")

زیرِ یک جریانِ بحرانی (که در آن \(V_\infty=E_L+I_0R_m\) تازه به آستانه می‌رسد) نورون هرگز شلیک نمی‌کند؛ بالای آن، بسامد با جریان بالا می‌رود و به‌شکلِ مشخصهٔ f-I درمی‌آید. این ساده‌ترین مدلِ نورونِ شلیک‌کننده است — پلی مستقیم از غشای غیرفعالِ این فصل به مدل‌های نورونیِ فصل‌های بعد.