2016-04-03 34 views
1

Ich schrieb einen einfachen linearen Algebra-Code in Python Numpy, um die Diagonale von Eigenwerten zu berechnen, indem $ M^{- 1} .A.M $ berechnet wird (M ist die Modal Matrix) und es funktioniert seltsam.Numpy - Modale Matrix und diagonale Eigenwerte

Hier ist der Code:

import numpy as np 

array = np.arange(16) 
array = array.reshape(4, -1) 
print(array) 

[[ 0 1 2 3] 
[ 4 5 6 7] 
[ 8 9 10 11] 
[12 13 14 15]] 

eigenvalues, eigenvectors = np.linalg.eig(array) 

print eigenvalues 
[ 3.24642492e+01 -2.46424920e+00 1.92979794e-15 -4.09576009e-16] 

print eigenvectors 
[[-0.11417645 -0.7327781 0.54500164 0.00135151] 
[-0.3300046 -0.28974835 -0.68602671 0.40644504] 
[-0.54583275 0.15328139 -0.2629515 -0.8169446 ] 
[-0.76166089 0.59631113 0.40397657 0.40914805]] 

inverseEigenVectors = np.linalg.inv(eigenvectors) #M^(-1) 
diagonal= inverseEigenVectors.dot(array).dot(eigenvectors) #M^(-1).A.M 

print(diagonal) 
[[ 3.24642492e+01 -1.06581410e-14 5.32907052e-15 0.00000000e+00] 
[ 7.54951657e-15 -2.46424920e+00 -1.72084569e-15 -2.22044605e-16] 
[ -2.80737213e-15 1.46768503e-15 2.33547852e-16 7.25592561e-16] 
[ -6.22319863e-15 -9.69656080e-16 -1.38050658e-30 1.97215226e-31]] 

die letzte ‚Diagonale‘ Matrix eine Diagonalmatrix mit den Eigenwerten auf den Hauptdiagonalen und Nullen an anderer Stelle sein sollte. aber es ist nicht ... die beiden ersten Hauptdiagonalwerte sind Eigenwerte, aber die zwei Sekunden sind nicht (obwohl sie genau wie die zwei zweiten Eigenwerte fast Null sind).

und übrigens ist eine Zahl wie $ -1.06581410e-14 $ buchstäblich Null, also wie kann ich machen, dass numpy sie als Null zeigt?

Was mache ich falsch?

Dank ...

+2

Hinweis: Zeile 3 = 2 * Zeile 2 - Zeile 1 –

+1

Uh oh ... dann ... die Determinante der Matrix ist Null? und det (A) = Produkt von Eigenwerten ... und Eigenwerte sollten Null sein? wenn ich es bis hier richtig verstanden habe, warum berechnet dann numpy EigenValues ​​und gibt nicht 0 als Antwort? – Cypher

+2

alles ist in Ordnung. Betrachte im float-Wort, dass jeder Wert <1e-15 null ist. Versuchen Sie diagonal.round (13) und matrix_rank (array). –

Antwort

2

Gleich um das Endergebnis zu den gewünschten Stellen:

print(diagonal.round(5)) 

array([[ 32.46425, 0.  , 0.  , 0.  ], 
     [ 0.  , -2.46425, 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.  ]]) 

Sie Präzision der Politik Berechnung und Druck nicht verwirren.

+0

Danke ... Ich werde dies im Hinterkopf behalten ... – Cypher

1
>>> diagonal[np.abs(diagonal)<0.0000000001]=0 
>>> print diagonal 
[[ 32.4642492 0.   0.   0.  ] 
[ 0.   -2.4642492 0.   0.  ] 
[ 0.   0.   0.   0.  ] 
[ 0.   0.   0.   0.  ]] 
>>> 
+0

Danke ... wenn ich nur 2 beste Antworten wählen könnte ... – Cypher

+0

Du bist sehr nett! B.M.'s Antwort hat ihre eigenen Vorteile (+1 zu B.M.) – Yaron