0

我是 OpenMDAO 的新手,我仍在学习如何制定问题。举个简单的例子,假设我有 3 个具有给定边界的输入变量:

1 <= x <= 10
0 <= y <= 10
1 <= z <= 10

我有 4 个输出,定义为:

f1 = x * y
f2 = 2 * z
g1 = x + y - 1
g2 = z

我的目标是最小化 f1 * g1,但强制执行约束 f1 = f2 和 g1 = g2。例如,一种解决方案是 x=3、y=4、z=6(不知道这是否是最优的)。

对于这个简单的问题,您可能只需将输出相等约束提供给驱动程序。但是,对于我的实际问题,很难找到满足所有约束的初始起点,因此优化器无法做任何事情。我想也许我可以将 y 和 z 定义为隐式组件中的状态,并让非线性求解器在给定 x 的情况下计算出 y 和 z 的正确值,然后将 x 馈送到优化驱动程序。

这是一种可能的方法吗?如果是这样,在这种情况下,隐式组件会是什么样子?我查看了 Sellar 问题教程,但无法将其翻译为这种情况。

4

1 回答 1

1

如果需要,您可以创建一个隐式组件。在这种情况下,您将在组件中定义一个apply_linear方法。此处的卖方问题已解决。

在您的情况下,因为您有 2 个残差方程集,它们都依赖于状态变量,我建议您创建一个长度为 2 的单个数组状态变量,调用它foo(我使用了一个新变量以避免任何混淆,但命名它无论你想要什么!)。然后,您将定义两个残差,一个用于新状态变量的残差数组的每个元素。

就像是:

resids['foo'][0] = params['x'] * unknowns['foo'][0] - 2 * unknowns['foo'][1]
resids['foo'][1] = params['x'] + unknowns['foo'][0] - 1 - unknowns['foo'][1]

如果您想将状态变量名称分开,您可以,它仍然可以工作。您只需将一个残差方程任意分配给一个变量,将一个残差方程分配给另一个变量。

然后唯一剩下的就是向包含隐式组件的组添加一个非线性求解器,它应该可以工作。如果您选择使用牛顿求解器,则需要设置fd_options['force_fd'] = True或定义所有参数和状态变量的残差导数。

于 2015-10-21T11:47:32.913 回答