Pyomo调用Scipy插值结果触发numpy.ndarray不可调用错误如何解决
错误根因
你的判断不准确,报错和Scipy能否在Pyomo中使用无关,是调用对象类型错误:
sp.interpolate.Rbf返回的rbfX才是可调用的插值函数对象- 你写的
zXi = rbfX(xi, yi)是将100×100的网格坐标代入插值函数后计算得到的固定数值数组,属于numpy.ndarray类型,自然不能像函数一样传入位置参数调用,这才是报错的直接原因。
解决方法
快速验证修正
如果仅需要先跑通代码逻辑,直接把约束中的zXi替换为rbfX即可:
def Wind_lammda_definition1(model, i): return m.Wind_lammda[i,1] == rbfX(m.lammda[i,1], m.phi[i,1]) m.Wind_lammda_const1 = Constraint(m.N, rule = Wind_lammda_definition1)
注意:这种方式下插值函数会被Pyomo识别为黑箱函数,无梯度信息,无法搭配IPOPT等常用梯度类求解器使用,仅可配合无梯度求解器做简单验证
适配梯度求解器的推荐方案
飞机轨迹优化一般使用梯度类求解器效率更高,建议采用以下两种方案之一处理插值逻辑:
- 手动实现RBF插值的代数形式:你使用的
multiquadric核RBF有明确的显式表达式,可以提前提取RBF的基函数权重、中心点坐标等参数,将插值逻辑写成Pyomo原生支持的代数表达式,求解器可自动计算梯度,运行效率最高。 - 封装为Pyomo外部函数:使用
pyomo.environ.ExternalFunction将Scipy的RBF插值函数封装为Pyomo可识别的外部函数,同时补充导数计算逻辑,即可适配梯度类求解器。
另外你提前生成的xi/yi网格和对应的zXi计算逻辑,如果你不需要绘制插值后风场的可视化云图,可以直接删除,避免后续混淆调用对象。
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

