【问题标题】:Find a solution that fulfils a subset of output parameters找到满足输出参数子集的解决方案
【发布时间】:2021-04-04 17:48:20
【问题描述】:

我是使用 openMDAO 的新手,所以我认为这应该是一个简单的问题。

我有一个复杂的组(具有明确的组件和循环),我可以解决一组输入变量:

y1, y2,..., yi = Group(x1, x2,..., xj)

我现在要做的是匹配两个输出(y1_target 和 y2_target),改变组(x1,x2)中的两个输入,即在组外添加两个方程,例如,

y1_target - y1 = 0

y2_target - y2 = 0

我知道这应该使用两个隐式组件来完成,但是 ¿我如何强制只更改 x1 和 x2?

谢谢,

【问题讨论】:

    标签: implicit openmdao


    【解决方案1】:

    这可以通过您在其中提到的组之外的组上的单个 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_targetbalance.y2_target 或在设置后设置它们的代码。

    【讨论】:

    • 感谢您的解释。这是我的第一次尝试,但我认为系统试图平衡 y1 与 x1,以及 y2 与 x2,但未能找到解决方案。
    • 这个问题我已经解决了,要同时换x1和x2才能找到解决办法。 (问题是我必须避免阻塞条件,该组件是涡轮级的平均线求解器)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多