我有一个问题,我正在求解一个线性方程组,但有时该系统会产生一个不容易求解的奇异矩阵。在这种情况下,我希望那些系统定义不明确的行将被计算为 0。我怎么能保证呢?
一个示例矩阵:
我希望的结果是:
我尝试使用最小二乘法,但实际上没有必要得到一个对定义不明确的行具有零的解决方案,因为它试图最小化而不是本身。
上面矩阵的一些性质:对角线总是有元素,其他元素来自,每行之和总是 or 1 or 0. 右边的向量只能包含 0 或 1 个元素.
我有一个问题,我正在求解一个线性方程组,但有时该系统会产生一个不容易求解的奇异矩阵。在这种情况下,我希望那些系统定义不明确的行将被计算为 0。我怎么能保证呢?
一个示例矩阵:
我希望的结果是:
我尝试使用最小二乘法,但实际上没有必要得到一个对定义不明确的行具有零的解决方案,因为它试图最小化而不是本身。
上面矩阵的一些性质:对角线总是有元素,其他元素来自,每行之和总是 or 1 or 0. 右边的向量只能包含 0 或 1 个元素.
如果您愿意最小化解的 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,其余元素为 0。然后我们解决了原始问题。
对于上面的例子,我们从:
删除最后一行和最后一列:
删除第二行和第二列:
其余的是结果行。我们在原始矩阵中修改它们:
有了这个,我们可以正常求解矩阵方程。