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

OpenMDAO 3.22结合WISDEM优化后报告生成报错求助

ValueError in OpenMDAO opt_report.py when mixing scalar and array design variable bounds

问题重现

在使用OpenMDAO 3.22结合WISDEM组件完成优化计算后,调用opt_report.py中的_make_dvcons_table函数时触发报错:

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 2 dimensions. The detected shape was (3, 2) + inhomogeneous part

相关变量信息:

  • 设计变量值:desvars_vals={'control.rated_TSR': array([6.]), 'blade.opt_var.chord_opt': array([1.6085229])}
  • 设计变量元数据:control.rated_TSR的上下限为标量,blade.opt_var.chord_opt的上下限为数组

报错发生在_draw_pointer_and_label函数生成numpy数组的环节,因收集到的坐标相关数据同时包含标量和数组类型,导致numpy无法创建形状规整的数组。

原因分析

问题核心是opt_report.py的_draw_pointer_and_label函数未兼容标量+数组混合类型的设计变量上下限场景。当部分变量上下限为标量、部分为数组时,收集到的序列会出现形状不均匀的情况,numpy尝试将其转为数组时就会抛出上述错误。

解决方案

方案1:修改opt_report.py源码适配混合类型

找到_draw_pointer_and_label函数中构建坐标数组的代码段,统一将标量转为长度为1的数组,确保所有数据维度一致:

def _draw_pointer_and_label(...):
    # ... 原有代码 ...
    
    # 新增工具函数:将标量转为一维数组,数组保持原样
    def ensure_array(val):
        if np.isscalar(val):
            return np.array([val])
        return np.asarray(val)
    
    # 替换原有上下限收集逻辑
    lower_bounds = [ensure_array(meta['lower']) for meta in desvars_meta.values()]
    upper_bounds = [ensure_array(meta['upper']) for meta in desvars_meta.values()]
    
    # ... 后续坐标计算逻辑保持不变 ...

方案2:统一设计变量上下限的类型

在定义设计变量时,将标量上下限也转为长度为1的numpy数组,避免混合类型:

# 原标量上下限定义
# prob.model.add_design_var('control.rated_TSR', lower=4.0, upper=8.0)

# 修改为数组类型上下限
prob.model.add_design_var('control.rated_TSR', lower=np.array([4.0]), upper=np.array([8.0]))

让所有设计变量的上下限统一为数组类型,无需修改opt_report源码即可正常生成报告。

内容的提问来源于stack exchange,提问作者user12507339

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:47:40