这可能是一个问题,因为我缺乏python知识,但是我想从层次结构中下一层的组件中向indepvarcomp(已在问题或组级别启动)添加_output。示例代码可以是类似这样的代码(请参阅下文),并查看无法识别变量的连接。可以这样做吗?
from openmdao.api import Problem, ScipyOptimizeDriver, IndepVarComp,Group,ExplicitComponent
class SellarDis2(ExplicitComponent):
from openmdao.core.indepvarcomp import IndepVarComp
def initialize(self):
self.options.declare('indeps', types=IndepVarComp)
def setup(self):
indeps=self.options['indeps']
indeps.add_output('try', 1.0)
self.add_input('try', val=2)
self.add_input('z', val=2)
self.add_output('y2', val=5.0)
def compute(self, inputs, outputs):
outputs['y2'] = inputs['z']*2+inputs['try']
class SellarMDA(Group):
def setup(self):
indeps = self.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
indeps.add_output('z', 1.0)
self.add_subsystem('d2', SellarDis2(indeps=indeps), promotes=['*'])
prob = Problem()
prob.model = SellarMDA()
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'COBYLA'
# prob.driver.options['maxiter'] = 100
prob.driver.options['tol'] = 1e-8
prob.model.add_design_var('z', lower=0, upper=10)
#prob.model.add_objective('obj')
prob.setup()
prob.run_model()
答案 0 :(得分:0)
如您所说,提供的脚本不起作用。我以为我同意,从理论上讲,这似乎应该可行,并且是一个小错误,我也不认为您实际上应该以这种方式构建模型。
我不明白为什么子组件需要在父级别创建变量。在OpenMDAO中,孩子对设计的父母一无所知。我们在框架代码的内部和模型本身中强制执行严格。
如果您需要在层次结构的某个较低级别上添加一个新的自变量(这确实会发生),那么我建议您在该较低级别上创建一个组,并创建一个新的IndepVarComp来容纳新变量。这是脚本的编辑版本,其中包括我建议您处理情况的方式。
from openmdao.api import Problem, ScipyOptimizeDriver, IndepVarComp, Group, ExplicitComponent
class SellarDis2(ExplicitComponent):
def setup(self):
self.add_input('try', val=2)
self.add_input('z', val=2)
self.add_output('y2', val=5.0)
def compute(self, inputs, outputs):
outputs['y2'] = inputs['z']*2+inputs['try']
class SubGroup(Group):
def setup(self):
indeps = self.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
indeps.add_output('try', 1.0)
self.add_subsystem('d2', SellarDis2(), promotes=['*'])
class SellarMDA(Group):
def setup(self):
indeps = self.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
indeps.add_output('z', 1.0)
self.add_subsystem('d2', SubGroup(), promotes=['*'])
prob = Problem()
prob.model = SellarMDA()
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'COBYLA'
# prob.driver.options['maxiter'] = 100
prob.driver.options['tol'] = 1e-8
prob.model.add_design_var('z', lower=0, upper=10)
#prob.model.add_objective('obj')
prob.setup()
prob.final_setup()
prob.run_model()
我遵循了您的命名约定,为清楚起见,我在子组中创建了一个 second IndepVarComp,但仍使用相同的名称。这是一个N2,以使模型结构更清晰。