找到满足输出参数子集的解决方案

问题描述

我刚开始使用 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_targetbalance.y2_target 或在设置后设置它们的代码。

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...