odeint 问题 Python

Issue with odeint Python

我正在尝试使用 odeint,但我有一个参数会随着每个时间步的变化而变化。我的函数是:

def f(y, t, k1, k2, Pr):
    return k1*(Pr-k2)*y

其中 Pr 是一个包含浮点值的 pandas 系列,其中我观察到了值。而t是1961年到2014年的整数年列表,我为odeint写了如下代码:

y0 = 120000
k1 = 0.2
k2 = -.4
y = odeint(f, y0, t, args = (k1, k2, Pr, ))

但它给出了以下错误:

RuntimeError: The size of the array returned by func (54) does not match the size of y0 (1).

如错误消息所示,Pr 正在作为长度为 54 的向量传入,而不是逐个传入值。推断 Pr 是一个 NumPy 向量,这意味着 f 的输出是将 return 值逐元素应用于 Pr.

的结果

要解决此问题,您可以改用从时间输入生成 Pr 值的函数。再次假设 Pr[k] 对应于 t[k],此函数的最简单版本可能是:

def get_Pr(time: float):
    t_index = sum(t <= time) - 1 
    return Pr[t_index]

然后修改f如下:

def f(y, t, k1, k2):
    this_pr = get_Pr(t)
    return k1*(this_pr-k2)*y

edit: ...然后不要将 Pr 作为参数传递给 scipy.odeint,因为 f 得到不同方式的价值。