如何在优化框架中使用外部代码组件

时间:2018-03-02 14:14:13

标签: openmdao

您好我正在尝试使用抛物面外部代码组件来获得与抛物面优化问题(openmdao v 2.2.0)相同的结果。

所以在我看来应该更新自变量x,y,从而改变外部元件的输入文件,以最小化输出f。
并非我得到了这个工作,但我基本上将外部组件的输出添加为目标,将自变量添加为设计变量等(参见下面的代码)。 但更重要的是,我有一个问题,从概念上理解优化器如何知道这些外部代码中的衍生物。 我试过COBYLA'认为这可能是一种无梯度方法的方法,但是在iprint语句中似乎存在一个错误,因为我无法运行示例抛物面优化。

我认为我与代理人有类似的问题。例如,我使用Metamodelunstructured组件来查找我的代理,如果我要求一个已知值,它会表现良好。但我不知道如何将此组件的输出耦合为优化器的目标。我认为我通过给出模型目标来做正确的事情。但不确定......

答案可能是我完全偏离优化逻辑,如果是这样,请参考相关论文了解后面的算法。

提前致谢

from openmdao.api import Problem, Group, IndepVarComp
from openmdao.api import  ScipyOptimizeDriver
from openmdao.components.tests.test_external_code import ParaboloidExternalCode

top = Problem()
top.model = model = Group()

# create and connect inputs
model.add_subsystem('p1', IndepVarComp('x', 3.0))
model.add_subsystem('p2', IndepVarComp('y', -4.0))
model.add_subsystem('p', ParaboloidExternalCode())

model.connect('p1.x', 'p.x')
model.connect('p2.y', 'p.y')

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

top.model.add_design_var('p1.x', lower=-50, upper=50)
top.model.add_design_var('p2.y', lower=-50, upper=50)
top.model.add_objective('p.f_xy')
top.driver.options['tol'] = 1e-9
top.driver.options['disp'] = True
top.setup()
top.run_driver()
# minimum value
# location of the minimum
print(top['p1.x'])
print(top['p2.y'])

1 个答案:

答案 0 :(得分:0)

所以,我认为您要问的主要问题是如何为外部代码提供衍生产品。我认为这有两种选择。

  1. 外部组件的有限差异。
  2. 测试示例没有显示如何执行此操作,这是不幸的,但是这样做的方式与为纯python组件声明衍生fd的方式相同,即通过将此行添加到外部组件的setup方法:

    self.declare_partials(of='*', wrt='*', method='fd')
    
    1. 提供另一种外部方法来计算导数,并将其包装在“compute_partials”方法中。
    2. 我们使用提供伴随解决方案的CFD代码。您也可以使用外部源代码的自动区分来以这种方式生成可调用函数。但是,我认为方法1是你在这里要求的。