我不确定我的问题是否足够明确,请告诉我任何改变以澄清!
我有一个小组:
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
中看到任何这样的示例答案 0 :(得分:2)
是的,因为物镜在[30,90]之外的任何地方都是零,所以它会卡住,所以如果你在那个区域结束(或开始),当通过探索附近的点在本地测量时,梯度为零。我认为更好的方法是在所有角度允许目标函数的输出,但在角度上添加一些额外的约束以使其保持在30到90度之间。