Numpy - 模态矩阵和对角特征值

时间:2016-04-03 21:01:06

标签: python numpy linear-algebra eigenvalue eigenvector

我在Python Numpy中编写了一个简单的线性代数代码,通过计算$ M ^ { - 1} .AM $(M是模态矩阵)来计算EigenValues的对角线,并且它工作奇怪。

以下是代码:

import numpy as np

array = np.arange(16)
array = array.reshape(4, -1)
print(array)

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

eigenvalues, eigenvectors = np.linalg.eig(array)

print eigenvalues
[  3.24642492e+01  -2.46424920e+00   1.92979794e-15  -4.09576009e-16]

print eigenvectors
[[-0.11417645 -0.7327781   0.54500164  0.00135151]
 [-0.3300046  -0.28974835 -0.68602671  0.40644504]
 [-0.54583275  0.15328139 -0.2629515  -0.8169446 ]
 [-0.76166089  0.59631113  0.40397657  0.40914805]]

inverseEigenVectors = np.linalg.inv(eigenvectors) #M^(-1)
diagonal= inverseEigenVectors.dot(array).dot(eigenvectors) #M^(-1).A.M

print(diagonal)
[[  3.24642492e+01  -1.06581410e-14   5.32907052e-15   0.00000000e+00]
 [  7.54951657e-15  -2.46424920e+00  -1.72084569e-15  -2.22044605e-16]
 [ -2.80737213e-15   1.46768503e-15   2.33547852e-16   7.25592561e-16]
 [ -6.22319863e-15  -9.69656080e-16  -1.38050658e-30   1.97215226e-31]]

最终'对角线'矩阵应该是一个对角矩阵,主对角线上的EigenValues和其他地方的零。但它不是......两个第一个主要对角线值是特征值,而是两个第二个特征值(尽管就像两个第二个特征值一样,它们几乎为零)。

顺便说一句像$ -1.06581410e-14 $这样的数字实际上是零,所以我怎么能把numpy显示为零呢?

我做错了什么?

...谢谢

2 个答案:

答案 0 :(得分:3)

将最终结果四舍五入到所需的数字:

print(diagonal.round(5))

array([[ 32.46425,   0.     ,   0.     ,   0.     ],
       [  0.     ,  -2.46425,   0.     ,   0.     ],
       [  0.     ,   0.     ,   0.     ,   0.     ],
       [  0.     ,   0.     ,   0.     ,   0.     ]])

不要混淆计算和打印政策的精确度。

答案 1 :(得分:1)

>>> diagonal[np.abs(diagonal)<0.0000000001]=0
>>> print diagonal
[[ 32.4642492   0.          0.          0.       ]
 [  0.         -2.4642492   0.          0.       ]
 [  0.          0.          0.          0.       ]
 [  0.          0.          0.          0.       ]]
>>>