能否为SQSLP优化设置自定义初始值?默认初始值[1,1,1]不符合需求
解决OpenMDAO中SLSQP优化器初始值自定义问题
我之前在OpenMDAO项目里也碰到过一模一样的情况——架构限制没法修改组件内部的初始值设置,优化器却硬把设计变量默认成[1,1,1]。其实不用动组件代码,有两种简单方法可以指定自定义初始值:
方法1:用set_val直接在模型层面赋值
这是最灵活的方式,完全避开组件内部的限制。在你添加完设计变量之后,直接调用模型的set_val方法给目标变量设置初始值就行:
# 你的原有代码:添加设计变量 p.model.add_design_var('indeps.upperWeights', lower=np.array([1E-3, 1E-3, 1E-3])) p.model.add_design_var('indeps.lowerWeights', upper=np.array([-1E-3, -1E-3, -1E-3])) # 新增:设置自定义初始值,替换成你需要的数值 p.model.set_val('indeps.upperWeights', np.array([0.5, 0.5, 0.5])) p.model.set_val('indeps.lowerWeights', np.array([-0.5, -0.5, -0.5])) # 你的原有代码:约束、目标和驱动设置 p.model.add_constraint('cl', equals=1) p.model.add_objective('cd') p.driver = om.ScipyOptimizeDriver()
set_val会直接覆盖IndepVarComp输出的默认初始值(默认是1),优化器启动时就会用你指定的数值作为起点。
方法2:在add_design_var中直接指定val参数
如果更习惯在添加设计变量时一步到位,也可以给add_design_var方法传val参数来设置初始值:
p.model.add_design_var('indeps.upperWeights', lower=np.array([1E-3, 1E-3, 1E-3]), val=np.array([0.5, 0.5, 0.5])) # 这里指定初始值 p.model.add_design_var('indeps.lowerWeights', upper=np.array([-1E-3, -1E-3, -1E-3]), val=np.array([-0.5, -0.5, -0.5])) # 后续约束、目标和驱动设置不变 p.model.add_constraint('cl', equals=1) p.model.add_objective('cd') p.driver = om.ScipyOptimizeDriver()
这个方法要注意val的维度必须和变量的shape完全匹配,不然会报错。
两种方法都能让SLSQP优化器(你可能打错成SQSLP啦)使用你自定义的初始值,不用修改任何组件内部的代码,完美适配你的架构限制。
内容的提问来源于stack exchange,提问作者BeeperTeeper
相关产品推荐
相关产品推荐

