【问题标题】:Issue with odeint Pythonodeint Python 的问题
【发布时间】:2021-11-14 12:43:30
【问题描述】:

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

def f(y, t, k1, k2, Pr):

    return k1*(Pr-k2)*y

其中Pr 是一个包含浮点值的熊猫系列,我观察到了其中的值。 anft是从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).

【问题讨论】:

  • 只是指出一个潜在的错误:k1k2 在函数的前两行被覆盖,因此您为它们传递的值将被丢弃。
  • @EricCanton 你是对的,我刚刚编辑了问题
  • 能否告诉我们Prt 的类型?例如熊猫数据框或系列。或显示其实例化的简化示例。获得使用它们的正确语法很重要。
  • @EricCanton Pr 是一个包含浮点值的 pandas 系列,t 是包含 1961 年到 2014 年的年份值的列表。两者的长度都是 54。
  • 您得到的错误只是突出显示y0 是单个int,而f 的返回值包含54 个元素。这两个必须具有相同的形状。如果所有 54 个元素的初始值都相同,则只需编写 y0 = 1.2e5 * np.ones(54)

标签: python scipy ode odeint


【解决方案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

编辑:...然后不要将Pr 作为参数传递给scipy.odeint,因为f 以不同的方式获取值。

【讨论】:

  • 当我进行这些更改并运行 odeint 时,它会给出错误-TypeError: cannot do label indexing on &lt;class 'pandas.core.indexes.numeric.Int64Index'&gt; with these indexers [1961.0000197468344] of &lt;class 'float'&gt;
  • 不知道为什么会出现这个错误。 t 是 1961-2014 年的时间序列
  • 如果t 是一个列表而不是NumPy 数组或Pandas 系列,那么您收到该错误很奇怪...t &lt;= time 应该给出一个Python 列表的不同错误,因为&lt;= 未在列表和浮点数之间定义。
  • 但除此之外,要在 Pandas 系列中使用整数索引,请在其上使用 .iloc。如return Pr.iloc[t_index]
  • Pr(t) 以离散时间间隔(即每年)可用。这可能是导致第 1 条评论中出现错误的原因吗? odeint 的时间值是否应该是连续的?
猜你喜欢
  • 1970-01-01
  • 2016-04-28
  • 2014-05-26
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2021-05-26
相关资源
最近更新 更多