首页 > 解决方案 > 在 C# 中求解一个欠定的线性方程组

问题描述

我需要在 c# 中求解一个欠定的线性方程组。例如

欠定线性方程组:
x + 3 = y + z
x + w =​​ 2

结果:
x = r1
y = -r2 + r1 + 3
z = r2
w = 2 - r1
现在我用 3 和 4 初始化 r1 和 r2 以获得我的结果之一。

我尝试像这样在 c# 中使用 Math.Net

using MathNet.Numerics.LinearAlgebra;
namespace SolveLinearEquations
{
    class Program
    {
        static void Main(string[] args)
        {
            var A = Matrix<double>.Build.DenseOfArray(new double[,] {
                { 1, -1, -1, 0 },
                { 1, 0, 0, 1 }
            });
            var B = Vector<double>.Build.Dense(new double[] { -3, 2 });
            var X = A.Solve(B);
        }
    }
}

但我接受这样的例外

System.ArgumentException: 'Matrix dimensions must agree: 2x4.'

不能 Math.Net 解决一个欠定的线性方程组或......?什么是最好的解决方案?

标签: c#.netmath.net

解决方案


这里有三种方法可以尝试。

1)通过添加另一个方程来改变你未确定的系统。例如,如果您得到 r1<0,则添加等式 r1 = a for some a >= 0;

2)将您的问题重铸为线性规划问题。这将使您能够添加约束,并且您可以构建目标函数以获得您喜欢的结果。据我所知,这不是 MathNet 直接支持的,但这里有一个解决方案的尝试:http: //type-nat.ch/post/lp-simplex-draft/

3) 使用通用的最小化函数。根据系统方程将要最小化的函数定义为误差项的总和。例如,将 y=mx+b 更改为 (y-(mx+b))^2。对于约束,添加条件误差项,例如 c = if (r1<0, r1^2, else 0)


推荐阅读