[MATLAB/PYTHON] eigenvectors

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hallo, ik was bezig met een programma vertalen van matlab naar python (scipy), waarbij ik het volgende probleem tegenkom:

In MATLAB wordt er gebruik gemaakt van:

[V,D] = eig(A)
Help

Waarbij mijn A een 4x4 is met :
code:
1
2
3
4
5
6
A:
1.0e-017 *
    0.4412   -0.0000    0.0000    0.0059
   -0.0000   -0.4262    0.1143    0.0000
    0.0000    0.1143    0.4262    0.0000
    0.0059    0.0000    0.0000   -0.4412

En V en D geven:
code:
1
2
3
4
5
V:
   -0.0000    0.0067    0.8652    0.5014
   -0.9914   -0.0025   -0.0655    0.1131
    0.1307    0.0003   -0.4971    0.8578
    0.0026   -1.0000    0.0058    0.0034

code:
1
2
3
4
5
6
D:
1.0e-017 *
   -0.4412         0         0         0
         0   -0.4412         0         0
         0         0    0.4412         0
         0         0         0    0.4412



Nu gebruik ik volgens deze website de functie in PYTHON:

V,D = linalg.eig(A)

Wat mij met dezelfde N de volgende V en D geeft:
code:
1
2
V:
[  4.41238126e-18  -4.41238126e-18  -4.41238126e-18   4.41238126e-18]

code:
1
2
3
4
5
D:
[[ -9.99977427e-01  -6.59161113e-03   1.47423226e-03  -2.52148002e-04]
 [  4.10095667e-08  -1.92151816e-01  -9.67262021e-01   1.30699053e-01]
 [ -2.56309792e-09   2.53309361e-02   1.27514131e-01   9.91422056e-01]
 [ -6.71900741e-03   9.81016093e-01  -2.19413209e-01  -1.27469632e-06]]


Nu valt het me op dat de D van matlab LIJKT op V van python, maar het gaat mij eigenlijk om de waarden van V (matlab), maar python geeft me toch iets anders.
Ik heb alleen de 4e kolom van V (matlab) nodig in python.

Is er iemand die wat licht erop kan schijnen?

@Hieronder: dank je, het resultaat is elke keer hetzelfde in python (en zover ik weet ook in matlab)

[ Voor 4% gewijzigd door Verwijderd op 24-04-2008 10:19 ]


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Ik zou aanraden je matrices en vectoren even tussen code- of cmd-tags (of iets anders dat een monospaced font regelt) want zo zijn ze niet te lezen. De V van python en de D van matlab geven inderdaad dezelfde informatie, namelijk de eigenvalues, alleen matlab geeft ze in een diagonaalmatrix en python in een vector.
Helpt het om te zeggen dat eigenvectoren niet uniek zijn (er zijn zelfs oneindig veel)?

Acties:
  • 0 Henk 'm!

  • ravenger
  • Registratie: Juli 2001
  • Laatst online: 01-09 11:43
blaataaps schreef op donderdag 24 april 2008 @ 09:57:
Ik zou aanraden je matrices en vectoren even tussen code- of cmd-tags (of iets anders dat een monospaced font regelt) want zo zijn ze niet te lezen. De V van python en de D van matlab geven inderdaad dezelfde informatie, namelijk de eigenvalues, alleen matlab geeft ze in een diagonaalmatrix en python in een vector.
Helpt het om te zeggen dat eigenvectoren niet uniek zijn (er zijn zelfs oneindig veel)?
Daarom is het handig om eigenvectoren altijd te normalizen ;)

Acties:
  • 0 Henk 'm!

  • Sallin
  • Registratie: Mei 2004
  • Niet online
De waardes die je in A hebt gestopt zitten volgens mij akelig dichtbij de standaard nauwkeurigheid van matlab (jouw waardes zijn 1.0e-017 * de waardes in je matrix). Wellicht dat het niet help als je eigenwaardes probeert te trekken uit een matrix die ongeveer uit nullen bestaat.


edit de eps van matlab is 2.2204e-016

help eps geeft:
EPS Spacing of floating point numbers.
D = EPS(X), is the positive distance from ABS(X) to the next larger in
magnitude floating point number of the same precision as X.
X may be either double precision or single precision.
For all X, EPS(X) is equal to EPS(ABS(X)).

[ Voor 46% gewijzigd door Sallin op 24-04-2008 15:43 ]

This too shall pass
Debian | VirtualBox (W7), Flickr


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik weet niet goed wat je bedoelt met EPS, maar de eig() functie gaat in matlab gewoon goed, daar gaat het niet om. Het frustrerende is dat een zelfde functie in een andere taal heel wat anders lijkt te doen. (Gaat tegen me principes in :P)
Maar goed ik zal het nog eens testen met andere waarden, misschien dat tot de -17e niet zo goed gaat in python.

Of misschien heeft iemand een voorbeeld hoe ik de juiste eigenvectors te pakken krijg in python met een omweg. Al wel naar gezocht maar overal vind ik alleen wiskundige uitleg waar ik weinig van begrijp ;)

Acties:
  • 0 Henk 'm!

  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 09-09 14:08
Verwijderd schreef op donderdag 24 april 2008 @ 09:48:
hallo, ik was bezig met een programma vertalen van matlab naar python (scipy), waarbij ik het volgende probleem tegenkom:

In MATLAB wordt er gebruik gemaakt van:

[V,D] = eig(A)
Help

Waarbij mijn A een 4x4 is met :
code:
1
2
3
4
5
6
A:
1.0e-017 *
    0.4412   -0.0000    0.0000    0.0059
   -0.0000   -0.4262    0.1143    0.0000
    0.0000    0.1143    0.4262    0.0000
    0.0059    0.0000    0.0000   -0.4412

En V en D geven:
code:
1
2
3
4
5
V:
   -0.0000    0.0067    0.8652    0.5014
   -0.9914   -0.0025   -0.0655    0.1131
    0.1307    0.0003   -0.4971    0.8578
    0.0026   -1.0000    0.0058    0.0034

code:
1
2
3
4
5
6
D:
1.0e-017 *
   -0.4412         0         0         0
         0   -0.4412         0         0
         0         0    0.4412         0
         0         0         0    0.4412



Nu gebruik ik volgens deze website de functie in PYTHON:

V,D = linalg.eig(A)

Wat mij met dezelfde N de volgende V en D geeft:
code:
1
2
V:
[  4.41238126e-18  -4.41238126e-18  -4.41238126e-18   4.41238126e-18]

code:
1
2
3
4
5
D:
[[ -9.99977427e-01  -6.59161113e-03   1.47423226e-03  -2.52148002e-04]
 [  4.10095667e-08  -1.92151816e-01  -9.67262021e-01   1.30699053e-01]
 [ -2.56309792e-09   2.53309361e-02   1.27514131e-01   9.91422056e-01]
 [ -6.71900741e-03   9.81016093e-01  -2.19413209e-01  -1.27469632e-06]]


Nu valt het me op dat de D van matlab LIJKT op V van python, maar het gaat mij eigenlijk om de waarden van V (matlab), maar python geeft me toch iets anders.
Ik heb alleen de 4e kolom van V (matlab) nodig in python.

Is er iemand die wat licht erop kan schijnen?

@Hieronder: dank je, het resultaat is elke keer hetzelfde in python (en zover ik weet ook in matlab)
Je hebt een probleem met je model.
Alle 4 de eigenwaarden zijn in absolute zin gelijk.
Dat betekent dat je eigenvectoren niet uniek zijn, maar een basis vormen voor je eigenruimte.
Er zijn dan meerdere mogelijkheden voor je eigenvectoren, implementatie afhankelijk.

Dan kun je niet eens verwachten dat 2 matlab implementaties dezelfde waarde geven, laat staan matlab en python.

Acties:
  • 0 Henk 'm!

  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 09-09 14:08
Wat betekent je 4e kolom eigenlijk? Met gelijke eigenwaarden had de 1e of de 3e, of iedere lineaire combinatie ook in de 4e kolom kunnen staan.

Het maakt me trouwens nieuwsgierig naar je achterliggende probleem.
Met 6 jaar wiskunde studie en matlab/lineare algebra als dagelijks werk denk ik wel wat te kunnen helpen.

Acties:
  • 0 Henk 'm!

  • BestTested!
  • Registratie: Oktober 2003
  • Laatst online: 11-09 19:30
Verwijderd schreef op donderdag 24 april 2008 @ 16:46:
Ik weet niet goed wat je bedoelt met EPS, maar de eig() functie gaat in matlab gewoon goed, daar gaat het niet om. Het frustrerende is dat een zelfde functie in een andere taal heel wat anders lijkt te doen. (Gaat tegen me principes in :P)
Maar goed ik zal het nog eens testen met andere waarden, misschien dat tot de -17e niet zo goed gaat in python.

Of misschien heeft iemand een voorbeeld hoe ik de juiste eigenvectors te pakken krijg in python met een omweg. Al wel naar gezocht maar overal vind ik alleen wiskundige uitleg waar ik weinig van begrijp ;)
Wat Sallin denk ik bedoeld ik dat de waardes in je matrix A redelijk dicht bij 0 liggen. Aangezien MatLab rekent met floating points krijg je miniscule afwijkingen. Deze miniscule afwijkingen hebben normaal gezien een verwaarloosbare invloed, maar nu je waardes van A zijn zelf als zo klein, kunnen deze afwijkingen wel degelijk je antwoord beinvloeden. Met deze functie lijkt het inderdaag goed te gaan.


Als je op 'safe' wilt spelen kan je ook je matrix A schalen zodat je waardes 'groter' worden
code:
1
 [V,D] = eig(1e17*A); D=diag(D*1e-17)';


Ik weet niet je matrix A enkel een test is, en of dat je normaal gezien 'grotere' matrices gebruikt, want dan is het misschien aan te raden de functie eigs() te gebruiken. Je matrix A ziet er al behoorlijk sparse uit.
pkuppens schreef op donderdag 24 april 2008 @ 18:07:

Je hebt een probleem met je model.
Alle 4 de eigenwaarden zijn in absolute zin gelijk.
Dat betekent dat je eigenvectoren niet uniek zijn, maar een basis vormen voor je eigenruimte.
Er zijn dan meerdere mogelijkheden voor je eigenvectoren, implementatie afhankelijk.

Dan kun je niet eens verwachten dat 2 matlab implementaties dezelfde waarde geven, laat staan matlab en python.
Probeer eens andere matrix A, deze matrix is wel heel symmetrisch.
code:
1
A = rand(4,4);

Hoe reageert je Python code trouwens op niet-reeele eigenvalues?

Ik ben ook wel benieuwd naar je toepassing, maar dan enkel met 4 jaar MatLab+lineaire algebra kennis :9

Acties:
  • 0 Henk 'm!

Verwijderd

Als je Matlab dezelfde implementatie van BLAS laat gebruiken als Python, zou er wel hetzelfde uit moeten komen. Je kunt dit doen door de environment variabele BLAS_VERSION in te stellen naar de BLAS-library van Python, en Matlab opnieuw op te starten. Beetje afhankelijk van je platform:

code:
1
export BLAS_VERSION /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libblas.dylib


Je probleem zul je niet oplossen, je zit te dicht tegen machine precision aan te werken (eps = 2.2204e-16 in Matlab).

Acties:
  • 0 Henk 'm!

Verwijderd

BestTested! schreef op donderdag 24 april 2008 @ 20:45:
[...]

Ik weet niet je matrix A enkel een test is, en of dat je normaal gezien 'grotere' matrices gebruikt, want dan is het misschien aan te raden de functie eigs() te gebruiken. Je matrix A ziet er al behoorlijk sparse uit.

[...]
Het lijkt me dat eigs() juist nog meer last heeft van machine precision problemen, omdat het een iteratieve (Arnoldi) methode gebruikt om de eigenwaarden te vinden. Ik vermoed dat eigs() er vrijwel meteen mee stopt met NaNs of een melding dat hij niet convergeert...
Pagina: 1