求解具有最小解的奇异线性方程组?

计算科学 线性求解器
2021-12-13 12:15:12

我有一个问题,我正在求解一个线性方程组,但有时该系统会产生一个不容易求解的奇异矩阵。在这种情况下,我希望那些系统定义不明确的行将被计​​算为 0。我怎么能保证呢?

一个示例矩阵:

[1010010.30.710100001]x=[0001]

我希望的结果是:x

[00.701]

我尝试使用最小二乘法,但实际上没有必要得到一个对定义不明确的行具有零的解决方案,因为它试图最小化而不是本身。|Axb||x|

上面矩阵的一些性质:对角线总是有元素,其他元素来自,每行之和总是 or 1 or 0. 右边的向量只能包含 0 或 1 个元素.1[1,0]

2个回答

如果您愿意最小化解的 2 范数而不是最小化非零的数量,则可以使用伪逆。要在 MATLAB 中求解 A*x = b,那就是 pinv(A)*b。在您的示例中,这会产生 1.2120 的 2 范数解决方案,而您的首选解决方案 1.2207 的 2 范数。

您可以通过最小化 x 的一范数来更接近您的目标,前提是 A*x=b。那是一个线性规划问题。在这种情况下,它会产生您喜欢的结果,但不能保证通常会最小化非零的数量(除非您的 A 和 b 的特殊属性最终会这样做?)。

你真正想要的是最小化 x 的 0 范数,服从 A*x=b。您可以将其作为混合整数线性规划问题解决,方法是使用大 M 方法来最小化 x 的元素数量,这些元素的数量大于某个数值容差,例如 1e-6,从 0 开始。这在 MATLAB 下的 YALMIP 中很容易做到使用 YALMIP 的“暗示”,但比前面提到的方法计算量更大。

我想我找到了解决办法。我认为以下算法可以解决问题。

  1. 定义一组受限索引M
  2. 的所有行的索引填充(等于:其元素之和为的所有行;或者,所有非对角线元素为的所有行)。M110
  3. 删除与这些索引对应的所有行和列。
  4. 添加(原始)索引的每一行(其元素在这个简化矩阵中的总和)为0M
  5. 如果您添加了此类索引,请转到步骤 3。
  6. 否则,您会留下使矩阵定义不明确的行。

在原始矩阵中,我们现在可以更改中缺少索引的所有行,这样对于这些行,只有对角线元素为 1,其余元素为 0。然后我们解决了原始问题。M

对于上面的例子,我们从:

[1010010.30.710100001]

删除最后一行和最后一列:

[101010.3101]

删除第二行和第二列:

[1111]

其余的是结果行。我们在原始矩阵中修改它们:

[1000010.30.700100001]

有了这个,我们可以正常求解矩阵方程。