0

我有一个方程组,其形式为:

轴 = b

其中 A 和 b 是已知状态和从早期组件派生的状态速率的混合,x 是四个未知状态速率的向量。我已经使用 Matlab 将问题线性化,我现在需要做的就是创建一些组件来找到 x。但是,就每个索引中的变量数量而言,A 的倒数很大,所以我不能将它们变成一个简单的线性方程。有人可以建议一条路线吗?

4

1 回答 1

1

我不完全理解您所说的“A 的倒数就每个索引中的变量数量而言很大”是什么意思,但是我认为 A 的倒数更大更密集以计算和存储在内存中。

OpenMDAO 与否,当您遇到这种情况时,您不得不使用迭代线性求解器,例如 gmres。所以这也是这里需要的方法。

OpenMDAO 确实有一个LinearSystemComponent,您可以在这里将其用作粗略的蓝图。但是,它确实会计算分解并存储它,这不是您想要的。无论如何,它为您提供了如何在 OpenMDAO 中将线性系统表示为隐式组件的蓝图。

从广义上讲,您必须考虑定义线性残差:R = Ax-b = 0

您的组件将有两个输入Ab,和 一个输出x

这里的两个关键方法是apply_nonlinearsolve_nonlinear。我意识到nonlinear方法名称中的单词令人困惑。OpenMDAO 假设分析是非线性的。在您的情况下,它恰好是线性的,但是您使用的nonlinear方法都是一样的。

我会假设,尽管您不能计算/存储 [A] 逆,但您可以计算/存储 A(可能是稀疏格式)。在这种情况下,您可以将 [A] 的稀疏数据数组作为输入传递,并根据需要填充稀疏矩阵。

apply_nonlinear方法如下所示:

def apply_nonlinear(self, inputs, outputs, residuals):
        """
        R = Ax - b.
        Parameters
        ----------
        inputs : Vector
            unscaled, dimensional input variables read via inputs[key]
        outputs : Vector
            unscaled, dimensional output variables read via outputs[key]
        residuals : Vector
            unscaled, dimensional residuals written to via residuals[key]
        """
        
        residuals['x'] = inputs['A'].dot(outputs['x']) - inputs['b']

你的问题的关键是真的solve_nonlinear method。它看起来像这样(使用 scipy gmres)

def solve_nonlinear(self, inputs, outputs):
        """
        Use numpy to solve Ax=b for x.
        Parameters
        ----------
        inputs : Vector
            unscaled, dimensional input variables read via inputs[key]
        outputs : Vector
            unscaled, dimensional output variables read via outputs[key]
        """
    
        
        x, exitCode = gmres(inputs['A'], inputs['b'])

        outputs['x'] = x
于 2021-02-12T00:14:04.973 回答