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

能否为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:22:28