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



我正试图求解以下方程组=

 -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.linal.solve函数。我总是得到这样的错误::numpy.linalg.LinAlgError:奇异矩阵。我知道我已经通过使一行元素为零创建了一个奇异矩阵。

我的矩阵&代码::

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.lssq返回::

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

我应该如何从上面的数组中获得解决方案??。。上面数组中的no都不是解决方案。。

您的调用顺序是正确的,尽管我会拉出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)

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

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

在这种情况下是:

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

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

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

NxN的情况下,这将是零。

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。)

天哪!!!!。问题出在最后一个方程式上。如果你把前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)

应该是平方非奇异矩阵

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

相关内容

  • 没有找到相关文章