是否故意在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'])
答案 0 :(得分:1)
答案是......有点儿。
在OpenMDAO< = 1.x中,我们始终严格执行给定的边界值。但是,我们发现这在你设置变量绑定的常见情况下会引起一些问题,但它真的是“软”#34;。我的意思是,如果它在收敛期间超出界限,你就不会介意,但最终必须满足。
因此,在1.x中,我们对边界信息的处理方式不同。牛顿求解器通过阻止更新步骤违反它们来严格尊重边界。驱动程序可以访问边界数据,并可以使用它们执行他们喜欢的操作。但是框架不会因为你设置一个超出边界的值而抛出错误。
如果您希望在其中一个组件上执行此操作,我建议您使用子类Component并修改_sys_solve_nonlinear和_sys_apply_nonlinear方法以执行某些边界检查并抛出错误(如果有的话)参数/未知数违反给定的界限。