Pyomo, TypeError: 'numpy.ndarray' object is not callable
Pyomo, TypeError: 'numpy.ndarray' object is not callable
我正在尝试在 Pyomo 中使用 scipy 命令,一个基于 Python.
的优化器
我的目标是在存在风场的情况下为飞机制定最佳轨迹。我在网格点有数据测量。我已经使用 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 and this 个线程,据我所知,这是一条错误消息,如果存在语法错误就会出现。但是,我还没有找到任何东西,我认为这是因为我无法将 scipy 移植到 Pyomo 中。这是真的还是可以修复?
让我们设置一个 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
。看看它的 type
、shape
和 dtype
。它是一个数组。它不能被“调用”,并且对于如何对其进行索引有特定的规则。
zXi(m.lammda[i,1], m.phi[i,1])
是错误的,因为它试图“调用”一个 numpy 数组。但是 zXi[m.lammda[i,1], m.phi[i,1]]
显然有无效的索引,很可能是浮动的。我还没有检查它们是什么。
如果 2 个参数是插值点,rbfX(m.lammda[i,1], m.phi[i,1])
可能会起作用。
zXi = rbfX(xi, yi)
创建一个数组(可能是 2d (100,100)),其中包含在 xi,yi
网格处插值的值。您可以选择一个元素,例如 zXi[50,50]
或值数组。但是你不能把它当作插值函数,给它浮点值。
我正在尝试在 Pyomo 中使用 scipy 命令,一个基于 Python.
的优化器我的目标是在存在风场的情况下为飞机制定最佳轨迹。我在网格点有数据测量。我已经使用 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 and this 个线程,据我所知,这是一条错误消息,如果存在语法错误就会出现。但是,我还没有找到任何东西,我认为这是因为我无法将 scipy 移植到 Pyomo 中。这是真的还是可以修复?
让我们设置一个 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
。看看它的 type
、shape
和 dtype
。它是一个数组。它不能被“调用”,并且对于如何对其进行索引有特定的规则。
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]
或值数组。但是你不能把它当作插值函数,给它浮点值。