Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 求解值为0的线性方程组的数学.Net_C#_.net_Math_Matrix_Math.net - Fatal编程技术网

C# 求解值为0的线性方程组的数学.Net

C# 求解值为0的线性方程组的数学.Net,c#,.net,math,matrix,math.net,C#,.net,Math,Matrix,Math.net,当矩阵的一个实际解为0时,我试图在Math.Net中解一个矩阵,但得到的结果是-NaN-as 这里是一个示例矩阵,为了简单起见,已经对其进行了简化 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时,我试图在Math.Net中解一个矩阵,但得到的结果是-NaN-as

这里是一个示例矩阵,为了简单起见,已经对其进行了简化

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);
}
public void DoExample()
{
矩阵A=矩阵.Build.DenseOfArray(新双[,]{
{ 1, 0, 1 }, 
{ 0, 1, -1 }, 
{ 0, 0, 0 }, 
});
向量B=Vector.Build.Dense(新的双[]{10000,1000,0});
var结果=A.解算(B);
}
我希望得到的解决方案是[10000,1000,0]

正如你所看到的,我想要的结果已经是增广向量了。这是因为在本例中,我手动使用Gauss Jordan将矩阵简化为缩减行梯队形式(RREF)。如果我可以在Math.Net中使用Gauss Jordan运算来实现这一点,我可以检查RREF矩阵中是否存在全0行。这能做到吗

否则,当0是使用现有Math.Net线性代数解算器操作的其中一个变量的唯一可能解时,是否有任何方法可以识别


谢谢

这是2,您不能期望得到真正的解(有无穷多个解)

例如,迭代解算器实际上可以处理这个问题

using MathNet.Numerics.LinearAlgebra.Double.Solvers;
A.SolveIterative(B, new MlkBiCgStab());
返回

[10000, 1000, 0]

有趣的是,对于MKL本机提供程序,这也适用于正常的求解例程,但不适用于托管提供程序(如您所发现的),也不适用于OpenBLAS本机提供程序。

尝试SVD解算器。它将尽可能地利用你的退化矩阵。如你所见,你有三个未知数,但只有两个方程。你能做的最好的事情就是用另外两个来解其中一个。达菲莫,谢谢你。我对这个问题非常担心,因为我的一个期望值是0,所以我错过了这个。也许我可以开始用我的应用程序替换以前已知的“好”值,以便在这些情况下欺骗找到合理的解决方案。有没有办法检测哪个变量是自由的(或不够清晰)?三个变量中的任何一个都可以被视为“自由的”。在这种情况下,第三个是自然b/c,它的行都是零。哦,当使用solve方法时,SVD解算器也失败了。我不知道使用迭代求解方法是否有帮助。(我完全不知道这些,因为在线文档很吓人,我找不到好的例子。)搜索我的名字查找SVD。前一阵子我详细看过了@对于每个土豆,举个例子,
[99991001,1]
是这个方程组的一个很好的解决方案,就像你希望汉克斯·姆博和塞格尔为我解释这个一样。今天早上我没有想象力想出任何其他的解决办法。哇,这比我所希望的还要神奇!与替换可疑变量(如我上面提到的)不同,我将尝试此方法并简单地检查结果。谢谢你,克里斯托夫!那个解算器倾向于得到解决方案,只是并不总是我所期望的那个。例如,在将第1行移到前面的情况下运行相同的矩阵,会得到不同的解[0,11000,10000],因此相同的矩阵,但不同的结果取决于算法在场景中执行的操作。如果不提供一些输入,我真的不能依赖结果。我是否可以使用预条件提供可接受的值以尝试遵守?很抱歉,我没有找到预条件器如何工作的例子。我不确定我是否遵循了你的意思,将第1行移到前面-如果我切换A和B的第0行和第1行,我会得到完全相同的结果。你在你的案例中得到的仍然是正确的解决方案吗?对不起,我打错了。如果将第3行移到矩阵的顶部(现在是第1行),您将得到我提到的另一个解决方案。换句话说:A:{0,0,0},{1,0,1},{0,1,-1}B:{0,10000,1000}结果:{0,11000,10000}