Проверка рефрактерности на нейроне LIF
Проверка рефрактерности (время когда нейрон не может спайковать) на нейроне LIF (leaky integrate and fire)¶
Если подать напряжение через 4 ms после основного спайка на 50ms, то не будет последующего спайка
if defaultclock.t == stimulus_time + 4*ms:
neuron.v = v_threshold + 1*mV
а если подать напряжение через 5 ms после основного спайка на 100ms, то будет последующего спайк
if defaultclock.t == stimulus_time + 5*ms:
neuron.v = v_threshold + 1*mV
In [1]:
from brian2 import *
import plotly.graph_objects as go
# Определение параметров модели
start_scope()
tau = 20*ms # Постоянная времени
v_rest = -65*mV # Потенциал покоя
v_reset = -70*mV # Потенциал сброса
v_threshold = -50*mV # Порог генерации спайка
refractory_period = 5*ms # Рефрактерный период
# Определение уравнений мембранного потенциала
# Добавлен входной ток I
equations = '''
dv/dt = (v_rest - v) / tau : volt
'''
# Создание нейрона
neuron = NeuronGroup(1, model=equations, threshold='v > v_threshold', reset='v = v_reset',
refractory=refractory_period, method='exact')
# Инициализация мембранного потенциала
neuron.v = v_rest
# Генерация единственного спайка
stimulus_time = 50*ms
stimulus_time2 = 100*ms
@network_operation
def input_stimulus():
if defaultclock.t == stimulus_time:
neuron.v = v_threshold + 1*mV
if defaultclock.t == stimulus_time + 4*ms:
neuron.v = v_threshold + 1*mV
if defaultclock.t == stimulus_time2:
neuron.v = v_threshold + 1*mV
if defaultclock.t == stimulus_time2 + 5*ms:
neuron.v = v_threshold + 1*mV
# Мониторинг
state_monitor = StateMonitor(neuron, 'v', record=True)
spike_monitor = SpikeMonitor(neuron)
# Запуск симуляции
run(200*ms)
# Проверка наличия спайков
print("Времена спайков:", spike_monitor.t / ms)
# Построение графиков с использованием Plotly
fig1 = go.Figure()
fig1.add_trace(go.Scatter(x=state_monitor.t / ms,
y=state_monitor.v[0] / mV,
mode='lines',
name='Мембранный потенциал'))
fig1.add_hline(y=v_rest / mV, line_dash="dash", line_color="blue", name="$v_{rest}$ (Потенциал покоя)")
fig1.add_hline(y=v_reset / mV, line_dash="dash", line_color="green", name="$v_{reset}$ (Потенциал сброса)")
fig1.add_hline(y=v_threshold / mV, line_dash="dash", line_color="red", name="$v_{threshold}$ (Порог спайка)")
fig1.update_layout(
title="Динамика мембранного потенциала нейрона (постоянный вход)",
xaxis_title="Время (мс)",
yaxis_title="Потенциал мембраны (мВ)",
xaxis=dict(range=[0, 200]),
template="plotly_white"
)
fig2 = go.Figure()
fig2.add_trace(go.Scatter(x=spike_monitor.t / ms,
y=[0]*len(spike_monitor.t),
mode='markers',
marker=dict(symbol='circle', size=10, color='red'),
name='Спайки'))
fig2.update_layout(
title="Спайки нейрона",
xaxis_title="Время (мс)",
xaxis=dict(range=[0, 200]),
yaxis=dict(title="Номер нейрона", range=[-0.5, 0.5]),
template="plotly_white"
)
# Отображение графиков
fig1.show()
fig2.show()
Времена спайков: [ 50. 100. 105.]
In [ ]: