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
您的组件将有两个输入 A
和 b
,以及一个输出 x
。
这里的两个关键方法是apply_nonlinear
和solve_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
我有一个方程组,其形式为:
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
您的组件将有两个输入 A
和 b
,以及一个输出 x
。
这里的两个关键方法是apply_nonlinear
和solve_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