Integral equation for macroscopic LIF population
Solving the integral equation ($N\to\infty$)
Microscopic model
We consider here an infinitely large population of unconnected LIF neurons with escape noise. Between spikes the membrane potential of neuron $i$ obeys: \(\tau_m\frac{du_i}{dt}=-u_i+I(t).\) Given $u_i(t)$ at time $t$, neuron $i$ fires a spike stochastically with conditional intensity \(\rho_i(t)=c\exp\left(\frac{u_i(t)-\vartheta}{\Delta_u}\right).\) Immediately after a spike a neuron is reset to $u_r=0$ and clamped at this potential for an absolute refractory period $t_{ref}$.
%matplotlib inline
from pylab import *
tref=0.001 #in sec
taum=0.02
mu= 20.
c=10.
du=1.
vth=10.
def hazard(u):
return c*exp((u-vth)/du)
Macroscopic model
\(A(t)=\int_{-\infty}^t\rho(t|\hat{t})S(t|\hat{t})A(\hat{t})\,d\hat{t},\qquad \text{$A(t)=\delta(t)$ for $t\le 0$}\) The integral is discretized and solved forward in time with time step $dt$.
def solve(tmax,dt,I):
Nt=int(tmax/dt+0.5)
T=5*taum #max ISI, in sec
kmax=int(T/dt+0.5)
tauv=dt*np.arange(kmax+1)
rho=zeros(kmax+1)
n=zeros(Nt) #A(t)* dt
m=zeros(kmax+1) #refractory states, age vector
m[1]=1.
ufree=mu
mfree=0.
rhofree=hazard(ufree)
u=zeros(kmax+1)
kref=int(tref/dt+0.5)
for i in range(Nt):
mfree += m[kmax]
for k in range(kmax)[::-1]:
if tauv[k]>=tref:
u[k+1]=u[k]+dt*(-u[k]+I[i])/taum
rho_new=hazard(u[k+1])
Pfire = 1-exp(-0.5*(rho[k]+rho_new)*dt)
rho[k+1]=rho_new
dm = Pfire * m[k] #spike contribution from bin k
m[k+1] = m[k]-dm
n[i] += dm
else:
m[k+1]=m[k]
ufree += (-ufree + I[i])*dt/taum
rhofree_new=hazard(ufree)
dmfree= (1-exp(-0.5*(rhofree+rhofree_new)*dt)) * mfree
rhofree = rhofree_new
mfree -= dmfree
n[i] += dmfree
m[0] = n[i]
return n/dt
We can now solve the model:
dt=0.001
tmax=0.5 #simulation time
Nt=int(tmax/dt+0.5)
tv=dt* np.arange(Nt)
I = mu*np.ones(Nt)+10*(tv>0.3)-20*(tv>0.4)
A = solve(tmax, dt,I)
and plot the population activity
figure(1)
clf()
plot(tv,A,label='population act.')
plot(tv,I,'r',label='Stimulus [mV]')
xlabel('t [s]')
ylabel('A [Hz]')
legend(loc=0)
<matplotlib.legend.Legend at 0x7efc6d987410>
Problem: Compute analytical prediction of stationary firing rate (e.g., in order to check the simulation)
def get_singleneuron_rate_theory(mu,V_th,V_reset,t_ref,tau_m, delta_u,rho_0):
tmax=0.
dt=0.0001
S_end=1
while (S_end>0.001 and tmax<10.):
tmax=tmax+1 #max ISI, in sec
t=np.arange(0,tmax,dt)
K=len(t)
S=np.ones(K)
v=mu+(V_reset-mu) * np.exp(-(t-t_ref)/tau_m)
rho=rho_0*np.exp((v-V_th)/delta_u)*(t>t_ref)
S=np.exp(-np.cumsum(rho)*dt)
S_end=S[-1]
return 1./(np.sum(S)*dt)
print(get_singleneuron_rate_theory(mu,vth,0,tref,taum, du,c))
44.49762905220395
Problem: How does the time-dependent response to the stimulus change when the noise is increased?