仅对某些角度声明约束

Declare a constraint for only some angles

我不确定我的问题是否足够清楚,请告诉我任何更改以便澄清!

我有一个群组:

class Point(Group):
    def __init__(self, **d):
        super(Point, self).__init__()
        [...]
        for i in (...) :
            self.add('con%d' % i, 
                ExecComp('c{0} = x[{1}]*x[{1}] + x[{2}]*x[{2}]'.format(i, n, n+1)))
            self.connect('p.x', 'con%d.x' % i)

还有一个问题:

class PointSolver(Problem):
    def __init__(self, options, *a, **d):
        super(PointSolver, self).__init__()
        [...]
        for i in (...)    
            self.driver.add_constraint('con{0}.c{0}'.format(i), upper=1.0)

我看到我的约束 (x[{1}]² + x[{2}]² <= 1) 是一个圆圈。由此,如果我有极坐标 (r, theta),我将有 (r <= 1)。 我想动态定义圆的一部分,例如 (r <= 1 AND theta in [30°, 90°])。 现在,我正在 objective 函数内计算我的 r 和 theta 坐标,并在不在 [30°, 90°] 区域时将输出设置为 0。这在梯度法中似乎效果不佳(可能会卡在“0 区”而不会返回)。有没有人看到在组定义中定义它的方法?我在文档中没有看到任何这样的例子 http://openmdao.readthedocs.io/en/1.7.3/index.html

是的,它卡住了,因为 objective 在 [30, 90] 之外的任何地方都为零,所以如果你最终(或开始)在那个区域,当通过探索在本地测量时梯度为零附近的点。我认为更好的方法是允许 objective 函数在所有角度输出,但在角度上添加一些额外的限制以将其保持在 30 到 90 度之间。