OpenMDAO 1.2.0 隐式组件

OpenMDAO 1.2.0 implicit component

我是 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 问题教程,但无法将其翻译成这种情况。

如果需要,您可以创建隐式组件。在这种情况下,您将在组件中定义一个 apply_linear 方法。这是通过鞍问题 here 完成的。

在你的例子中,因为你有一个 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 或定义所有参数和状态变量的残差导数。