我有一个方程组,其形式为:
轴 = b
其中 A 和 b 是已知状态和从早期组件派生的状态速率的混合,x 是四个未知状态速率的向量。我已经使用 Matlab 将问题线性化,我现在需要做的就是创建一些组件来找到 x。但是,就每个索引中的变量数量而言,A 的倒数很大,所以我不能将它们变成一个简单的线性方程。有人可以建议一条路线吗?
我有一个方程组,其形式为:
轴 = b
其中 A 和 b 是已知状态和从早期组件派生的状态速率的混合,x 是四个未知状态速率的向量。我已经使用 Matlab 将问题线性化,我现在需要做的就是创建一些组件来找到 x。但是,就每个索引中的变量数量而言,A 的倒数很大,所以我不能将它们变成一个简单的线性方程。有人可以建议一条路线吗?
我不完全理解您所说的“A 的倒数就每个索引中的变量数量而言很大”是什么意思,但是我认为 A 的倒数更大更密集以计算和存储在内存中。
OpenMDAO 与否,当您遇到这种情况时,您不得不使用迭代线性求解器,例如 gmres。所以这也是这里需要的方法。
OpenMDAO 确实有一个LinearSystemComponent,您可以在这里将其用作粗略的蓝图。但是,它确实会计算分解并存储它,这不是您想要的。无论如何,它为您提供了如何在 OpenMDAO 中将线性系统表示为隐式组件的蓝图。
从广义上讲,您必须考虑定义线性残差:R = Ax-b = 0
您的组件将有两个输入A
和b
,和 一个输出x
。
这里的两个关键方法是apply_nonlinear
和solve_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