C# 用Math.net求解非线性方程组

C# 用Math.net求解非线性方程组,c#,linear-algebra,math.net,C#,Linear Algebra,Math.net,我想用Math.net来解一个非线性的平方方程组。 但我得到的误差矩阵维数必须一致:3x7 下面是一些示例代码: using MathNet.Numerics.LinearAlgebra; var mBuilder = Matrix<double>.Build; var vBuilder = Vector<double>.Build; var A = mBuilder.DenseOfArray(new double[,] { { 3, 2, 1, 5, -1, 0

我想用Math.net来解一个非线性的平方方程组。 但我得到的误差矩阵维数必须一致:3x7

下面是一些示例代码:

using MathNet.Numerics.LinearAlgebra;
var mBuilder = Matrix<double>.Build;
var vBuilder = Vector<double>.Build;
var A = mBuilder.DenseOfArray(new double[,]
{
    { 3, 2, 1, 5, -1, 0, 0 },
    { 2, 1, 1, 2, 0, -1, 0 },
    { 5, 1, 3, 4, 0, 0, -1 }
});
var b = vBuilder.DenseOfArray(new double[] { -3, -5, -2 });
Vector<double> x;
x = A.Solve(b);
使用MathNet.Numerics.linearlgebra;
var mBuilder=Matrix.Build;
var vBuilder=Vector.Build;
var A=姆比尔.登塞弗阵列(新双[,]
{
{ 3, 2, 1, 5, -1, 0, 0 },
{ 2, 1, 1, 2, 0, -1, 0 },
{ 5, 1, 3, 4, 0, 0, -1 }
});
varb=vBuilder.DenseOfArray(新的双[]{-3,-5,-2});
向量x;
x=A.解(b);
Cleary系统有一个解决方案(例如
X={0,0,0,0,3,5,2}
)。
如何使用Math.Net求解这样一个系统?

您不能使用矩阵。使用非方矩阵求解函数,因为矩形矩阵没有逆解和唯一解。谷歌“矩形矩阵的逆矩阵”提供了大量的解释。但是,您可以使用伪逆,如下所示

        var mBuilder = Matrix<double>.Build;
        var A = mBuilder.DenseOfArray(new double[,]
      {
          { 3, 2, 1, 5, -1, 0, 0 },
          { 2, 1, 1, 2, 0, -1, 0 },
          { 5, 1, 3, 4, 0, 0, -1 }
      });

        Matrix<double> b = Matrix<double>.Build.Dense(3, 1);
        b[0, 0] = -3.0;
        b[1, 0] = -5.0;
        b[2, 0] = -2.0;

        var p = A.PseudoInverse();
        var x = p * b;

        // verify
        var o = A * x;
var mBuilder=Matrix.Build;
var A=姆比尔.登塞弗阵列(新双[,]
{
{ 3, 2, 1, 5, -1, 0, 0 },
{ 2, 1, 1, 2, 0, -1, 0 },
{ 5, 1, 3, 4, 0, 0, -1 }
});
矩阵b=矩阵.构建.密集(3,1);
b[0,0]=-3.0;
b[1,0]=-5.0;
b[2,0]=-2.0;
var p=A.伪逆();
var x=p*b;
//核实
VarO=A*x;

不能使用矩阵。使用非方矩阵求解函数,因为矩形矩阵没有逆矩阵,也没有唯一解。谷歌“矩形矩阵的逆矩阵”提供了大量的解释。但是,您可以使用伪逆,如下所示

        var mBuilder = Matrix<double>.Build;
        var A = mBuilder.DenseOfArray(new double[,]
      {
          { 3, 2, 1, 5, -1, 0, 0 },
          { 2, 1, 1, 2, 0, -1, 0 },
          { 5, 1, 3, 4, 0, 0, -1 }
      });

        Matrix<double> b = Matrix<double>.Build.Dense(3, 1);
        b[0, 0] = -3.0;
        b[1, 0] = -5.0;
        b[2, 0] = -2.0;

        var p = A.PseudoInverse();
        var x = p * b;

        // verify
        var o = A * x;
var mBuilder=Matrix.Build;
var A=姆比尔.登塞弗阵列(新双[,]
{
{ 3, 2, 1, 5, -1, 0, 0 },
{ 2, 1, 1, 2, 0, -1, 0 },
{ 5, 1, 3, 4, 0, 0, -1 }
});
矩阵b=矩阵.构建.密集(3,1);
b[0,0]=-3.0;
b[1,0]=-5.0;
b[2,0]=-2.0;
var p=A.伪逆();
var x=p*b;
//核实
VarO=A*x;

您是否尝试检查矩阵是否实际为3x7而不是7x3?@ZenZac yes
A.Transpose().Solve(b)
给出另一个错误(所有向量必须具有相同的维数)您的矩阵A似乎是3x7,而矩阵b似乎是1x3。尝试转置B.B是一个向量。你不能转置向量。不是同一个库,但这应该会提供更多信息:你是否尝试检查矩阵是否为3x7而不是7x3?@ZenZac yes
A.transpose().Solve(b)
给出另一个错误(所有向量必须具有相同的维数)你的矩阵A似乎是3x7,而你的矩阵b似乎是1x3。尝试转置B.B是一个向量。你不能转置向量。不是同一个库,但这应该会提供更多信息:谢谢,这很有意义。我曾期望Solve方法能够找到任何解决方案,即使不是唯一的。使用伪逆是个好主意。谢谢,这很有意义。我曾期望Solve方法能够找到任何解决方案,即使不是唯一的。使用伪逆是一个好主意。