我正在尝试使用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)我是怎么叫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中。这是真的吗?还是可以修复的?
发布于 2021-10-12 20:09:32
让我们设置一个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]或值数组。但是你不能把它当做插值函数,给它一个浮点值。
https://stackoverflow.com/questions/69543751
复制相似问题