我正在尝试解决以下方程组=
-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/