本記事では、連続時間ニューロンの一種であるフィッツヒュー-南雲モデルについて実装コードも含めて紹介していきます。
フィッツヒュー-南雲モデル
フィッツヒュー-南雲モデル(FitzHugh-Nagumo model)とは、神経細胞の活動電位変化を2つの微分方程式で表現した膜電位モデルで、4つの微分方程式で膜電位をモデル化したHodgkin Huxleyモデルの下位互換となっています。
2つの変数\(u, v\)に関する微分方程式で表されます。
$$\begin{eqnarray}
\frac{du}{dt} &=& c\left(u - \frac{u^3}{3} - v + I_{inj}(t) \right)\\
\frac{dv}{dt} &=& u - bv + a
\end{eqnarray}$$
ここで、パラメータ\(a, b, c\)は0.7, 0.8, 10が一般的に使用されます。
PythonによるFHNモデルの実装
class FitzHughNagumo:
"""Full Hodgkin-Huxley Model implemented in Python"""
def __init__(self, dt=0.01, a=0.7, b=0.8, c=10):
self.dt = dt # default 0.01
self.a = a # default 0.7
self.b = b # default 0.8
self.c = c # default 10
self.u = 2
self.v = 1
def step(self, I_inj=0):
self.u += self.c * (self.u - self.u**3/3 - self.v + I_inj) * self.dt # u <- u + du
self.v += (self.u - self.b * self.v + self.a) * self.dt # v <- v + dv
return self.u
さまざまな入力電流に対する膜電位変化
以下のコードで入力電流の配列を作成し、フィッツヒュー-南雲モデルに入力し、結果を配列resに格納した。これをPlotlyで可視化したものを以下に示します。
FHN = FitzHughNagumo()
# 入力ま電流が0.33の場合
def generate_I_inj(t):
return 0.33 * np.ones(len(t))
t = np.arange(0, 10000)
I_inj = generate_I_inj(t)
res = []
for i in I_inj:
res.append(FHN.step(i))
\(I_{inj}=0\)のとき
\(u, v\)の初期値の関係で、最初にスパイクが発生していますが、それ以外では、静止膜電位に落ち着いています。
\(I_{inj}=0.33\)のとき
上と同様に\(u, v\)の初期値の影響で、最初に大きなスパイクが発生しているが、その後に、減衰振動が見られます。
\(I_{inj}=0.34\)のとき
入力電流が0.33と0.34では振る舞いに大きな違いがあります。0.34では、常に振動しています。
\(I_{inj}=1\)のとき
0.34を境にして連続スパイクが発生する振る舞いに移り、その後は、入力電流の大きさに応じて、スパイク頻度が変化します。そのため、\(I_{inj}\)が1のときは、0.34のときと比べ、頻度が高くなっています。