0

我有两个组件 comp1 和 comp2 形成问题,应该运行几次。为此,我发现我可以使用 UniformDriver(我不知道这是否最适合我的目的)。但是,我想将 comp2 的输出反馈到 comp1。所以在第一次运行之后,我从 comp2 获得输出,下一次运行应该是 comp1 的输入。我认为以下示例使我想做什么更清楚:

from openmdao.api import Component, Group, Problem, UniformDriver


class Times2Plus(Component):
    def __init__(self):
        super(Times2Plus, self).__init__()
        self.add_param('x', 1.0)
        self.add_param('z', 2.0)
        self.add_output('y', shape=1)

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['y'] = params['x'] * 2.0 + params['z']

class Power3(Component):
    def __init__(self):
        super(Power3, self).__init__()
        self.add_param('y', shape=1)
        self.add_output('x', shape=1) # feedback to params['x'] as input in next run

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['x'] = params['y'] ** 3.0

prob = Problem(root=Group())
prob.driver = UniformDriver(num_samples=5)
prob.root.add('comp1', Times2Plus())
prob.root.add('comp2', Power3())
prob.root.connect('comp1.y', 'comp2.y')
prob.setup()
prob.run()

基本上,前一次运行的组件 Power3 的输出 x 应连接到组件 Times2Plus 的输入 x。此外,我有一些参数 z,我事先知道,用于组件 Times2Plus,每次运行都不同。包含此更改参数和反馈选项的最佳方式是什么?

4

1 回答 1

0

在这种情况下,您不需要驱动器。您说的是求解器(与 OpenMDAO > 1.0 中的驱动程序不同)。

您可以在我们的 Sellar 示例中看到如何使用非线性高斯 Seidel设置此类事物的示例。基本上,您只需要以循环方式连接组件,然后添加适当的求解器以确保它们收敛。

于 2015-11-20T18:41:46.310 回答