Проблема с использованием ExternalCodeComp в Openmdao - PullRequest
1 голос
/ 04 августа 2020

Я пробую пример проблемы для ExternalCodeComp, как указано в openmdao docs .

Код оптимизации

import openmdao.api as om
from openmdao.components.tests.test_external_code_comp import ParaboloidExternalCodeCompFD

prob = om.Problem()
model = prob.model

model.add_subsystem('p', ParaboloidExternalCodeCompFD(), promotes_inputs=['x', 'y'])

# find optimal solution with SciPy optimize
# solution (minimum): x = 6.6667; y = -7.3333
prob.driver = om.ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'

prob.model.add_design_var('p.x', lower=-50, upper=50)
prob.model.add_design_var('p.y', lower=-50, upper=50)

prob.model.add_objective('p.f_xy')

prob.driver.options['tol'] = 1e-9
prob.driver.options['disp'] = True

prob.setup()

# Set input values
prob.set_val('p.x', 3.0)
prob.set_val('p.y', -4.0)

prob.run_driver()
print(prob.get_val('p.x'))
print(prob.get_val('p.y'))

Однако я получаю следующую ошибку at prob.setup().

Exception has occurred: RuntimeError
Group (<model>): Output not found for design variable 'p.x'.

Что это значит? Я не знаю, упустил ли я что-то basi c. Проблема возникает только тогда, когда я пытаюсь его оптимизировать. Нет проблем, когда я просто использую внешний код в модели (как указано в документации).

1 Ответ

0 голосов
/ 04 августа 2020

В этой строке вы продвинули входы x и y

model.add_subsystem('p', ParaboloidExternalCodeCompFD(), promotes_inputs=['x', 'y'])

Обратите внимание, что вы не продвигали выход f_xy

, поэтому с верхнего уровня модели правильные пути: p.f_xy для вывода, но x и y для входов.

Таким образом, правильным способом добавления проектных переменных и установки значений было использование x и y.

import openmdao.api as om
from openmdao.components.tests.test_external_code_comp import ParaboloidExternalCodeCompFD

prob = om.Problem()
model = prob.model

model.add_subsystem('p', ParaboloidExternalCodeCompFD(), promotes_inputs=['x', 'y'])

# find optimal solution with SciPy optimize
# solution (minimum): x = 6.6667; y = -7.3333
prob.driver = om.ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'

prob.model.add_design_var('x', lower=-50, upper=50)
prob.model.add_design_var('y', lower=-50, upper=50)

prob.model.add_objective('p.f_xy')

prob.driver.options['tol'] = 1e-9
prob.driver.options['disp'] = True

prob.setup()

# Set input values
prob.set_val('x', 3.0)
prob.set_val('y', -4.0)

prob.run_driver()
print(prob.get_val('x'))
print(prob.get_val('y'))
...