参考原英文教程网址:https://brian2.readthedocs.io/en/stable/resources/tutorials/1-intro-to-brian-neurons.html
推荐一个不错的中文翻译教程:https://blog.csdn.net/u013751642/article/details/80918311
目录
4.加入不应期后,应在电压方程后备注(unless refractory)的说明
1. 内部电压V的微分方程的推导过程
微分方程:
其中,C为常数。
该响应曲线对应的情况为
此时函数曲线与输出响应曲线一致:
2. 内部电压初值V0与脉冲发放频率的函数关系
原文中输出了内部电压初值与脉冲发放频率的函数图像,下面对其进行分析。
原输出图像设置整个运行时间为1000ms,下面我们将运行时间缩小为100ms来观察局部的图像。
原代码中设置神经网络含有1000个神经元,将这些神经元从0-1000标号,并设置了内部电压初值 v0 与神经元索引值 i 成正比关系,也就是说 i 越大的神经元 v0 也越大。
先看左边的图,以一条平行线求取与曲线的交点,交点对应时刻就为各号神经元的点火时刻。可以看到神经元索引值 i 越小,对应的平行线与图像的交点越稀疏,意味着该神经元点火周期越大,也即点火频率越小。
说明:当,神经元始终不会发放脉冲,,随着阈值的增大,神经元发放脉冲的频率越高。
也可以通过公式来说明,v0越大,说明曲线上移的程度越大,也越快到达阈值v = 1,说明点火周期越小,点火频率越快。
进一步总结:当,神经元始终不会发放脉冲,,随着激励电压的增大,神经元发放脉冲的频率越高。
3. 动态阈值时的神经元内部状态变化
4.加入不应期后,应在电压方程后备注(unless refractory)的说明
start_scope()
tau = 10*ms
eqs = '''
dv/dt = (1-v)/tau : 1 (unless refractory) #意味着微分方程决定了v的表现除了耐熔期时其不起作用。
'''
G = NeuronGroup(1, eqs, threshold='v>0.8', reset='v = 0', refractory=5*ms, method='exact')
官方教程中给出了一个示例,并对其进行了分析:
start_scope()
tau = 5*ms
eqs = '''
dv/dt = (1-v)/tau : 1
'''
G = NeuronGroup(1, eqs, threshold='v>0.8', reset='v = 0', refractory=15*ms, method='exact')
statemon = StateMonitor(G, 'v', record=0)
spikemon = SpikeMonitor(G)
run(50*ms)
plot(statemon.t/ms, statemon.v[0])
for t in spikemon.t:
axvline(t/ms, ls='--', c='C1', lw=3)
axhline(0.8, ls=':', c='C2', lw=3)
xlabel('Time (ms)')
ylabel('v')
print("Spike times: %s" % spikemon.t[:])
第一个脉冲的表现是一样的:v上升到0.8,然后在8ms时刻神经元立即重置为0并激发了一个脉冲。此时设置的不应期为15ms,意味着神经元直到8+15=23ms都不会再激发脉冲。第一个脉冲过后的瞬间,v的值就立即开始上升,又由于我们没有在dv/dt的定义中指明(unless refractory)。一旦它在大约8ms的时间里到达值0.8(绿色虚线),即使阈值是v>0.8,它并不会激发一个脉冲。这是因为神经元在23ms之前仍处于不应期,直到23ms时在才激发一个脉冲。