【问题标题】:Solve non square linear system with Math.net用 Math.net 求解非线性方程组
【发布时间】:2020-01-16 08:14:40
【问题描述】:

我正在尝试使用 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);

明确系统有解决方案(例如X = {0, 0, 0, 0, 3, 5, 2})。 如何使用 Math.Net 解决这样的系统?

【问题讨论】:

  • 您是否尝试检查矩阵是否实际上是 3x7 而不是 7x3?
  • @ZenZac yes A.Transpose().Solve(b) 给出另一个错误(所有向量必须具有相同的维度)
  • 您的矩阵 A 似乎是 3x7,而您的矩阵 B 似乎是 1x3。尝试转置 B。
  • b 是一个向量。你不能转置向量。
  • 不是同一个库,但这应该提供更多信息:tutorialspoint.com/matlab/matlab_vector_transpose.htm

标签: c# linear-algebra math.net


【解决方案1】:

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

        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;

【讨论】:

  • 谢谢,有道理。我曾期望 Solve 方法可以找到任何解决方案,即使不是唯一的。使用伪逆是个好主意。
猜你喜欢
  • 2017-10-10
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多