You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将漏积分-发放模型从欧拉法迁移至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:52:40