【发布时间】:2017-10-10 01:29:42
【问题描述】:
当矩阵的实际解之一为 0 时,我试图在 Math.Net 中求解矩阵,但我得到 -NaN- 作为结果。
这是一个为简单起见已经简化的示例矩阵。
1 0 1 | 10000
0 1 -1 | 1000
0 0 0 | 0
代码示例:
public void DoExample()
{
Matrix<double> A = Matrix<double>.Build.DenseOfArray(new double[,] {
{ 1, 0, 1 },
{ 0, 1, -1 },
{ 0, 0, 0 },
});
Vector<double> B = Vector<double>.Build.Dense(new double[] { 10000, 1000, 0 });
var result = A.Solve(B);
}
我希望得到的解决方案是 [ 10000, 1000, 0 ]。
如你所见,我想要的结果已经是增广向量。这是因为我在此示例中使用 Gauss-Jordan 手动将矩阵简化为简化的行梯形 (RREF)。如果我可以在 Math.Net 中以某种方式使用 Gauss-Jordan 运算来执行此操作,我可以检查 RREF 矩阵中存在全 0 行的情况。这个可以吗?
否则,我有什么方法可以识别何时 0 是使用现有 Math.Net 线性代数求解器运算的变量之一的唯一可能解决方案?
谢谢!
【问题讨论】:
-
尝试 SVD 求解器。它会用你的退化矩阵做最好的事情。如您所见,您有三个未知数,但只有两个方程。您能做的最好的事情就是根据另外两个解决三个中的一个。
-
达菲莫,谢谢。我非常关注这个问题,因为我的预期值之一是 0,以至于我错过了这个问题。也许我可以开始用我的应用程序替换以前已知的“好”值,以便在这些情况下欺骗合理的解决方案。有没有办法检测哪个变量是免费的(或缺乏足够的清晰度)?
-
这三个变量中的任何一个都可以被认为是“免费的”。在这种情况下,第三个是自然的 b/c 它的行全为零。
-
哦,SVD求解器在使用solve方法时也会失败。我不知道使用迭代求解器方法是否会有所帮助。 (我完全迷失了这些,因为在线文档令人生畏,我找不到好的例子。)
-
在我的名字中搜索 SVD。前段时间详细浏览了一遍。 stackoverflow.com/questions/19763698/…
标签: c# .net math matrix math.net