jon*_*789 3 python numpy linear-algebra
我正在尝试解决以下方程式=
-14a + b + e = 0
2a - 14b + d = 0
b -14c +2d = 0
-15d + e = 0
+ 2c -14e = 0
a + b + c + d + e = 1
Run Code Online (Sandbox Code Playgroud)
我将所需的零附加到由上述方程形成的矩阵.我使用了numpy.linalg.solve函数.我总是得到这个错误:: numpy.linalg.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)
Run Code Online (Sandbox Code Playgroud)
还有另一种解决方法吗?
使用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. ]))
Run Code Online (Sandbox Code Playgroud)
我怎么能从上面的数组中得到我的解决方案??没有没有.在上面的数组是解决方案..
你的调用序列是正确的,但我会删除最后一列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)
Run Code Online (Sandbox Code Playgroud)
正如其他人提到的那样,你的系统是超定的.这意味着任何适合可能都是不好的.确实,np.linalg.lstsq返回残差:
残差:{(),(1,),(K,)} ndarray残差和; b - a*x中每列的欧几里德2范数平方.如果a的等级是<N或> M,则这是一个空数组.如果b是1维的,则这是(1)形状阵列.否则形状为(K,).
在这种情况下是:
print sol[1]
>>> array([0.96644295])
Run Code Online (Sandbox Code Playgroud)
这表明拟合非常差(这里没有近似线性解).我们可以通过再次检查来看到:
print (b - np.dot(A, sol[0])).sum()
>>> 1.36912751678
Run Code Online (Sandbox Code Playgroud)
在这种NxN情况下,这将是零.