1
votes

I am trying to find the eigenvectors of matrix A using QR method. I found the eigenvalues and eigenvector which corresponds to the largest eigenvalue. How do I find the rest of the eigenvectors without using 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]])

Next I check the condition:

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

Check the conditions:

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

1 Answers

0
votes

There is no promise in the algorithm that Q_k will have the eigenvectors as columns. It is even rather rare that there will be an orthogonal eigenbasis. This is so special that this case has a name, these are the normal matrices, characterized in that they commute with their transpose.

In general, the A_k you converge to will still be upper triangular with non-trivial content above the diagonal. Check by computing Q_k.T @ A @ Q_k. What is known from the structure is that the ith eigenvector is a linear combination of the first k columns of Q_k. This could simplify solving the eigen-vector equation somewhat. Or directly determine the eigenvectors of the converged A_k and transform back with Q_k.