OpenMDAO: как установить ограничение ограничения как выход другого компонента? - PullRequest
0 голосов
/ 08 октября 2019

Я хочу минимизировать вывод одного компонента, при этом гарантируя, что он больше, чем вывод второго компонента.

add_constraint ожидает "Итерируемые числовые значения или скалярное числовое значение", когда япередайте ему строку с именем вывода.

При задании prob['name'] ошибка: «Объект« NoneType »не может быть подписан»

Это должно быть что-то простое и задокументированное,но я еще не нашел его.

import openmdao.api as om

prob=om.Problem()
independant = prob.model.add_subsystem('independant', om.IndepVarComp())
independant.add_output('x', val = 3.0)

prob.model.add_subsystem('steep_line', om.ExecComp('f = x'))
prob.model.add_subsystem('shallow_line', om.ExecComp('g = 0.5*x + 1.0'))

prob.model.connect('independant.x', ['steep_line.x', 'shallow_line.x'])

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

prob.model.add_design_var('independant.x', lower=0.0, upper=3.0)

#Change which of the next two lines is commented out to see both errors I
#have encountered.
prob.model.add_constraint('steep_line.f', lower='shallow_line.g')
#prob.model.add_constraint('steep_line.f', lower=prob['shallow_line.g'])

prob.model.add_objective('steep_line.f')

prob.setup()
prob.run_driver()

print('x:', prob['independant.x'])

Желаемый результат - оптимизация, которая приводит к Independant.x = 2,0

Заранее благодарю за любую помощь, которую вы можете оказать.

1 Ответ

0 голосов
/ 08 октября 2019

Нельзя указывать непостоянную нижнюю, верхнюю или равную границу. Чтобы это работало, вам нужно добавить (еще один) ExecComp, а затем вычесть два значения из каждого другого. Затем вы можете установить результирующий вывод этого нового компа, чтобы иметь нижнюю границу 0

import openmdao.api as om

prob=om.Problem()
independant = prob.model.add_subsystem('independant', om.IndepVarComp())
independant.add_output('x', val = 3.0)

prob.model.add_subsystem('steep_line', om.ExecComp('f = x'))
prob.model.add_subsystem('shallow_line', om.ExecComp('f = 0.5*x + 1.0'))

prob.model.add_subsystem('constraint', 
                         om.ExecComp('g = f_computed - lower'))

prob.model.connect('independant.x', ['steep_line.x', 'shallow_line.x'])
prob.model.connect('shallow_line.f', 'constraint.lower')
prob.model.connect('steep_line.f', 'constraint.f_computed')

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

prob.model.add_design_var('independant.x', lower=0.0, upper=3.0)

prob.model.add_constraint('constraint.g', lower=0)

prob.model.add_objective('steep_line.f')

prob.setup()
prob.run_driver()

print('x:', prob['independant.x'])
...