如何在霍奇金赫胥黎神经元模型中克服被零除

计算科学 计算生物学 神经网络 神经科学
2021-12-01 14:29:52

我已经实现了 Hodgkin Huxley 模型,该模型在我的可视化中运行良好,我得到了尖峰等。然后我建立了一个有几千个神经元的网络,并经历了随机 NAN(不是数字)充斥网络;我可以追踪到钠和钾是如何更新的。例如

VoltageDelta = 膜电压 - 参考电压

AlphaNa = 0.01 * (VoltageDelta - 10.0) / (1.0 - exp( -(VoltageDelta-10.0) / 10.0))

如果电压增量恰好为 10,则 exp(0) 返回 1,最终除以零。我已经将我的实现与其他实现进行了比较,尽管对计算进行了一些重新排序,但似乎都存在这个缺陷。我还没有找到任何关于如何处理的信息。我可以添加一个检查并假设它是 0/0 -> 0,但我不确定接近 0 的值是否会导致数值不准确,我想知道这通常是如何处理的。(我研究了一些 github 实现,并没有看到特殊处理)。

编辑:您可以找到一些实现: https ://github.com/swharden/HHSharp/blob/master/src/HHSharp/HHModel.cs https://github.com/openworm/hodgkin_huxley_tutorial/blob/master/Tutorial/Source /霍奇金赫胥黎.py

原论文: https ://www.sfn.org/~/media/SfN/Documents/ClassicPapers/ActionPotentials/hodgkin5.ashx

1个回答

你有

AlphaNa = 0.1 * f(0.1*(VoltageDelta-10.0))

在哪里

f(x)=x1exp(x)
限制为x0实际上可以解释为差商,您也可以求助于 l'Hopital,发现f(x)1. 因此,如果您想安全起见,可以使用此功能的 3 层或 4 层实现

def f(x):
    if abs(x)<1e-12: return 1
    if abs(x)<1e-4: return -x/expm1(-x)
    if x<-20: ex = exp(x); return -x*ex/(1-ex)
    return x/(1-exp(-x))

原来的公式仍然可以产生不可表示的中间值,如果x是适度大的,所以exp(x)产生浮点溢出。这应该在除法中自动补偿,但要确保我添加了 case x < -20