各个设计变量的FD步长

时间:2015-11-06 19:16:05

标签: openmdao

我对如何在各个设计变量上指定FD步长有点困惑。在旧的OpenMDAO中,可以在添加desvar时指定步长。在新版本中,add_desvar没有这个参数,所以我试着在IndepVarComp的fd_options上设置它,这也没有用。我不太直观,我必须在下游组件上设置它。但是如果我必须这样做,我如何在设置时在每个单独的参数上设置它?我可能遗漏了一些内容,但是您可以在下面的示例中告诉我如何操作,我尝试将prob.root.sub.p1的步长设置为force_fd整个问题。

from openmdao.api import Component, Group, Problem, IndepVarComp

class MyComp(Component):

    def __init__(self):
        super(MyComp, self).__init__()

        # Params
        self.add_param('x1', 3.0, step_size = 1e-2)
        self.add_param('x2', 3.0)

        # Unknowns
        self.add_output('y', 5.5)

    def solve_nonlinear(self, params, unknowns, resids):
        """ Doesn't do much. """
        unknowns['y'] = 7.0*params['x1']**2 + 7.0*params['x2']**2

prob = Problem()
prob.root = Group()
sub = prob.root.add('sub', Group())
comp = prob.root.add('comp', MyComp())
p1 = sub.add('p1', IndepVarComp([('x1', 3.0), ('x2', 3.0)]))

# this has no effect
prob.root.sub.p1.fd_options['step_size'] = 1.0e-1



prob.root.connect('sub.p1.x1', 'comp.x1')
prob.root.connect('sub.p1.x2', 'comp.x2')

prob.root.fd_options['force_fd'] = True 

prob.setup(check=False)
prob.run()

J = prob.calc_gradient(['sub.p1.x1', 'sub.p1.x2'], ['comp.y'], return_format='dict')

print J

如果我在System.fd_jacobian打印mydict并且我看到步长:

('mydict', {'shape': 1, 'step_size': 0.01, 'pathname': 'comp.x1', 'val': 3.0, 'promoted_name': 'comp.x1', 'top_promoted_name': 'comp.x1', 'size': 1})
('FD', 'comp.x1', 0.01)
('mydict', {'val': 3.0, 'promoted_name': 'comp.x2', 'shape': 1, 'pathname': 'comp.x2', 'top_promoted_name': 'comp.x2', 'size': 1})
('FD', 'comp.x2', 1e-06)

{'comp.y': {'sub.p1.x1': array([[ 42.07]]), 'sub.p1.x2': array([[ 42.000007]])}}

谢谢!

1 个答案:

答案 0 :(得分:2)

你是对的,我们曾经在经典OpenMDAO的旧add_parameter调用(现在相当于add_desvar)上使用它,我们还没有重新实现它,所以看起来我们仍然需要这样做。

同时,控制var级别的步骤的唯一方法是在连接的step_size的下游目标中设置IndepVarComp,使用x1在你的例子中。这是一种可以实现您想要的解决方案,但不幸的是,它对于广播连接来说有点不直观且可能很乏味。