单个神经元模拟
以Brian2官方文档为例,先模拟一个简单的单神经元行为,其电压微分方程为:
d
v
d
t
=
1
−
v
τ
\frac{dv}{dt} = \frac{1-v}{\tau}
dtdv=τ1−v
代码实现如下,设置阈值电压为0.8,复位电压为0,不应期为5ms,时间常数
τ
\tau
τ为10ms,具体每行代码的解释见注释。
from brian2 import *
import matplotlib.pyplot as plt
# Starts a new scope for magic functions
start_scope()
tau = 10*ms
# 方程两端的单位必须统一
# :1 表示v的单位,是国际单位
# (unless refractory)表示有不应期
eqs = '''
dv/dt = (1-v)/tau : 1 (unless refractory)
'''
# 第一个变量时神经元数量,第二个变量是微分方程
# threshold 是阈值电压,reset是复位电压,refractory是不应期时间,method是数值积分方法
G = NeuronGroup(1, eqs, threshold='v>0.8', reset='v=0', refractory=5*ms, method='exact')
# record表示距离NeuronGroup中的神经元范围,True表示全部,也可用range表示
M = StateMonitor(G, 'v', record=True)
# 脉冲监测器
spikemon = SpikeMonitor(G)
# 第0个神经元的v信号的初始值
print('Before v = %s' % G.v[0])
# 开始仿真
run(50*ms)
# 获取所有发放脉冲的时间
print('Spike times: %s' % spikemon.t[:])
# 绘制神经元电压-时间图像
plot(M.t/ms, M.v[0])
# 绘制脉冲发放时间
# ls:line style, c:color, lw: line width
for t in spikemon.t:
axvline(t/ms, ls='--', c='C1', lw=3)
xlabel('Time (ms)')
ylabel('v')
plt.show()
得到结果如下:
终端输出为:
Before v = 0.0
Spike times: [16. 37.] ms