如何将漏积分-发放模型从欧拉法迁移至Python ODE求解器?
用solve_ivp实现LIF模型的硬重置问题
我已经通过带for循环的欧拉法完成了漏积分-发放(LIF)模型的实现,代码如下:
import numpy as np import matplotlib.pyplot as plt # 定义参数 tau_m = 10 # 膜时间常数 (ms) v_rest = -70 # 静息膜电位 (mV) v_thresh = -55 # 放电阈值 (mV) v_reset = -80 # 重置电位 (mV) i_e = 3 # 输入电流 (nA) dt = 0.1 # 时间步长 (ms) t_max = 100 # 模拟时长 (ms) # 初始化变量 v = v_rest # 膜电位 (mV) # 模拟LIF模型 for t in np.arange(0, t_max, dt): dv_dt = (-(v - v_rest) + i_e) / tau_m # 膜电位微分方程 v += dv_dt * dt # 更新膜电位 if v >= v_thresh: # 放电条件 v = v_reset # 重置膜电位
目前我需要将LIF模型整合到一个基于solve_ivp实现的更大规模模型中,已经完成了膜电位微分项(dv_dt)的定义,代码如下:
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import solve_ivp # 定义LIF模型 def lif(t, y, tau_m, v_rest, v_thresh, v_reset, i_e): dv_dt = (-(y - v_rest) + i_e) / tau_m # 膜电位微分方程 return dv_dt # 定义参数 tau_m = 10 # 膜时间常数 (ms) v_rest = -70 # 静息膜电位 (mV) v_thresh = -55 # 放电阈值 (mV) v_reset = -80 # 重置电位 (mV) i_e = 3 # 输入电流 (nA) t_span = (0, 100) # 模拟时长范围 (ms) y0 = v_rest # 初始膜电位 (mV) # 模拟LIF模型 sol = solve_ivp(lambda t, y: lif(t, y, tau_m, v_rest, v_thresh, v_reset, i_e), t_span, [y0]) # 提取结果 t = sol.t v = sol.y[0]
但我不清楚如何实现去极化后的膜电位硬重置操作(即v = v_reset if v >= v_thresh的逻辑)。因为调用solve_ivp求解器时,模型函数仅能输出微分项dv_dt。我曾尝试通过以下方式修改dv_dt:
dv_dt = (v_reset - y) if y >= v_thresh else (-(y - v_rest) + i_e) / tau_m
希望通过调整dv_dt让下一次迭代中y值改变,但这种方法仅能降低膜电位,无法直接将其重置至v_reset。
内容的提问来源于stack exchange,提问作者OMS
相关产品推荐
相关产品推荐

