【发布时间】:2016-04-03 21:01:05
【问题描述】:
我在 Python Numpy 中编写了一个简单的线性代数代码,通过计算 $M^{-1}.A.M$(M 是模态矩阵)来计算特征值的对角线,它的工作很奇怪。
这是代码:
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]]
最终的“对角线”矩阵应该是一个对角线矩阵,其特征值在主对角线上,其他位置为零。但它不是...第一个主对角线值是特征值,但第二个不是(尽管就像两个第二个特征值一样,它们几乎为零)。
顺便说一句,像 $-1.06581410e-14$ 这样的数字实际上是零,那么我怎样才能让 numpy 将它们显示为零?
我做错了什么?
谢谢...
【问题讨论】:
-
提示:第 3 行 = 2*第 2 行 - 第 1 行
-
呃哦......那么......矩阵的行列式为零?和 det(A) = 特征值的乘积......并且特征值应该为零?如果我到这里为止都做对了,那么为什么 numpy 计算 EigenValues 而没有给出 0 作为答案?
-
一切正常。在浮点字中考虑任何
-
我可以告诉 numpy 将非常小的值转换为 null 或零吗?有时,如果您不小心,那些非常小的值的长度会欺骗您,并且您认为它们不是零……我希望我的最终矩阵是上下为零的对角线……并且具有 0因为行列式确实比'-7.09974814699e-30'之类的东西更有用!
-
这很正常 - 从某种意义上说,零特征值“告诉你矩阵是奇异的”。迭代地找到特征值,如果非对角线条目足够小,则停止迭代。您可能对对角线上的内容感兴趣,但对算法不感兴趣。
标签: python numpy linear-algebra eigenvalue eigenvector