Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I find out eigenvectors corresponding to a particular eigenvalue of a matrix?

How do I find out eigenvectors corresponding to a particular eigenvalue?

I have a stochastic matrix(P), one of the eigenvalues of which is 1. I need to find the eigenvector corresponding to the eigenvalue 1.

The scipy function scipy.linalg.eig returns the array of eigenvalues and eigenvectors.

D, V = scipy.linalg.eig(P)

Here D(array of values) and V(array of vectors) are both vectors.

One way is to do a search in D and extract the corresponding eigenvector in V. Is there an easier way?

like image 600
AIB Avatar asked Aug 14 '12 13:08

AIB


People also ask

How do you determine the normalized eigenvector corresponding to a particular eigenvalue?

Normalized Eigenvector It can be found by simply dividing each component of the vector by the length of the vector.

How do you find eigenvectors from the same eigenvalues?

= (λ + 1)2. Setting this equal to zero we get that λ = −1 is a (repeated) eigenvalue. To find any associated eigenvectors we must solve for x = (x1,x2) so that (A + I)x = 0; that is, [ 0 2 0 0 ][ x1 x2 ] = [ 2x2 0 ] = [ 0 0 ] ⇒ x2 = 0.


2 Answers

import numpy as np
import numpy.linalg as linalg


P = np.array([[2, 0, 0], [0, 1, 0], [0, 0, 3]])

D, V = linalg.eig(P)
print(D)
# [ 2.  1.  3.]

The eigenvectors are columns of V:

V = V.T

for val, vec in zip(D, V):
    assert np.allclose(np.dot(P, vec), val*vec)

So the eigenvector corresponding to eigenvalue 1.0 is

def near(a, b, rtol = 1e-5, atol = 1e-8):
    return np.abs(a-b)<(atol+rtol*np.abs(b))

print(V[near(D, 1.0)])
# [[ 0.  1.  0.]]

Since there can be more than one eigenvector with the same eigenvalue, V[near(D, 1.0)] returns a 2-dimensional array -- each row of the array is an eigenvector with an eigenvalue of 1.0.

like image 90
unutbu Avatar answered Oct 02 '22 14:10

unutbu


If you are looking for one eigenvector corresponding to one eigenvalue, it could be much more efficient to use the scipy.sparse.linalg implementation of the eig function. It allows to look for a fixed number of eigenvectors and to shift the search around a specific value. You could do for instance :

values, vectors = scipy.sparse.linalg.eigs(P, k=1, sigma=1)
like image 40
Nicolas Barbey Avatar answered Oct 02 '22 13:10

Nicolas Barbey