OpenMDAO> = 1.X.X没有强制执行上限和下限值?

时间:2016-09-19 00:20:21

标签: openmdao

是否故意在OpenMDAO> = 1.X.X中不再强制执行上限值和下限值?我原以为下面的例子应该给出一个错误。我可能错了,但我认为当一个组件在其输入变量范围之外进行评估时,OpenMDAO< = 1确实失败了。

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

class ExampleComponent(Component):
    def __init__(self):
        super(ExampleComponent, self).__init__()

        self.add_param('x', val=0.0, lower=-2., upper=2.)
        self.add_param('y', val=0.0, lower=-2., upper=2.)

        self.add_output('f_xy', shape=1)

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['f_xy'] = params['x'] ** 2 + params['y'] ** 2


if __name__ == "__main__":
    top = Problem()

    root = top.root = Group()

    root.add('p1', IndepVarComp('x', 3.0))
    root.add('p2', IndepVarComp('y', -4.0))
    root.add('p', ExampleComponent())

    root.connect('p1.x', 'p.x')
    root.connect('p2.y', 'p.y')

    top.setup()
    top.run()

    print(top['p.f_xy'])

1 个答案:

答案 0 :(得分:1)

答案是......有点儿。

在OpenMDAO< = 1.x中,我们始终严格执行给定的边界值。但是,我们发现这在你设置变量绑定的常见情况下会引起一些问题,但它真的是“软”#34;。我的意思是,如果它在收敛期间超出界限,你就不会介意,但最终必须满足。

因此,在1.x中,我们对边界信息的处理方式不同。牛顿求解器通过阻止更新步骤违反它们来严格尊重边界。驱动程序可以访问边界数据,并可以使用它们执行他们喜欢的操作。但是框架不会因为你设置一个超出边界的值而抛出错误。

如果您希望在其中一个组件上执行此操作,我建议您使用子类Component并修改_sys_solve_nonlinear_sys_apply_nonlinear方法以执行某些边界检查并抛出错误(如果有的话)参数/未知数违反给定的界限。