问题描述
我刚开始使用 openMDAO,所以我认为这应该是一个简单的问题。
我有一个复杂的组(具有显式组件和循环),我可以求解一组输入变量:
y1,y2,...,yi = Group(x1,x2,xj)
我现在要做的是匹配两个输出(y1_target 和 y2_target),改变组 (x1,x2) 中的两个输入,即从组中添加两个方程,例如,
y1_target - y1 = 0
y2_target - y2 = 0
我知道这应该用两个隐式组件来完成,但是¿我如何强制只更改 x1 和 x2?
谢谢,
解决方法
这可以通过在您提到的组之外的组上的单个 BalanceComp 完成。据我了解,该系统的简单图如下。
这里添加了一个 BalanceComp 来处理您的两个残差方程。 BalanceComp 是 OpenMDAO 中的一个隐式组件,它处理简单的“设置 X 等于 Y”的情况,就像你的情况一样。它的文档是 here。
在您的情况下,外部组(在下面的代码中称为 g_outer)将具有设置为满足两个残差方程的平衡补偿。子系统“组”是指您现有的组。
bal = g_outer.add_subsystem('balance',bal)
bal.add_balance('x1',lhs_name='y1_target',rhs_name='y1')
bal.add_balance('x2',lhs_name='y2_target',rhs_name='y2')
g_outer.connect('balance.x1','group.x1')
g_outer.connect('balance.x2','group.x2')
g_outer.connect('group.y1','balance.y1')
g_outer.connect('group.y2','balance.y2')
另一个绝对关键的集合是设置 g_outer
的非线性和线性求解器。默认求解器仅适用于显式系统。这个隐式系统需要一个用于非线性求解器的 NewtonSolver 和一些迭代线性求解器。 DirectSolver 通常可以正常工作,除非系统非常大。
g_outer.nonlinear_solver = om.NewtonSolver(solve_subsystems=True)
g_outer.linear_solver = om.DirectSolver()
上面的代码片段留下了将值连接到 balance.y1_target
和 balance.y2_target
或在设置后设置它们的代码。