嗨,我正在尝试使用抛物面外部代码组件来获得与抛物面优化问题(openmaov2.2.0)相同的结果。
因此,在我看来,应该更新自变量x,y,从而更改外部组件的输入文件,以最小化输出f。
我并没有做到这一点,但我基本上将外部组件的输出添加为目标,将自变量添加为设计变量,等等(参见下面的代码)。但更重要的是,我有一个问题要从概念上理解优化器是如何知道这些外部代码中的导数的。我试过“COBYLA”,认为这可能是一种无梯度方法,但是iprint语句中似乎有一个bug,因为我也不能运行这个示例抛物面优化。
我想我对代孕母亲也有类似的问题。例如,我使用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'])
发布于 2018-03-02 12:23:17
所以,我认为你要问的主要问题是如何为外部代码提供导数。我认为有两种选择。
测试示例没有说明如何做到这一点,这是不幸的,但这样做的方式与为纯python组件声明衍生工具fd的方式相同,即将这一行添加到外部组件的安装方法中:
self.declare_partials(of='*', wrt='*', method='fd')
我们这样做的CFD代码,提供了一个伴随的解决方案。您还可以在外部源代码上使用自动区分来以这种方式生成可调用的函数。然而,我认为方法1是你在这里要求的。
https://stackoverflow.com/questions/49070919
复制相似问题