1、HH神经元的电路图。
电池表示特定离子的平衡电势,电阻器反映通道对特定离子的渗透性。
电容代表的就是细胞膜,存储电荷,起到了电容的作用。
在这个公式中IL代表的是泄露电流,图中它的电路中就是一个电阻R和一个电源的分路,而Ik代表的是各个离子的电流,图中它所代表的电路是一个可变电阻R和一个电源,如RNa和Rk,Ic代表的通过电容器的电流,下面这个公式代表的是。
电流是指在单位时间里通过导体任一横截面的电量。
I = dq/dt = C(du/dt)
用这个公式计算瞬时电压变化。
电导g:在数值上等于电阻的倒数,导电率。
在这里引入3个门控变量,m、h、n,其中m和h控制的是Na离子的流通,而n控制的是K离子的流通。在这里,m、n、h所代表的就是某离子通道某时刻打开的概率,由不允许到允许转换的速率为αi(t),由允许到不允许状态转换的速率为βi(t),
各个门控变量的变化导数。
参数初始化,因为门控系数和当时的膜电势有关:
然后,根据门控系数和初始化的参数,求得当时电流。
步骤:
1、设置参数,包括平衡电势、电容、电阻、静息电位、最大电导、dt以及仿真时长
2、循环开始
更新α和β
若i为1,利用上述参数得到初始化mnh
根据mnh更新电导
计算各通道电流,得到-∑Ik(t)+I(t)
更新膜电势
根据膜电势更新mnh
HH方程python实现
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
# 参数定义 可参考
# 平衡电位
E_Na = 115.0 # [mV]
E_K = -12.0 # [mV]
E_L = 10.6 # [mV]# 最大电导
g_Na = 120.0 # [mS]
g_K = 36.0 # [mS]
g_L = 0.3 # [mS]dt = 0.01 # [ms]
T = 40 # [ms]img = cv.imread('t1.png')
stimu1us1 = img[:, :, 0]
stim1 = np.array([])
for i in range(0, 2):stim1 = np.hstack((stim1, stimu1us1[i]))
stim1 = stim1 / 25
t = np.arange(0,len(stim1), 1) # 循环次数,时间
V = np.zeros(len(stim1))
n = np.zeros(len(stim1))
m = np.zeros(len(stim1))
h = np.zeros(len(stim1))I_E = 0.0
V[0] = 0.0
h[0] = 0.59 # K离子通道系数
m[0] = 0.05 # Na离子通道系数
n[0] = 0.31 # Na离子通道系数# 在10ms是注入10mA的电流,然后15ms再次置电流为0
for i in range(1, len(stim1)): # 把上一个输出作为神经元的下一次输入if i == 1000:I_E = 10.0if i == 1500:I_E = 0.0# Calculate the alpha and beta functions (代码同上)# 计算α和β,分别代表从不允许到允许转换的速率和从允许到不允许转换的速率alpha_n = (0.1 - 0.01 * V[i - 1]) / (np.exp(1 - 0.1 * V[i - 1]) - 1)alpha_m = (2.5 - 0.1 * V[i - 1]) / (np.exp(2.5 - 0.1 * V[i - 1]) - 1)alpha_h = 0.07 * np.exp(-V[i - 1] / 20.0)beta_n = 0.125 * np.exp(-V[i - 1] / 80.0)beta_m = 4.0 * np.exp(-V[i - 1] / 18.0)beta_h = 1 / (np.exp(3 - 0.1 * V[i - 1]) + 1)# Calculate the time constants and steady state values# 打开通道的比例随时间变化tau_n = 1.0 / (alpha_n + beta_n)# 表示通道多久能打开inf_n = alpha_n * tau_ntau_m = 1.0 / (alpha_m + beta_m)inf_m = alpha_m * tau_mtau_h = 1.0 / (alpha_h + beta_h)inf_h = alpha_h * tau_h# 更新n,m,hn[i] = (1 - dt / tau_n) * n[i - 1] + (dt / tau_n) * inf_nm[i] = (1 - dt / tau_m) * m[i - 1] + (dt / tau_m) * inf_mh[i] = (1 - dt / tau_h) * h[i - 1] + (dt / tau_h) * inf_h# 公式四# 更新膜电位方程I_Na = g_Na * (m[i] ** 3) * h[i] * (V[i - 1] - E_Na)I_K = g_K * (n[i] ** 4) * (V[i - 1] - E_K)I_L = g_L * (V[i - 1] - E_L)# dv = -(I_Na + I_K + I_L - I_E)dv = stim1[i] - (I_Na + I_K + I_L) # 变化V[i] = V[i - 1] + dv * dt
print(len(m))
print(m)
plt.clf()
plt.subplot(1, 3, 1)
plt.plot(t, V)
# 膜电位变化
plt.title('Membrane potential')
plt.subplot(1, 3, 2)
plt.plot(t, n)
plt.plot(t, m)
plt.plot(t, h)
plt.title('Gating variables')
plt.legend(['n', 'm', 'h'])
plt.subplot(1, 3, 3)
plt.plot(t, g_Na * h * m ** 3)
plt.plot(t, g_K * n ** 4)
plt.title('Ionic currents')
plt.legend(['Na', 'K'])
plt.show()