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

