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

使用OpenMDAO教程中SellarMDAPromoteConnect类时遇运行时错误求助

OpenMDAO SellarMDAPromoteConnect 报错:Output not found for response 'obj' 解决方法

问题重现

刚接触OpenMDAO,学习Sellar双学科优化教程时,使用第三种「变量提升与显式连接」方式的SellarMDAPromoteConnect类,运行优化代码时抛出错误:

: Output not found for response 'obj'

执行openmdao check -c all <文件名>.py检查,首条错误为:

File "D:\softwares\anaconda\anaconda3\lib\site-packages\openmdao\core\system.py", line 3250, in get_responses
    key = in_abs = prom2abs_in[name][0]
KeyError: 'obj'

代码与官方教程完全一致。

错误原因

问题核心是优化器引用的obj变量路径不存在。在SellarMDAPromoteConnect的默认结构中,obj是obj_cmp组件的输出变量,但未被提升到顶层模型;而优化器代码中直接使用add_objective('obj'),会在顶层模型中查找该变量,自然找不到。

修复方案

以下两种方案任选其一,均基于SellarMDAPromoteConnect类进行修改:

方案1:将obj变量提升到顶层模型

在SellarMDAPromoteConnect的setup方法中,添加对obj_cmp组件obj输出的提升操作,确保顶层模型能直接访问该变量:

class SellarMDAPromoteConnect(om.Group):
    def setup(self):
        self.add_subsystem('d1', SellarDis1())
        self.add_subsystem('d2', SellarDis2())
        self.add_subsystem('obj_cmp', SellarObj())
        self.add_subsystem('con_cmp1', SellarCon1())
        self.add_subsystem('con_cmp2', SellarCon2())

        # 提升各组件变量到顶层
        self.promotes('d1', ['x', 'z', 'y1'])
        self.promotes('d2', ['z', 'y1', 'y2'])
        # 新增此行:将obj_cmp的obj变量提升到顶层
        self.promotes('obj_cmp', ['x', 'z', 'y1', 'y2', 'obj'])
        self.promotes('con_cmp1', ['y1', 'con1'])
        self.promotes('con_cmp2', ['y2', 'con2'])

        # 显式连接剩余变量
        self.connect('d1.y1', ['d2.y1', 'obj_cmp.y1', 'con_cmp1.y1'])
        self.connect('d2.y2', ['obj_cmp.y2', 'con_cmp2.y2'])

方案2:优化器使用变量的绝对路径

如果不想修改组件提升逻辑,直接在优化器配置中使用obj变量的完整组件路径:

prob = om.Problem()
prob.model = SellarMDAPromoteConnect()

prob.driver = om.ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'

prob.model.add_design_var('x', lower=0, upper=10)
prob.model.add_design_var('z', lower=0, upper=10)
# 使用完整路径引用obj变量
prob.model.add_objective('obj_cmp.obj')
# 约束变量同理,若有路径问题也需修改
prob.model.add_constraint('con_cmp1.con1', upper=0)
prob.model.add_constraint('con_cmp2.con2', upper=0)

prob.setup()
prob.run_driver()

验证

修改后重新运行代码,或再次执行openmdao check -c all <文件名>.py,错误即可消除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:45:36