OpenMDAO:COBYLA 和设计变量边界

OpenMDAO: COBYLA and design variables boundaries

我创建这个 post 的目的是了解我在尝试使用来自驱动程序 ScipyOptimizeDriver 的优化器 COBYLA 时注意到的奇怪行为。事实上,当我试图解决 Betz 限制(这是 OpenMDAO 提出的示例之一 https://openmdao.org/newdocs/versions/latest/examples/betz_limit.html)时,它有时会超出我为设计变量“a”设置的边界。

通常,变量“a”应始终介于 0 和 1 之间。但是,通过使用相同的 Betz Limit 示例代码并在每次迭代中打印设计变量“a”,这就是我得到的:

 Design iteration number: 1
Input a: [0.5]
Output Cp: [0.5]
 Design iteration number: 2
Input a: [0.5]
Output Cp: [0.5]
 Design iteration number: 3
Input a: [1.5]
Output Cp: [1.5]
 Design iteration number: 4
Input a: [1.]
Output Cp: [0.]
 Design iteration number: 5
Input a: [1.]
Output Cp: [0.]
 Design iteration number: 6
Input a: [1.0625]
Output Cp: [0.01660156]
 Design iteration number: 7
Input a: [1.0078125]
Output Cp: [0.00024605]
 Design iteration number: 8
Input a: [1.00097656]
Output Cp: [3.81842256e-06]
 Design iteration number: 9
Input a: [1.00012207]
Output Cp: [5.96119207e-08]
 Design iteration number: 10
Input a: [1.00001526]
Output Cp: [9.31336785e-10]
 Design iteration number: 11
Input a: [1.00000191]
Output Cp: [1.4551943e-11]
   Normal return from subroutine COBYLA
   NFVALS =   10   F =-0.000000E+00    MAXCV = 0.000000E+00
   X = 1.000000E+00
Optimization Complete
-----------------------------------

现在,如果您查看一些迭代:输入 a 设置为非常高的值(示例:迭代 3,a=1.5),但根据设计变量范围定义,a 值应介于 0 和 1 之间我之前设置为启动优化。 因此,我不明白为什么我在选择 COBYLA 来解决 Betz Limit 问题时会得到这些值。它是 COBYLA 优化过程的一部分,还是我遗漏了什么?

非常感谢您的帮助

COBYLA 本身不支持(或尊重)变量边界;在纯 Scipy 优化器中,它只会忽略你给它的任何界限。在包装 scipy、we convert the bounds constraints to inequality constraints instead.

的 OpenMDAO 驱动程序中

一般来说,对于任何优化器,您都可以期望在收敛点处遵守不等式约束(假设优化成功),但在到达收敛点的过程中可能会违反这些约束。

我能理解你的困惑,因为通常约束约束被视为永远不能违反的硬限制。 SLSQP 将以这种方式处理它们,但 COBYLA 不会。所以你会陷入更弱的不等式约束公式。