将函数合并到ODE集成中

2024-06-22 10:42:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题可能很简单,但就我的一生而言,我搞不懂。基本上,我有一个神经元,我正在模拟它的电压,但我让它随机接收来自其他神经元的输入尖峰。所以我的一个朋友帮助我们建立了一个函数,基本上是一些兴奋性神经元提供一个随机的泊松峰,随机增加电压,一些抑制性神经元提供向下的峰值,降低电压。我已经包括了下面的代码。基本上,我想弄清楚的步骤是如何使迭代步骤中的I\u syn项起作用。我通常认为只写I_syn[i-1],但这给了我一个错误:

'function' object has no attribute '__getitem__'. 

所以我相信这个问题很简单,但我不知道如何克服。如何让这个程序正确地迭代I_syn项,以便在代码中包含前面定义的函数的同时,执行ODE的基本迭代方案?这很重要,因为在不久的将来,我可能会有更复杂的神经元方程,所以最好事先编写函数,然后根据需要将它们调用到迭代步骤中。谢谢你

from numpy import *
from pylab import *

## setup parameters and state variables
T       = 50                  # total time to simulate (msec)
dt      = 0.125               # simulation time step (msec)
time    = arange(0, T+dt, dt) # time array
t_rest  = 0                   # initial refractory time

## LIF properties
Vm      = zeros(len(time))    # potential (V) trace over time
Rm      = 1                   # resistance (kOhm)
Cm      = 10                  # capacitance (uF)
tau_m   = Rm*Cm               # time constant (msec)
tau_ref = 4                   # refractory period (msec)
Vth     = 1                   # spike threshold (V)
V_spike = 0.5                 # spike delta (V)

## Stimulus
I       = 1.5                 # input current (A)
N = 1000
N_ex = 0.8*N #(0..79)
N_in = 0.2*N #(80..99)
G_ex = 0.1
K = 4

def I_syn(spks, t):
    """
    Synaptic current
    spks = [[synid, t],]
    """
    if len(spks) == 0:
        return 0

    exspk = spks[spks[:,0]<N_ex] # Check for all excitatory spikes
    delta_k = exspk[:,1] == t # Delta function
    if np.any(delta_k) > 0:
        h_k = np.random.rand(len(delta_k)) < 0.90 # probability of successful transmission
    else:
        h_k = 0

    inspk = spks[spks[:,0] >= N_ex] #Check remaining neurons for inhibitory spikes
    delta_m = inspk[:,1] == t #Delta function for inhibitory neurons
    if np.any(delta_m) > 0:
        h_m = np.random.rand(len(delta_m)) < 0.90
    else:
        h_m = 0

    isyn = C_m*G_ex*(np.sum(h_k*delta_k) - K*np.sum(h_m*delta_m))

    return  isyn

## iterate over each time step
for i, t in enumerate(time):
  if t > t_rest:
      Vm[i] = Vm[i-1] + (-Vm[i-1] + I_syn*Rm) / tau_m * dt
  if Vm[i] >= Vth:
    Vm[i] += V_spike
    t_rest = t + tau_ref

## plot membrane potential trace
plot(time, Vm)
title('Leaky Integrate-and-Fire Example')
ylabel('Membrane Potential (V)')
xlabel('Time (msec)')
ylim([0,2])
show()

Tags: forleniftimenpdtvmex
1条回答
网友
1楼 · 发布于 2024-06-22 10:42:16

I_syn只是一个函数,因此使用I_syn[i-1]将引发以下错误:

'function' object has no attribute '__getitem__'

如果您要查找的是函数的返回值,那么应该首先调用它,然后访问所需的内容

# pass related arguments as well since the function expects it
I_syn(arg1, arg2)[i-1]

相关问题 更多 >