eigenwert und eigenvektor einer größeren matrix (c++)
-
Mit welchen Programiersprachen hast Du bislang gearbeitet?
Wenn Du nur die EW/EV brauchst nimm Maple o.ä.; gibt's oft in UNI-Pools.
Wenn Du C++ lernen willst solltest Du Dir ein simpleres Thema suchen; hier ist fast täglich ein Posting zu finden das sich um Matrizen dreht und die Beiträge setzen schon einiges Wissen um Speicherstrukturen und ggf. STL voraus.
Ansonsten solltest Du das Problem in Teilprobleme zerlegen
- Charakteristisches Polynom bestimmen
---- Detrminante berechnen
-------- Allgemeine Formel für Determinanten für n-dim. Matrizen heraussuchen
------------ Rekursiven Algorithmus formulieren (z.B. in Natusrpache hinter "//")- dto. lösen
...
- Gleichungen für die EV aufstellen
..
- dto. lösenGrüsse
*this
-
Gast++ schrieb:
Ansonsten solltest Du das Problem in Teilprobleme zerlegen
- Charakteristisches Polynom bestimmen
---- Detrminante berechnen
-------- Allgemeine Formel für Determinanten für n-dim. Matrizen heraussuchen
------------ Rekursiven Algorithmus formulieren (z.B. in Natusrpache hinter "//")- dto. lösen
...
- Gleichungen für die EV aufstellen
..
- dto. lösenJa, so macht man das von Hand. Aber im Rechner macht das kein Mensch so.
-
Jester schrieb:
das von Hand. Aber im Rechner macht das kein Mensch so.
Schon klar; im Rechner macht das ein kleines Affchen das an einer grossen Regalwand mit Abteilen zu je 8 Büchern herumhopst. Die Regalwand heisst RAM und das Äffchen EIP.
(So fang ich immer an wenn ich x386 erklären muss - hab dann auch immer ein entsprechendes Stofftier zur Hand ...)
Grüsse
*this
-
tja also, zuerst ma kann ich nur c++ und wills damit machen. als zweites habe ich auch schon teilschritte fertig, determinaten geht matrizenmultiplikation und was wess ich aber ich will noch eigenwert und eigenvektor da reinbringen.
@jester: ^^ die doc hab ich gefunden aber mein englisch is echt mies.
welchen Rekursiven Algorithmus soll ich denn formulieren?
aber ich test ma und ihr sagt bitte wenn ich was falsch mache
#include <iostream> #include "tnt.h" #include <jama_eig.h> using namespace TNT; using namespace std; #define dim 2 int main() { int a,b,i,j; float matrix[dim][dim]; //eingabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cin>>matrix[a][b]; } } Array2D< double > A(dim,dim) = 0.0; /* create MxN array; all zeros */ for (i=0; i < dim; i++) for (j=0; j < dim; j++) A[i][j] = matrix(i,j); //eigenwert //eigenvektor //ausgabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cout<<matrix[a][b]<<" "; } cout<<endl; } return 0; }
is damit die tnt-h eingebunden und bereit?
hat die matrix a die werte des feldes matrix?
-
Gast++: Eigenwerte auszurechnen ist numerisch gar nicht so leicht hinzubekommen. Über die Nullstellensuche des charakteristischen Polynoms kommt bei bösartigen Matrizen ziemlicher Unfug raus. Guck mal in ein Buch über Numerik.
-
hier kommt nen fehler:
A[i][j] = matrix(i,j);
main.cpp(30) : error C2064: term does not evaluate to a function
-
Daniel E. schrieb:
Gast++: Eigenwerte auszurechnen ist numerisch gar nicht so leicht hinzubekommen. Über die Nullstellensuche des charakteristischen Polynoms kommt bei bösartigen Matrizen ziemlicher Unfug raus.
Warum lieferst Du dann nicht einfach eine ergänzende Erklärung?
Grüsse
*this
P.S.: EDIT/
-
Gast++ schrieb:
@Daniel E.:
Hat man Dich schon zu Schulzeiten als Besserwisser abgestempelt, oder hat sich das erst später entwickelt?Er hat doch Recht. Stört es dich, dass es vielleicht nicht so einfach ist wie du dir das vorgestellt hast? Nimm z.B. mal eine 10000x10000-Matrix. Da rechnest du dich blöde mit der von dir vorgeschlagenen Methode. Für solche Sachen gibt es approximative Verfahren, die zu kompliziert sind um sie hier eben mal hinzuschreiben, aber die ganz sicher in jedem Buch über Numerik drin stehen.
-
Gast++ schrieb:
Daniel E. schrieb:
Gast++: Eigenwerte auszurechnen ist numerisch gar nicht so leicht hinzubekommen. Über die Nullstellensuche des charakteristischen Polynoms kommt bei bösartigen Matrizen ziemlicher Unfug raus.
Warum lieferst Du dann nicht einfach eine ergänzende Erklärung?
In erster Linie, weil ich in Numerik nicht besonders fit bin, deshalb. Aber ich weiß, daß man darum teilweise einen ziemlichen Aufwand treibt. http://www.mai.liu.se/~akbjo/NMbook.html
-
Walli schrieb:
Er hat doch Recht.
Nur sind "Recht haben" und "Recht kriegen" halt zweierlei.
Mit dem letzteren wird's v.a dann nichts wenn man versucht Menschen Befehle zu erteilen.Walli schrieb:
Stört es dich, dass es vielleicht nicht so einfach ist wie du dir das vorgestellt hast?
Ganz im Gegenteil; ein substanziierte Erklärung über Approxomationsverfahren oder ein guter Link wären mir höchst willkommen.
Walli schrieb:
Nimm z.B. mal eine 10000x10000-Matrix.
Glaubst Du wirklich dass die OP vorhat 10^8 Werte per std::cin einzulesen?
Grüsse
*this
P.S.:
In erster Linie, weil ich in Numerik nicht besonders fit bin, deshalb. Aber ich weiß, daß man darum teilweise einen ziemlichen Aufwand treibt. http://www.mai.liu.se/~akbjo/NMbook.html
@Daniel: Das kommt doch schon ganz anders rüber; danke für den Link!
-
könnt ihr euch woanders streiten und lieber mir helfen?
-
sebush schrieb:
hier kommt nen fehler:
A[i][j] = matrix(i,j);
main.cpp(30) : error C2064: term does not evaluate to a functionSollte wohl matrix[i][j] heißen?
-
sebush schrieb:
könnt ihr euch woanders streiten und lieber mir helfen?
Ja.
Was ich an Deinem Code nicht verstehe ist der Umagng mit der Dimensionszahl.
Für n=2 und n=3 ist die Aufgabe eigentlich recht leicht zu lösen; die Det folgt der Cramer'schen Regel und die Polynome sind quadratisch resp. kubisch.
Den heuristischen Algorithmus den ich vorschlug kannst Du (und solltest es vielleicht) auch von Bibliotheken leisten lassen.
Willst Du das jetzt für Matrizen höherer (>3) Ordung selbst coden oder Lösungen einbinden?
Grüsse
*this
-
will doch nur auf dim2 testen obs auch richtig rechnet und dann die dim anheben. aber wenn er nichma dim 2 richtig kann dann brauch ich da nich weiter machen.
ob ich selber schreib oder einbinde is mir eigentlich wurst, allerdings muss ichs da erst ma verstehen wenn ichs selber code. also lieber einbinden^^will nur das das programm am ende endlich die eigenwerte ausspuckt, der eigenvektor sollte dann ya kein problem mehr sein.
danke daniel^^ ich glaub mein kopf is langsam zu matschig
ok habs jetzt so, kommt zumindest erstma kein fehler.
wo setz ich weiter an? wie gesagt mein englisch is echt mies#include <iostream> #include "tnt.h" #include "jama_eig.h" using namespace TNT; using namespace std; #define dim 2 int main() { int a,b,i,j; float matrix[dim][dim]; //eingabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cin>>matrix[a][b]; } } Array2D< double > A(dim,dim) ; /* create MxN array; all zeros */ for (i=0; i < dim; i++) for (j=0; j < dim; j++) A[i][j] = matrix[i][j]; //eigenwert //eigenvektor //ausgabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cout<<matrix[a][b]<<" "; } cout<<endl; } return 0; }
-
Um dann wirklich an die Eigenwerte anzukommen, mußt Du das etwa so machen:
JAMA::Eigenvalue <double> eigen_helfer(A); Array1D <double> eigenwerte_re (dim); // hier stehen dann die Realteile der Eigenwerte drin Array1D <double> eigenwerte_im (dim); // eigen_helfer.getRealEigenvalues (eigenwerte_re); eigen_helfer.getImagEigenvalues (eigenwerte_im); // der n-te Eigenwert ist also eigenwerte_re[n] + j eigenwerte_im[n]
An die Eigenvektoren kommst Du über eigen_helfer.getV(eigenvektormatrix), wobei Du die eigenvektormatrix natürlich auch erst mal anlegen mußt ...
-
so? weil ich bekomm 7 fehler in der jama_eig.h, das muss doch irgendwie gehn.
muss ich da noch nen using namespace jama_eig.h; machen?#include <iostream> #include "tnt.h" #include "jama_eig.h" using namespace TNT; using namespace std; #define dim 2 int main() { int a,b,i,j; float matrix[dim][dim]; //eingabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cin>>matrix[a][b]; } } Array2D< double > A(dim,dim) ; /* create MxN array; all zeros */ for (i=0; i < dim; i++) for (j=0; j < dim; j++) A[i][j] = matrix[i][j]; //eigenwert JAMA::Eigenvalue <double> eigen_helfer(A); Array1D <double> eigenwerte_re (dim); // hier stehen dann die Realteile der Eigenwerte drin Array1D <double> eigenwerte_im (dim); // eigen_helfer.getRealEigenvalues (eigenwerte_re); eigen_helfer.getImagEigenvalues (eigenwerte_im); //eigenvektor //ausgabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cout<<matrix[a][b]<<" "; } cout<<endl; } return 0; }
-
// Eigensolver Eigenvalue<double> solver(matrix); // Extract eigenvectors/values Array2D<double> solutionD; Array2D<double> solutionV; solver.getD(solutionD); solver.getV(solutionV);
danach enthält die Matrix solutionV in den Spalten die Eigenvektoren und in D stehen auf der Diagonalen die Eigenwerte (sofern die alle reell sind, sonst sieht's ein bißchen anders aus. Du kannst aber auch direkt auf die Eigenwerte mit eigenen get-Funktionen zugreifen.
"Ich bekomme 7 Fehler" ist nicht präzise genug um Dir helfen zu können. Poste doch bitte die Fehlermeldungen dazu.
-
Vielleicht in großen Teilen zu abgefahren für dein Problem, aber trotz allem interessant: http://www-users.cs.umn.edu/~saad/EIGBOOK.tar.gz
-
Hey, das Buch kann ich gerade ganz klasse gebrauchen. Danke für den Link!
-
hi leutz war gerade ne runde weg und werde morgen (^^bzw nachher) weitermachen, will es unbedingt haben. also allen erst ma einen schönen abend