OpenMDAO中np_check与np的约束配置方法问询
OpenMDAO飞艇优化模型约束设置方案
在OpenMDAO中,这类依赖设计变量动态值的约束建议在Optimization类外部(即Problem实例的驱动配置阶段)添加——优化问题的设计变量、目标与约束属于顶层配置逻辑,和模型组件的计算逻辑解耦,且能支持动态引用设计变量值作为约束上下限,避免组内设置时无法实时跟踪设计变量更新的问题。
完整模型代码示例
import openmdao.api as om import numpy as np class AirshipModel(om.ExplicitComponent): def setup(self): # 输入设计变量np self.add_input('np', val=100.0) # 输出计算得到的np_check self.add_output('np_check', val=100.0) def compute(self, inputs, outputs): # 模拟飞艇模型的实际计算逻辑(此处为示例,替换为你的真实计算代码) outputs['np_check'] = inputs['np'] * np.random.uniform(0.9, 1.1) class Optimization(om.Group): def setup(self): # 添加飞艇计算子系统 self.add_subsystem('airship', AirshipModel()) if __name__ == "__main__": # 初始化优化问题 prob = om.Problem() prob.model = Optimization() # 设置优化驱动(使用Scipy的SLSQP优化器) prob.driver = om.ScipyOptimizeDriver() prob.driver.options['optimizer'] = 'SLSQP' # 定义设计变量np的取值范围 prob.model.add_design_var('airship.np', lower=50.0, upper=200.0) # 定义优化目标(示例:最小化np_check,可根据你的需求修改) prob.model.add_objective('airship.np_check') # 核心:添加动态约束,确保np_check处于np的95%~105%范围内 # 使用表达式引用设计变量值,OpenMDAO会在优化过程中动态计算约束上下限 prob.driver.add_constraint('airship.np_check', lower='0.95*airship.np', upper='1.05*airship.np') # 运行优化流程 prob.setup() prob.run_driver() # 输出结果验证 np_opt = prob.get_val('airship.np')[0] np_check_opt = prob.get_val('airship.np_check')[0] print(f"优化后设计变量np: {np_opt:.2f}") print(f"计算输出np_check: {np_check_opt:.2f}") print(f"约束满足状态: {0.95*np_opt <= np_check_opt <= 1.05*np_opt}")
关键说明
- 约束设置位置:通过
prob.driver.add_constraint添加约束是最优选择,它支持用字符串表达式动态关联设计变量,确保优化过程中约束上下限随np的更新而实时调整。 - 组内设置的局限性:若尝试在
Optimization组内部用self.add_constraint设置,只能使用初始值定义上下限,无法跟踪设计变量的动态变化,会导致约束逻辑失效。 - 代码解耦:将模型计算(
AirshipModel)与优化配置(设计变量、目标、约束)分离,让代码结构更清晰,便于后续维护和修改模型逻辑。
内容的提问来源于stack exchange,提问作者Simon Boudoux
相关产品推荐
相关产品推荐

