首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在优化框架内使用外部代码组件

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

Stack Overflow用户
提问于 2018-03-02 14:14:12
回答 1查看 177关注 0票数 1

嗨,我正在尝试使用抛物面外部代码组件来获得与抛物面优化问题(openmaov2.2.0)相同的结果。

因此,在我看来,应该更新自变量x,y,从而更改外部组件的输入文件,以最小化输出f。

我并没有做到这一点,但我基本上将外部组件的输出添加为目标,将自变量添加为设计变量,等等(参见下面的代码)。但更重要的是,我有一个问题要从概念上理解优化器是如何知道这些外部代码中的导数的。我试过“COBYLA”,认为这可能是一种无梯度方法,但是iprint语句中似乎有一个bug,因为我也不能运行这个示例抛物面优化。

我想我对代孕母亲也有类似的问题。例如,我使用Metamodelunstructured组件来查找我的代理项,如果我请求一个已知值,它的性能很好。但是,我不知道如何将这个组件的输出耦合成优化器的目标。我认为我做的是对的,给出了模型的目标。但不确定..。

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

提前感谢

代码语言:javascript
代码运行次数:0
运行
复制
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'])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-02 20:23:17

所以,我认为你要问的主要问题是如何为外部代码提供导数。我认为有两种选择。

  1. 通过外部组件的有限差分。

测试示例没有说明如何做到这一点,这是不幸的,但这样做的方式与为纯python组件声明衍生工具fd的方式相同,即将这一行添加到外部组件的安装方法中:

代码语言:javascript
代码运行次数:0
运行
复制
self.declare_partials(of='*', wrt='*', method='fd')
  1. 提供另一个计算导数的外部方法,并将其包装在"compute_partials“方法中。

我们这样做的CFD代码,提供了一个伴随的解决方案。您还可以在外部源代码上使用自动区分来以这种方式生成可调用的函数。然而,我认为方法1是你在这里要求的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49070919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档