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
得到不同方式的价值。
我正在尝试使用 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
得到不同方式的价值。