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
相关产品推荐
相关产品推荐

