2016-05-30 3 views
0

Этот вопрос, вероятно, очень прост, но для жизни меня я не могу понять. В принципе, у меня есть нейрон, напряжение которого я моделирую, но у меня есть случайное получение входных импульсов из других нейронов. Поэтому мой друг помог создать функцию, которая по существу имеет некоторые возбуждающие нейроны, обеспечивающие случайный скачок Пуассона, который увеличивает напряжение в случайном порядке, а некоторые ингибирующие нейроны обеспечивают нисходящие спайки, понижающие напряжение. Я включил код ниже. В основном, шаг, который я пытаюсь понять, как это сделать, - как заставить I_syn термин в итеративном шаге работать. Я обычно думаю, просто написать I_syn[i-1], но это дает мне ошибку:Включение функции в интеграцию ODE

'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() 

ответ

0

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] 
+0

Итак, я попробовал I_syn (spks, t) [i-1] и получил ошибку, что spks не определен. Я попытался использовать I_syn (t) [i-1], и я получаю: «I_syn() принимает ровно 2 аргумента (1 данный)». Я предполагаю, что лучшим вариантом является определение «spks», но я не уверен, как я должен это сделать должным образом для этой проблемы. – Brenton

+0

Кажется, вам нужно сначала понять основы. Когда вы передаете 'spks' в функции, он определен где-то уже или нет? Я думаю, это не так, и именно поэтому вы получаете эту ошибку. Сначала определите 'spks', как и ожидает функция. И затем вызовите функцию с ней в аргументы. – AKS

+0

Итак, я думаю, что понимаю, что вы говорите, но я не уверен, что функция ожидает spks, поскольку я предполагаю, что она действует как параметр в основном. Таким образом, spks должен быть в основном списком 1000 нейронов заранее и временем, когда они срабатывают (я считаю, что это так написано), но я не уверен, как определить, что вне функции (Извините, я реальный новичок в этом) – Brenton

Смежные вопросы