令人困惑的行为numpy.linalg.eig(一个可能严重的问题)

令人困惑的行为numpy.linalg.eig(一个可能严重的问题),numpy,floating-accuracy,eigenvalue,Numpy,Floating Accuracy,Eigenvalue,考虑以下简单的代码: import numpy as np A = np.array([[0,1,1,0],[1,0,0,1],[1,0,0,1],[0,1,1,0]], dtype=float) eye4 = np.eye(4, dtype=float) # 4x4 identity H1 = np.kron(A,eye4) w1,v1 = np.linalg.eig(H1) H1copy = np.dot(np.dot(v1,np.diag(w1)),np.transpose(v1))

考虑以下简单的代码:

import numpy as np

A = np.array([[0,1,1,0],[1,0,0,1],[1,0,0,1],[0,1,1,0]], dtype=float)
eye4 = np.eye(4, dtype=float)  # 4x4 identity

H1 = np.kron(A,eye4)
w1,v1 = np.linalg.eig(H1)
H1copy = np.dot(np.dot(v1,np.diag(w1)),np.transpose(v1)) # reconstructing from eigvals and eigvecs

H2 = np.kron(eye4,A)
w2,v2 = np.linalg.eig(H2)
H2copy = np.dot(np.dot(v2,np.diag(w2)),np.transpose(v2))

print np.sum((H1-H1copy)**2)  # sum of squares of elements
print np.sum((H2-H2copy)**2)  
它产生输出

1.06656622138
8.7514256673e-30
这是非常令人困惑的。这两个矩阵仅在kronecker乘积的顺序上不同。然而,仅仅在其中一种情况下,准确率是如此之低。此外,根据我的观点,范数平方误差>1.066是非常不可接受的。这里出了什么问题?
此外,考虑到特征值分解只是代码的一小部分,必须运行几次(>100次),解决这个问题的最佳方法是什么。使用而不是


如果您使用
eig
v1
的转置不一定等于
v1

的倒数,非常感谢。我确实只需要使用eigh。