仅对某些角度声明约束
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 度之间。
我不确定我的问题是否足够清楚,请告诉我任何更改以便澄清!
我有一个群组:
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 度之间。