【发布时间】:2019-08-15 08:05:15
【问题描述】:
对于一个对称实矩阵A,可以分解为A=Q'UQ,其中Q是特征向量, U是特征值矩阵,Q'是Q的转置矩阵。但是,当我使用numpy.linalg.eig() 计算特征值和特征向量时,
在某些情况下,结果是正确的,而在另一些情况下,结果是错误的。例如:
-
A = [[3, -1, -1, -1], [-1, 3, -1, -1], [-1, -1, 3, -1], [-1, -1, -1, 3]] -
A = [[1, 0, -1, 0], [0, 1, -1, 0], [-1, -1, 3, -1], [0, 0, -1, 1]]
在Case1中,原矩阵A可以重构成功,但在Case2中重构失败。对于第二种情况矩阵,我手动计算特征值和特征向量。结果是对的,如下图。我真的很想知道为什么?!
实验代码如下:
import numpy as np
import scipy.linalg as spl
N = 4
# case 1
# A = np.array([[3, -1, -1, -1], [-1, 3, -1, -1], [-1, -1, 3, -1], [-1, -1, -1, 3]])
# case 2
A = np.array([[1, 0, -1, 0], [0, 1, -1, 0], [-1, -1, 3, -1], [0, 0, -1, 1]])
lam, vec = np.linalg.eig(A)
# calculate the orthonormal eigenvectors matrix Q
vec = spl.orth(vec)
# orthonormal eigenvectors matrix Q calculated by hand in case 2
# vec = np.array([[np.sqrt(12)/12, np.sqrt(12)/12, -3*np.sqrt(12)/12, np.sqrt(12)/12], [np.sqrt(4)/4, np.sqrt(4)/4, np.sqrt(4)/4, np.sqrt(4)/4], [-np.sqrt(2)/2, np.sqrt(2)/2, 0, 0], [-np.sqrt(6)/6, -np.sqrt(6)/6, 0, 2*np.sqrt(6)/6]]).T
# calculate eigenvalues matrix U
lam_matrix = np.zeros((N,N))
i_0 = [i for i in range(N)]
j_0 = [i for i in range(N)]
lam_matrix[i_0, j_0] = lam
# print the experimental result
print('#### Result ####')
print('eigenvalues')
print(lam)
print('eigenvectors')
print(vec)
print('orthogonality of eigenvectors')
print(vec.T.dot(vec))
print('reconstruct the orginal matix')
print(vec.dot(lam_matrix).dot(vec.T))
【问题讨论】: