这可以通过您在其中提到的组之外的组上的单个 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()
上面的 sn-p 剩下的是将值连接到 balance.y1_target 和 balance.y2_target 或在设置后设置它们的代码。