为什么当我尝试对角化对称矩阵时,'np.linalg.eig' 不返回一个酉矩阵?



使用Python,我创建了一个对称矩阵X,并使用代码Lambda, U = np.linalg.eig(X)对角化它。我的理解是:由于X是对称的,U应该是酉的,但我发现情况并非如此,因为U的特征值没有1的绝对值,这也意味着这也不是缩放问题。我的问题是为什么U不是单一的?


下面是一个最小可重复的例子,看看我得到了什么:

import numpy as np
#Symmetric matrix, which should be diagonalized by unitary
X = np.array([[-1.1918157 ,  0.        ,  0.        ,  0.        ,  0.09852097,
0.        ,  0.        ,  0.        ],
[ 0.        , -1.1918157 ,  0.        ,  0.        ,  0.        ,
0.09852097,  0.        ,  0.        ],
[ 0.        ,  0.        , -1.08529969,  0.        ,  0.        ,
0.        ,  0.07826825,  0.        ],
[ 0.        ,  0.        ,  0.        , -1.08529969,  0.        ,
0.        ,  0.        ,  0.07826825],
[ 0.09852097,  0.        ,  0.        ,  0.        , -1.00585682,
0.        ,  0.        ,  0.        ],
[ 0.        ,  0.09852097,  0.        ,  0.        ,  0.        ,
-1.00585682,  0.        ,  0.        ],
[ 0.        ,  0.        ,  0.07826825,  0.        ,  0.        ,
0.        , -0.98276093,  0.        ],
[ 0.        ,  0.        ,  0.        ,  0.07826825,  0.        ,
0.        ,  0.        , -0.98276093]])
#check if X is symmetric
assert np.linalg.norm(X - X.conj().T) == 0
#diagonalize X
Lambda, U = np.linalg.eig(X)
#check if U is unitary
print(
np.allclose(U @ U.conj().T, np.identity(U.shape[0])),
np.allclose(U.conj().T,     np.linalg.inv(U))
)
#Since the above returns false, how non-unitary is it?
print(
np.linalg.norm(U @ U.conj().T - np.identity(U.shape[0])),
np.linalg.norm(U.conj().T - np.linalg.inv(U))
)
上面代码的输出是:
False False
0.994793051566498 1.1641788210519939

不能保证返回一个酉矩阵。

#diagonalize X
Lambda, U = np.linalg.eig(X)

从这行代码中,您发现X的特征值(存储在Lambda中)及其右特征向量(存储在矩阵U中)。

这里唯一的酉项是特征向量,它们是U

In [4]: np.linalg.norm(U, axis=0)
Out[4]: array([1., 1., 1., 1., 1., 1., 1., 1.])

阅读更多关于特征值和特征向量:wiki, wolfram

最新更新