我正在尝试解决以下方程组=

 -14a +   b +            e = 0
   2a - 14b +        d     = 0
          b  -14c  +2d     = 0
                  -15d + e = 0
          +  2c       -14e = 0
    a +   b + c  +  d +  e = 1

我将所需的零附加到由上述方程形成的矩阵。我使用了 numpy.linalg.solve 函数。我总是收到这个错误:: numpy.linalg.linalg.LinAlgError: Singular matrix。
我知道我通过使一行元素为零创建了一个奇异矩阵。

我的矩阵和代码::
a= np.array([
    [-14, 1, 0, 0, 1, 0],
    [2, -14, 0, 1, 0, 0],
    [0, 1, -14, 2, 0, 0],
    [0, 0, 0, -15, 1, 0],
    [0, 0, 2, 0, -14, 0],
    [1, 1, 1, 1, 1, 0]
])

b=np.array(   [0, 0, 0, 0, 0, 1]      )

x = np.linalg.solve(a, b)

有没有另一种方法来解决这个问题?

使用 np.linalg.lstsq 返回::
(array([ 0.00674535,  0.00713199,  0.00709352,  0.00582019,  0.006766  ,  0.
]), array([], dtype=float64), 5, array([ 15.88397122,  15.68586038,  14.59368088,  13.14182044,
    12.12312981,   0.        ]))

我应该如何从上面的数组中获得我的解决方案??.. 没有。在上面的数组中是解决方案..

最佳答案

您的调用顺序是正确的,但我会拉出 A 的最后一列:

A = np.array([
        [-14, 1, 0, 0, 1],
        [2, -14, 0, 1, 0],
        [0, 1, -14, 2, 0],
        [0, 0, 0, -15, 1],
        [0, 0, 2, 0, -14],
        [1, 1, 1, 1, 1  ]])
b = np.array([0, 0, 0, 0, 0, 1])

sol = np.linalg.lstsq(A, b)

正如其他人所提到的,您的系统是 overdetermined 。这意味着任何适合都可能是糟糕的。事实上, np.linalg.lstsq 返回残差:



在这种情况下是:
print sol[1]
>>> array([0.96644295])

这表明拟合很差(这里没有近似线性解)。我们可以通过再次检查看到:
print (b - np.dot(A, sol[0])).sum()
>>> 1.36912751678

NxN 情况下这将是零。

关于python - 使用 numpy 使用 6 个线性方程求解 5 个变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20074672/

10-13 09:52