【发布时间】: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
我检查了this 和this 线程,据我所知,这是一条错误消息,如果存在语法错误,则会出现。但是,我没有找到任何东西,我认为这是因为我无法将 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