通过 odeint(或 solve_ivp)计算系统对时变输入的响应

Compute system response to time-varying input by odeint (or solve_ivp)

我正在尝试求解一个简单的 ODE 以可视化时间响应,使用 SciPy 中的新 solve_ivp 积分 API,它适用于恒定输入条件。例如:

def dN1_dt_simple(t, N1):
    return -100 * N1

sol = solve_ivp(fun=dN1_dt_simple, t_span=[0, 100e-3], y0=[N0,])

但是,我想知道是否可以绘制对时变输入的响应?例如,不是让 y0 固定在 N0,我能找到对简单正弦曲线的响应吗?

是否有兼容的方法将时变输入条件传递给 API?

正是出于这个原因,您传递给 solve_ivp 的函数在其签名中有一个 t。您可以随心所欲地使用它¹。例如,要获得平滑的一次性脉冲,您可以这样做:

from numpy import pi, cos

def fun(t,N1):
    input = 1-cos(t) if 0<t<2*pi else 0
    return -100*N1 + input

sol = solve_ivp(fun=fun, t_span=[0,20], y0=[N0])

请注意,y0 不是您使用该术语时的输入,而是初始条件。它仅在一个时间点定义且有意义 - 您开始 integration/simulation 的时间点。 使用 ODE,您通常将外部输入建模为力或类似物(影响系统的时间导数,如上例所示),而不是直接更改状态。 使用这种方法并在您的可激发系统的上下文中,N0 已经是一些外部输入的结果。


¹只要它足够平滑以满足各自积分器的需求,通常是连续可微的 (C¹)。如果你想实现一个步骤,最好使用非常尖锐的 sigmoid 代替。