仅为某些角度声明约束

时间:2018-03-05 09:22:41

标签: python-2.7 openmdao

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

我有一个小组:

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和θ在[30°,90°]中)。 现在,我正在计算目标函数内的r和θ坐标,并在不在[30°,90°]区域时将输出设置为0。这似乎不适用于渐变方法(可以卡在“0区”而不回来)。有没有人看到在组定义中定义它的方法?我没有在文档http://openmdao.readthedocs.io/en/1.7.3/index.html

中看到任何这样的示例

1 个答案:

答案 0 :(得分:2)

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