Springen naar inhoud

Eigenvectoren berekenen


  • Log in om te kunnen reageren

#1


  • Gast

Geplaatst op 11 maart 2005 - 19:51

ik heb een 2x2 matrix waarbij a12 alijd gelijk is aan &21. a11 en a22 veranderen constant.

ik reken de eigenwaarden uit mbv de volgende formule:

double EigenVal1(double m1, double m2, double m3, double m4)
{ return 0.5 * ((m1+m4) + sqrt( (4*m2*m3) + pow((m1 - m4),2))); }

double EigenVal2(double m1, double m2, double m3, double m4)
{ return 0.5 * ((m1+m4) - sqrt( (4*m2*m3) + pow((m1 - m4),2))); }

die worden correct berekend. Vraag is hoe ik uit deze matrix en eigenwaarden de eigenvectoren kan bepalen.

Ik doe gewoon:

(a11 - lan) X1 + a12 X2 = 0
stel X1 = 1 en reken X2 uit.
(rest van de verelijkingen vervalt gewoon want ik heb die niet nodig (?))
De hoek van deze eigenvector is dan atan (X2/X1).

1) Kan dit ?
2) wat doe ik fout
3) heeft er soms iemand van jullie een scriptje/voorbeeld waarmee ik onder C++ eigenvectoren kan berekenen van 2x2 matrices ?

Tkx;

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Elmo

    Elmo


  • >1k berichten
  • 3437 berichten
  • VIP

Geplaatst op 11 maart 2005 - 22:59

Om de eigenvectoren v uit te rekenen die behoren bij de matrix A, los je gewoon het volgende stelsel op:
det[A - l I] v = 0
waar l de eigenwaarde is, en I de identiteitsmatrix.

Zie ook hier: http://mathworld.wol...igenvector.html
Never underestimate the predictability of stupidity...

#3


  • Gast

Geplaatst op 12 maart 2005 - 15:34

:shock:

Zou je dat iets of wat concreet kunnen uitleggen wat ik moet doen ?
iets in de stijl van:

- eigenwaarden berekenen
- die aftrekken van de diagonale getallen
- ?????? zie ik daar ook ergens een determinant staan ?

en hoe moet ik dat stelsel oplossen ?

Tkx in advance;

#4

TD

    TD


  • >5k berichten
  • 24102 berichten
  • VIP

Geplaatst op 12 maart 2005 - 20:35

Ik heb een voorbeeld even voor je uitgewerkt.
Om het eenvoudig te houden zal ik een 2x2 matrix A diagonaliseren.

Daarvoor stel je de karakteristieke determinant op, stelt die gelijk aan 0 om dan daaruit de karakteristieke veelterm op te stellen waar je dan de eigenwaarden kan uithalen:

Geplaatste afbeelding

Dan moet je voor elke eigenwaarde dat stelsel (A-eI)X = 0 oplossen waarbij ik 'e' de eigenwaarde bedoel en I de eenheidsmatrix. Dit ziet er misschien ingewikkeld uit, maar het komt er in feite op neer dat je in die karakteristieke determinant twee keer de gevonden eigenwaarde gaat invullen (en dus aftrekken van de hoofddiagonaal). We hebben nu echter niet meer de determinant nodig, maar de oplossingen van het stelsel waarbij we die matrix gelijk stellen aan 0. Dit kan gewoon door een kolom nullen toe te voegen.

Daaruit haal je dan steeds een eigenvector, die overigens op een evenredigheidsfactor na bepaald is.

Geplaatste afbeelding

De diagonalisatie van de matrix A voldoet aan:
A = P*D*P-1
Waarbij A de originele matrix is, D de diagonaalmatrix met op de hoofddiagonaal de eigenwaarden en P de matrix met in de kolommen de eigenvectoren. (P-1 is hier uiteraard de inverse van)

Geplaatste afbeelding

Je hebt nu de eigenwaarden en bijbehorende eigenvectoren berekend en de matrix gediagonaliseerd.

Let wel dat ik een gemakkelijk voorbeeld heb genomen om de methode te illustreren. Je kan namelijk verschillende 'problemen' tegenkomen en een matrix is ook niet altijd te diagonaliseren.

#5

Math

    Math


  • >1k berichten
  • 1460 berichten
  • VIP

Geplaatst op 12 maart 2005 - 20:50

Hulde voor TD voor deze visuele uitleg.

Alleen heeft hosti nog steeds zijn code niet in C++, maar beste hosti, ik zou daar niet teveel op rekenen. Er zijn weinig pcfreaks voor wat betreft programmeren hier...
<i>Iets heel precies uitleggen roept meestal extra vragen op</i>

#6

TD

    TD


  • >5k berichten
  • 24102 berichten
  • VIP

Geplaatst op 12 maart 2005 - 20:55

Van C++ ken ik helaas niets maar het lijkt me belangrijk dat je de wiskunde erachter alvast begrijpt.
Overigens is het m'n ervaring dat methodes gewoonlijk veel duidelijker worden met een 'praktijkvoorbeeld' dan a.d.v. de theorie.

#7

Math

    Math


  • >1k berichten
  • 1460 berichten
  • VIP

Geplaatst op 12 maart 2005 - 20:58

Van C++ ken ik helaas niets maar het lijkt me belangrijk dat je de wiskunde erachter alvast begrijpt.
Overigens is het m'n ervaring dat methodes gewoonlijk veel duidelijker worden met een 'praktijkvoorbeeld' dan a.d.v. de theorie.

C++ is mij net zo vreemd als D-- (grapje), maar idd TD, voorbeelden zijn vaak de elementaire dingen waardoor het voor een grote groep duidelijk wordt.
<i>Iets heel precies uitleggen roept meestal extra vragen op</i>

#8

Elmo

    Elmo


  • >1k berichten
  • 3437 berichten
  • VIP

Geplaatst op 12 maart 2005 - 23:28

Voor een mooi algoritme in C (helaas niet in C++), kan je eens in Numerical Recipies bladeren. Dit is de "bijbel" voor elke fysicus/mathemaat die grootschalig rekent. :shock:
Never underestimate the predictability of stupidity...

#9


  • Gast

Geplaatst op 13 maart 2005 - 14:38

Allemaal super hard bedankt. Deze uitleg zou mij al een eindje verder moeten helpen. Vooral de hierbovenstaande link komt me zeer goed van pas. Daarin staat de methode vermeld die ik zou willen toepassen (jacobi) maar mijnen C (++) flipt daar helemaal op, om nog maar te zwijgen van windows.

Rest er mij misschien nog 1 vraagje: hoe bereken ik de variantie (van getallen) van een matrix ? Ik dacht gewoon het verschil van de kwadraten maar.....

[ A B C ]
[ X Y Z ]
[ U V W ]





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures