【问题标题】:Pyomo, TypeError: 'numpy.ndarray' object is not callablePyomo,TypeError:“numpy.ndarray”对象不可调用
【发布时间】:2021-10-12 16:08:19
【问题描述】:

我正在尝试在基于 Python 的优化器 Pyomo 中使用 scipy 命令。

我的目标是在存在风场的情况下为飞机制定最佳轨迹。我在网格点进行数据测量。我使用 scipy 将插值生成为

xi, yi = np.linspace(X2.astype('float').min(), X2.astype('float').max(), 100), np.linspace(Y2.astype('float').min(), Y2.astype('float').max(), 100)
xi, yi = np.meshgrid(xi, yi)

# Interpolate
rbfX = sp.interpolate.Rbf(X2, Y2, Wx2, function='multiquadric')
zXi = rbfX(xi, yi)

作为 sp 我称之为 scipy。这就是我必须在任何时候计算风速的方法。我正在插值风速。

然后,在 pyomo 部分,我写

def Wind_lammda_definition1(model, i):
    return m.Wind_lammda[i,1] ==zXi(m.lammda[i,1], m.phi[i,1])
m.Wind_lammda_const1 = Constraint(m.N, rule = Wind_lammda_definition1)

m.lammda 和 m.phi 是飞机的位置。

不幸的是,一旦我运行代码,我就会收到以下错误:

    return m.Wind_lammda[i,1] ==zXi(m.lammda[i,1], m.phi[i,1])

TypeError: 'numpy.ndarray' object is not callable

我检查了thisthis 线程,据我所知,这是一条错误消息,如果存在语法错误,则会出现。但是,我没有找到任何东西,我认为这是因为我无法将 scipy 移植到 Pyomo 中。这是真的还是可以解决?

【问题讨论】:

  • 什么是zXi?使用func(args) 语法调用函数。数组使用arr[...] 进行索引。您向我们展示了不相关的代码片段,因此我们无法解读各种变量是什么。但是这里的关键是你把数组对象当作一个函数来使用,这显然是错误的。
  • zXi 位于第一个代码的末尾,zXi = rbfX(xi, yi)。我的想法是计算飞机所在的 X 和 Y 坐标m.lammda[i,1]m.phi[i,1] 定义的每个点的风值。我正在使用步长为 50 的伪光谱 radau 方法,因此我有 51 个点将评估函数,由 i 表示。第二个指数代表飞机的数量,因为我从事冲突检测工作。我需要 50 个位置中每个位置的风速值。我希望我已经解释了自己。如果我没有设法解释自己,请随时询问
  • 在函数Wind_lammda_definition1 中,您使用表达式zXi(m.lammda[i,1], m.phi[i,1])。这就是错误的根源。 zXi 是一个 NumPy 数组;你不能像那样调用 NumPy 数组。
  • 你为什么用zXi(m.lammda[i,1], m.phi[i,1])而不是zXi[m.lammda[i,1], m.phi[i,1]]。在 Python 中,()[] 不同。一个用于函数调用,另一个用于索引。
  • @WarrrenWeckesser。那么,我想要的是不可能的,或者有没有办法从 pyomo 代码内部调用 zXi?另外,@hpaulj,如果我将括号更改为方括号,我会收到错误return m.Wind_lammda[i,1] ==zXi[m.lammda[i,1], m.phi[i,1]] IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices

标签: python numpy scipy interpolation pyomo


【解决方案1】:

让我们设置一个Rbf 对象:

In [177]: X,Y = np.meshgrid(np.arange(4),np.arange(4))
In [178]: Z = np.sin(X-Y)
In [179]: fn = interpolate.Rbf(X,Y,Z)
In [180]: type(fn)
Out[180]: scipy.interpolate.rbf.Rbf

这就像你的rbfX。根据文档,它是callable,也就是说它有一个__call__ 方法。

如果我们用 2 个标量调用它,我们会得到一个单元素数组:

In [181]: fn(1.5, 2.3)
Out[181]: array(-0.73094599)

用一对数组调用它,我们得到一个大小匹配的数组:

In [184]: fn(np.arange(1,3,.5), np.arange(0,2,.5))
Out[184]: array([0.84147098, 0.85639014, 0.84147098, 0.85639014])

这就是你的zXi。查看它的typeshapedtype。这是一个数组。它不能被“调用”,并且对于如何索引它有特定的规则。

zXi(m.lammda[i,1], m.phi[i,1]) 是错误的,因为它试图“调用”一个 numpy 数组。但是zXi[m.lammda[i,1], m.phi[i,1]] 显然有无效的索引,很可能是浮动的。我还没有检查它们是什么。

rbfX(m.lammda[i,1], m.phi[i,1]) 如果两个参数是插值点,可能会起作用。

zXi = rbfX(xi, yi) 创建一个数组(可能是 2d (100,100)),其中包含在 xi,yi 网格处插值的值。您可以选择一个元素,例如 zXi[50,50] 或值数组。但是你不能把它当作插值函数,给它浮点值。

【讨论】:

  • 感谢您的回答。我明白发生了什么。我更改了我的代码,使其看起来像return m.Wind_lammda[i,1] ==rbfX(m.lammda[i,1], m.phi[i,1])。不幸的是,它现在返回`文件“pyomo\core\expr\numvalue.pyx”,第 588 行,在 pyomo.core.expr.numvalue.NumericValue.__float__ TypeError: Implicit conversion of Pyomo NumericValue type lammda[0,1]' to a float is disabled. This error is often the result of using Pyomo components as arguments to one of the Python built-in math module functions when defining expressions. Avoid this error by using Pyomo-provided math functions.
  • 我认为没有解决方案。对吗?
  • 我不知道pyomo.. rbfX`需要2个浮点数或浮点dtype数组。
  • 我也不是程序员。我检查了 pyomo (pyomo.readthedocs.io/_/downloads/en/stable/pdf) 的文档,我只在第 339 和 340 页中看到插值一词。我不够熟练,无法理解发生了什么。
猜你喜欢
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2019-05-09
  • 2020-11-13
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多