如何对 Python 中 solve_ivp 中的同时阈值交叉做出反应

How to react to simultaneous threshold crossings in solve_ivp in Python

我正在考虑一个神经系统,其中几个片段在一个维度上相连,并且片段 activity 的时间导数受相邻片段 activity 的影响。也就是说,设第i段的activity为E_i,可以表示为

dE_i/dt = f(a E_i(t) + b_{i-1}(t)E_{i-1}(t) + c_i(t)E_{i+1}(t)))

使用函数 f。 b 和 c 代表段之间的突触强度。 a 是常数,但 b 和 c 是随时间变化的。如果跨越突触的两个片段activity同时超过阈值,则修改b和c。

为了模拟这样的模型,我编写了以下代码。

import numpy as np
from scipy.integrate import solve_ivp

seg = 8

t0 =
tend = 
dt = 
threshold = 

x0 = [0]*seg

def event(t, x):
  ?

def model(t, x):
  ・
  ・
  ・
  return (dE)

While True:
  t_step = np.arange(t0, tend - dt, dt)
  solve = solve_ivp(model, [t0, tend], x0, t_eval = t_step, events = event)

  if solve.status == 1:
   ・
   ・
   ・

它使用 solve_ivp 求解联立微分方程,当存在 i(i=0 到 seg-1)时,E_iE_{i+1} 超过阈值同时,求解器暂停,适当修改b和c,重新求解微分方程。我刚开始学Python,所以我对它一无所知,但如果你能告诉我怎么做,我将不胜感激。

※“同时超过阈值”是指当一个段高于阈值时,相邻段超过阈值。这并不意味着两个段完全同时越过阈值。
很抱歉我的代码解释不好,英语不好。

你已经接近事件机制的局限性了。您要做的是为每个突触实现一个事件函数,并将事件数组传递给 solve_ivp。这可以通过 lambda 函数完成

def event_proto(i,t,E): return min(E[i],E[i+1])-threshold

events = [ lambda t,E: event_proto(i,t,E) for i in range(seg-1) ]

我不确定你是否必须在原型函数上一次设置方向和终止条件,或者单独在数组的所有函数上设置。您可以找出从 solve.t_events 触发的事件。还要检查多个事件是否可以在同一时间段触发,那么您将必须确定第一个事件的最短时间。