문제

How do calculate the left hand side eigenvector in python?

    >>> import from numpy as np
    >>> from scipy.linalg import eig
    >>> np.set_printoptions(precision=4)
    >>> T = np.mat("0.2 0.4 0.4;0.8 0.2 0.0;0.8 0.0 0.2")
    >>> print "T\n", T
    T
    [[ 0.2  0.4  0.4]
     [ 0.8  0.2  0. ]
     [ 0.8  0.   0.2]]
    >>> w, vl, vr = eig(T, left=True)
    >>> vl
    array([[ 0.8165,  0.8165,  0.    ],
           [ 0.4082, -0.4082, -0.7071],
           [ 0.4082, -0.4082,  0.7071]])

This does not seem correct, google has not been kind on this!

도움이 되었습니까?

해결책

Your result is correct to my understanding.

However, you might be misinterpreting it. The numpy docs are a bit clearer on what the left eigenvectors should be.

Finally, it is emphasized that v consists of the right (as in right-hand side) eigenvectors of a. A vector y satisfying dot(y.T, a) = z * y.T for some number z is called a left eigenvector of a, and, in general, the left and right eigenvectors of a matrix are not necessarily the (perhaps conjugate) transposes of each other.

I.e. you need to transpose the vectors in vl. vl[:,i].T is the i-th left eigenvector. If I test this, I get, that the results are correct.

>>> import numpy as np
>>> from scipy.linalg import eig
>>> np.set_printoptions(precision=4)
>>> T = np.mat("0.2 0.4 0.4;0.8 0.2 0.0;0.8 0.0 0.2")
>>> print "T\n", T
T
[[ 0.2  0.4  0.4]
 [ 0.8  0.2  0. ]
 [ 0.8  0.   0.2]]
>>> w, vl, vr = eig(T, left=True)
>>> vl
array([[ 0.8165,  0.8165,  0.    ],
       [ 0.4082, -0.4082, -0.7071],
       [ 0.4082, -0.4082,  0.7071]])
>>> [ np.allclose(np.dot(vl[:,i].T, T), w[i]*vl[:,i].T) for i in range(3) ]
[True, True, True]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top