You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:36:03