在组内的组件内更新 IndepVarComp
Updating IndepVarComp within a component inside the group
由于我缺乏知识,这可能是一个问题 python 但我想 add_output 从一个组件中 add_output indepvarcomp(已在问题或组级别启动)在层次结构中是低一级。示例代码可以是这样的(见下文)并查看无法识别变量的连接。可以这样做吗?
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()
正如您所说,提供的脚本不起作用。以为我同意理论上这似乎应该有效并且是一个小错误,我也不认为你应该以这种方式实际构建模型。
我不明白为什么 child 组件需要在 parent 级别创建变量。在 OpenMDAO 中,children 故意不知道他们的 parents 的任何信息。我们非常严格地在框架代码的内部和模型本身中强制执行这一点。
如果您需要在层次结构的某个较低级别添加一个新的独立变量(这肯定会发生),那么我建议您在该较低级别创建一个组并创建一个新的 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()
我遵循了您的命名约定,为了清楚起见,我在 sub-group 中创建了一个 second IndepVarComp,但名称仍然相同。这里加个N2,让模型结构清晰。
由于我缺乏知识,这可能是一个问题 python 但我想 add_output 从一个组件中 add_output indepvarcomp(已在问题或组级别启动)在层次结构中是低一级。示例代码可以是这样的(见下文)并查看无法识别变量的连接。可以这样做吗?
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()
正如您所说,提供的脚本不起作用。以为我同意理论上这似乎应该有效并且是一个小错误,我也不认为你应该以这种方式实际构建模型。
我不明白为什么 child 组件需要在 parent 级别创建变量。在 OpenMDAO 中,children 故意不知道他们的 parents 的任何信息。我们非常严格地在框架代码的内部和模型本身中强制执行这一点。
如果您需要在层次结构的某个较低级别添加一个新的独立变量(这肯定会发生),那么我建议您在该较低级别创建一个组并创建一个新的 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()
我遵循了您的命名约定,为了清楚起见,我在 sub-group 中创建了一个 second IndepVarComp,但名称仍然相同。这里加个N2,让模型结构清晰。