Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模态矩阵与对角特征值_Python_Numpy_Linear Algebra_Eigenvalue_Eigenvector - Fatal编程技术网

Python 模态矩阵与对角特征值

Python 模态矩阵与对角特征值,python,numpy,linear-algebra,eigenvalue,eigenvector,Python,Numpy,Linear Algebra,Eigenvalue,Eigenvector,我用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

我用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将它们显示为零呢

我做错了什么


谢谢…

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

>>> 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.       ]]
>>>
print(diagonal.round(5))

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

不要混淆计算精度和打印策略。

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

print(diagonal.round(5))

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

不要混淆计算精度和打印策略。

提示:第3行=2*第2行-第1行oh。。。然后矩阵的行列式是零?detA=特征值的乘积。。。特征值应该是零?如果我到现在都知道了,那为什么numpy计算特征值而不给出0作为答案呢?一切都没问题。在浮点字中考虑,任何值<1E-15都是空的。尝试diagonal.round13和matrix_rankarray。我可以告诉numpy将非常小的值转换为null或零吗?有时,如果你不小心,那些非常小的值的长度会欺骗你,你会认为它们不是零。。。我希望我的最终矩阵是一个上下有零的对角线。。。用0作为行列式比像'-7.09974814699e-30'这样的东西更有用!这是正常的——在某种意义上,零特征值“告诉你矩阵是奇异的”。迭代地找到特征值,如果非对角项足够小,则停止迭代。您可能对对角线上的内容感兴趣,但对算法不感兴趣。。。然后矩阵的行列式是零?detA=特征值的乘积。。。特征值应该是零?如果我到现在都知道了,那为什么numpy计算特征值而不给出0作为答案呢?一切都没问题。在浮点字中考虑,任何值<1E-15都是空的。尝试diagonal.round13和matrix_rankarray。我可以告诉numpy将非常小的值转换为null或零吗?有时,如果你不小心,那些非常小的值的长度会欺骗你,你会认为它们不是零。。。我希望我的最终矩阵是一个上下有零的对角线。。。用0作为行列式比像'-7.09974814699e-30'这样的东西更有用!这是正常的——在某种意义上,零特征值“告诉你矩阵是奇异的”。迭代地找到特征值,如果非对角项足够小,则停止迭代。你可能对对角线上的内容感兴趣,但对算法不感兴趣。你真是太好了!B.M.的答案有它自己的好处+1对B.M.你真是太好了!B.M.的答案对B.M.有自己的好处+1。