2015-10-03 17 views
7

creo un arbitrario matrice 2x2:autovettori creati da numpy.linalg.eig non sembrano corrette

In [87]: mymat = np.matrix([[2,4],[5,3]]) 

In [88]: mymat 
Out[88]: 
matrix([[2, 4], 
     [5, 3]]) 

tento di calcolare autovettori utilizzando numpy.linalg.eig:

In [91]: np.linalg.eig(mymat) 
Out[91]: 
(array([-2., 7.]), 
matrix([[-0.70710678, -0.62469505], 
     [ 0.70710678, -0.78086881]])) 

In [92]: eigvec = np.linalg.eig(mymat)[1][0].T 

In [93]: eigvec 
Out[93]: 
matrix([[-0.70710678], 
     [-0.62469505]]) 

I moltiplica uno dei miei autovettori con la mia matrice aspettandomi che il risultato sia un vettore che è un multiplo scalare del mio autovettore.

In [94]: mymat * eigvec 
Out[94]: 
matrix([[-3.91299375], 
     [-5.40961905]]) 

Tuttavia non lo è. Qualcuno può spiegarmi cosa sta succedendo qui?

risposta

11

Dalla documentazione per linalg.eig:

v : (..., M, M) array 
    The normalized (unit "length") eigenvectors, such that the 
    column ``v[:,i]`` is the eigenvector corresponding to the 
    eigenvalue ``w[i]``. 

si desidera che il colonne, non le righe.

>>> mymat = np.matrix([[2,4],[5,3]]) 
>>> vals, vecs = np.linalg.eig(mymat) 
>>> vecs[:,0] 
matrix([[-0.70710678], 
     [ 0.70710678]]) 
>>> (mymat * vecs[:,0])/vecs[:,0] 
matrix([[-2.], 
     [-2.]]) 
>>> vecs[:,1] 
matrix([[-0.62469505], 
     [-0.78086881]]) 
>>> (mymat * vecs[:,1])/vecs[:,1] 
matrix([[ 7.], 
     [ 7.]]) 
1

No, è vero. numpy non funziona correttamente. Esempio:

A 
Out[194]: 
matrix([[-3, 3, 2], 
     [ 1, -1, -2], 
     [-1, -3, 0]]) 

E = np.linalg.eig(A) 

E 
Out[196]: 
(array([ 2., -4., -2.]), 
matrix([[ -2.01889132e-16, 9.48683298e-01, 8.94427191e-01], 
     [ 5.54700196e-01, -3.16227766e-01, -3.71551690e-16], 
     [ -8.32050294e-01, 2.73252305e-17, 4.47213595e-01]])) 

A*E[1]/E[1] 
Out[205]: 
matrix([[ 6.59900617, -4.  , -2.  ], 
     [ 2.  , -4.  , -3.88449298], 
     [ 2.  , 8.125992 , -2.  ]]) 
Problemi correlati