OpenMDAO 如何在不反转 A 矩阵的情况下用于求解线性方程组?

How can OpenMDAO be used to solve a linear system of equations without inverting the A matrix?

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

Ax = b

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

我不完全理解你所说的“A 的倒数在每个索引中的变量数量方面很大”是什么意思,但是我认为 A 的倒数对于计算来说更大更密集并存储在内存中。

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

OpenMDAO 在 OpenMDAO 中确实有一个 LinearSystemComponent that you can use as a rough blueprint here. However, it does compute a factorization and store it which is not what you want. Regardless, it gives you the blueprint for how to represent a linear system as an implicit component

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

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

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

我会假设,虽然你不能 compute/store [A] 逆,但你可以 compute/store 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。它看起来像这样 (using 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