使用numpy使用6个线性方程求解5个变量

时间:2013-11-19 14:50:56

标签: python numpy linear singular

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

 -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:奇异矩阵。 我知道我通过将一行元素设为零来创建一个奇异矩阵。

我的矩阵& code ::

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.        ]))

我怎么能从上面的数组中得到我的解决方案??没有没有。在上面的数组是解决方案..

3 个答案:

答案 0 :(得分:5)

你的通话顺序是正确的,但我会提取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会返回残差:

  

残差:{(),(1,),(K,)} ndarray   残差总和; b - a * x中每列的欧几里德2范数平方。如果a的等级是< N或> M,这是一个空数组。如果b是1维的,则这是(1)形状阵列。否则形状为(K,)。

在这种情况下是:

print sol[1]
>>> array([0.96644295])

这表明拟合非常差(这里没有近似线性解)。我们可以再次检查:

print (b - np.dot(A, sol[0])).sum()
>>> 1.36912751678

NxN案例中为零。

答案 1 :(得分:3)

np.linalg.solve的第二个参数应该是一维数组,而不是行向量:

>>> np.linalg.solve(a, b.ravel())
Traceback (most recent call last):
  File "<ipython-input-13-81809fe2e837>", line 1, in <module>
    np.linalg.solve(a, b.ravel())
  File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 328, in solve
    raise LinAlgError('Singular matrix')
LinAlgError: Singular matrix

(它仍然不起作用,但那是因为a是单数,np.linalg.det(a) == 0.0。最好先尝试np.linalg.lstsq。)

答案 2 :(得分:0)

天啊!!!!问题在于最后一个等式。如果你把前5个等式加起来

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

你得到..

 a + b + c + d + e = 0

因此,给定系统中的最后一个等式是 不正确 。即。

 a + b + c + d + e = 1

初始情况error:: numpy.linalg.linalg.LinAlgError: Singular matrix是由于您需要系统矩阵a,如代码所示:

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

应该是 square 非奇异矩阵

 >> help(np.linalg.solve)
 solve(a, b)
Solve a linear matrix equation, or system of linear scalar equations.

Computes the "exact" solution, `x`, of the well-determined, i.e., full
rank, linear matrix equation `ax = b`.

Parameters
----------
a : (..., M, M) array_like
    Coefficient matrix.
b : {(..., M,), (..., M, K)}, array_like
    Ordinate or "dependent variable" values.

Returns
-------
x : {(..., M,), (..., M, K)} ndarray
    Solution to the system a x = b.  Returned shape is identical to `b`.

Raises
------
LinAlgError
    If `a` is singular or not square.

包括用于求解5变量的6个方程导致非方形系统矩阵(5x6)。

但是,方程式系统的全部结合本身是不正确的。

这个问题的简单解决方案就是:

[0.0, 0.0, 0.0, 0.0, 0.0]