为什么促销无法识别输出?
Why isn't the output recognized with the promotion?
我正在尝试将抛物面示例(无约束)从“'connect'”更改为“'promotes'”,但我收到了输出错误。
在系统“”中未找到响应 'parab.f_xy' 的输出。
请随意查看下面的代码,我试图使其与“"Linking Variables with Promotion vs. Connection"”中解释的主题相似。该代码独立于已发布的抛物面组件。
from openmdao.api import Problem, ScipyOptimizeDriver, IndepVarComp
from openmdao.core.explicitcomponent import ExplicitComponent
class Paraboloid(ExplicitComponent):
def setup(self):
self.add_input('x', val=0.0)
self.add_input('y', val=0.0)
self.add_output('f_xy', val=0.0)
self.declare_partials('*', '*')
def compute(self, inputs, outputs):
x = inputs['x']
y = inputs['y']
outputs['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
def compute_partials(self, inputs, partials):
x = inputs['x']
y = inputs['y']
partials['f_xy', 'x'] = 2.0*x - 6.0 + y
partials['f_xy', 'y'] = 2.0*y + 8.0 + x
# build the model
prob = Problem()
indeps = prob.model.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
indeps.add_output('x', 3.0)
indeps.add_output('y', -4.0)
prob.model.add_subsystem('parab', Paraboloid(), promotes_inputs=['x','y'] , promotes_outputs=['f_xy'])
# setup the optimization
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'
prob.model.add_design_var('indeps.x', lower=-50, upper=50)
prob.model.add_design_var('indeps.y', lower=-50, upper=50)
prob.model.add_objective('parab.f_xy')
prob.setup()
prob.run_driver()
因为您从 'parab' 组件提升了 'f_xy',您的 objective 现在应该命名为 'f_xy' 而不是 'parab.f_xy',并且因为您提升了'x' 和 'y' 从 'indeps' 组件开始,您的设计变量应命名为 'x' 和 'y' 而不是 'indeps.x' 和 'indeps.y'.
我正在尝试将抛物面示例(无约束)从“'connect'”更改为“'promotes'”,但我收到了输出错误。 在系统“”中未找到响应 'parab.f_xy' 的输出。
请随意查看下面的代码,我试图使其与“"Linking Variables with Promotion vs. Connection"”中解释的主题相似。该代码独立于已发布的抛物面组件。
from openmdao.api import Problem, ScipyOptimizeDriver, IndepVarComp
from openmdao.core.explicitcomponent import ExplicitComponent
class Paraboloid(ExplicitComponent):
def setup(self):
self.add_input('x', val=0.0)
self.add_input('y', val=0.0)
self.add_output('f_xy', val=0.0)
self.declare_partials('*', '*')
def compute(self, inputs, outputs):
x = inputs['x']
y = inputs['y']
outputs['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
def compute_partials(self, inputs, partials):
x = inputs['x']
y = inputs['y']
partials['f_xy', 'x'] = 2.0*x - 6.0 + y
partials['f_xy', 'y'] = 2.0*y + 8.0 + x
# build the model
prob = Problem()
indeps = prob.model.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
indeps.add_output('x', 3.0)
indeps.add_output('y', -4.0)
prob.model.add_subsystem('parab', Paraboloid(), promotes_inputs=['x','y'] , promotes_outputs=['f_xy'])
# setup the optimization
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'
prob.model.add_design_var('indeps.x', lower=-50, upper=50)
prob.model.add_design_var('indeps.y', lower=-50, upper=50)
prob.model.add_objective('parab.f_xy')
prob.setup()
prob.run_driver()
因为您从 'parab' 组件提升了 'f_xy',您的 objective 现在应该命名为 'f_xy' 而不是 'parab.f_xy',并且因为您提升了'x' 和 'y' 从 'indeps' 组件开始,您的设计变量应命名为 'x' 和 'y' 而不是 'indeps.x' 和 'indeps.y'.