1

我正在尝试使用 QR 方法找到矩阵 A 的特征向量。我找到了对应于最大特征值的特征值和特征向量。如何在不使用 numpy.linalg.eig 的情况下找到其余的特征向量?

import numpy as np

A = np.array([
    [1, 0.3],
    [0.45, 1.2]
])

def eig_evec_decomp(A, max_iter=100):
    A_k = A
    Q_k = np.eye(A.shape[1])
    
    for k in range(max_iter):
        Q, R = np.linalg.qr(A_k)
        Q_k = Q_k.dot(Q)
        A_k = R.dot(Q)

    eigenvalues = np.diag(A_k)
    eigenvectors = Q_k
    
    return eigenvalues, eigenvectors
 
evals, evecs = eig_evec_decomp(A)
print(evals)
# array([1.48078866, 0.71921134])

print(evecs)
# array([[ 0.52937334, -0.84838898],
#       [ 0.84838898,  0.52937334]])

接下来我检查条件:

Ax=wx  
Where:
A - Original matrix;  
x - eigenvector;  
w - eigenvalue. 

检查条件:

print(np.allclose(A.dot(evecs[:,0]), evals[0] * evecs[:,0]))
# True
print(np.allclose(A.dot(evecs[:,1]), evals[1] * evecs[:,1]))
# False
4

1 回答 1

0

算法中Q_k没有将特征向量作为列的承诺。甚至很少会有正交特征基。这非常特殊,以至于这种情况有一个名称,这些是正常矩阵,其特征在于它们与它们的转置一起通勤。

一般来说,A_k你收敛到的仍然是上三角形,对角线上方有非平凡的内容。通过计算检查Q_k.T @ A @ Q_k。从结构中可知,i特征向量是 的第一k列的线性组合Q_k。这可以在一定程度上简化求解特征向量方程。或者直接确定收敛的特征向量A_k并用 变换回来Q_k

于 2021-03-01T21:27:06.073 回答