Matrixinversion über Gauß-Jordan Algorithmus / Determinantenberechnung



  • Hi !

    ich hab ein riesen problem !

    ich muss einen programmentwurf über obiges thema erstellen ! nur ich hab probleme mit der implementierung !

    -----Aufgabenstellung -------

    erstellen sie ein programm, das die matrixinversion über den gauß-jordan algorithmus (mit zeilen- und spaltentausch) löst, die determinante berechnet und die multiplikation von matrizen und vektoren beherrscht. minimalziel ist, dass nach eingabe der koeffizienten des LGS der lösungsvektor bestimmt wird. können sie mit den programmmierten funktionen einen "vektortaschenrechner" bauen ? verifizieren sie die programmfunktion an einem numerischen beispiel !

    --------------------------------

    hat irgendjemand erfahrung damit ? oder evtl schon ansätze dies irgendwie zu lösen !

    BITTE POSTET ! ! !



  • Nun zunächst brauchst du was um die Matrizen und Vektoren vernünftig zu speichern, hier bieten sich ein-/zweidimensionale für die Vektoren und Matrizen an. Die Funktionsweise des Gauss-Jordan-Algos findest du unter http://de.wikipedia.org/wiki/Gauss-Jordan-Algorithmus (wenn du ihn nicht sowieso in Mathe gemacht hast). Matrix und Vektormultiplikation solltest du wirklich im Schlaf können. Also: Wo ist das Problem?

    Ein kleiner Ansatzpunkt, wenn du einen ganzen Bretterwald vorm Kopf hast:

    /* Matrix als 1D Array (2D serialisiert) */
    void MatrixMalVektor(double *matrix, double *vektor, double *ergebnis, int dim1, dim2)
    {
        for (int i = 0; i < dim2; ++i)
        {
            /* wir müssen jedes matrixzeilebelement mit dem
               korrespondierendn vektorspaltenelement multi-
               plizieren. */
            ergebnis[i] = 0.;
            for (int j = 0; j < dim1; ++j)
                ergebnis[i] += matrix[i*dim1+j]*vektor[j]; 
        }
    }
    

    PS: Wenn du eine ganze Matrix invertieren willst gibt es einen Trick beim GaussJordan: Während du beim Gleichungssystemlösen nur einen Vektor auf der rechten Seite bearbeitest um an die Lösung zu kommen, kannst du beim Invertieren mit folgender Konfiguration anfangen:

    [ A  |  Einheitsmatrix ] also z.B:
    
    1 3 4  |  1 0 0
    4 2 5  |  0 1 0
    2 2 2  |  0 0 1
    

    Jetzt bei den Zeilen und Spaltenoperationen nicht nur den einen Vektor betrachten, sondern diese Ops links und rechts gleichermassen ausführen. Wenn du dann links die Einheitsmatrix hast, hast du rechts die Inverse.



  • ja also wie das gauß-jordan verfahren auf dem papier funktioniert ist mir klar ! die basismathematik ist nicht das problem !

    mein problem: ich kann kaum C-programmieren !

    mein bisheriges konzept:

    1. matrix-typ abfragen (2-reihige, 3-reihige, usw. n-reihige)
    --->anzahl spalten und zeilen abfragen
    --->wenn matrix nicht quadratisch ->abbruch

    2. erstellen eines feldes je nach der eingabe des matrix-typs
    --->eingabe der matrix (oder der Gleichungen?) durch den benutzer

    3. determinante berechnen --->wenn D=0 ----> Abbruch

    4. wenn D ungleich 0 ----> Gauß-Jordan Verfahren

    5. Ausgabe der Variablen-Werte

    meine fragen:

    wie bekomme ich die multiplikation von matrizen und vektoren mit rein ?
    wie setze ich sowas am einfachsten im C-Quelltext um ?

    bin ich auf dem holzweg ? 😕

    DANKE für die Unterstützung



  • Dein Konzept klingt gut. Das mit den Determinanten ist für n > 3 nicht ganz so trivial, da musste dieses Verfahren mit dem "auskreuzen" nehmen (weis jetz nimmer wie das genau hies).
    Für Input/Output und Erstellen von Feldern findest du in den FAQ was. Basismathematik ist 1:1 vom Papier in Quelltext übertragbar 🙂 Jetzt musst du halt die Hufe schwingen und dir I/O und Felder anschaun, dann kannst du auch alles Programmieren. Wie du dann die Matrix*Vektor einbauen sollst, keine Ahnung. Also die Funktionen implementieren - klar - und dann vielleicht über einen Kommandozeilenparameter oder über ein kleines Menü in der Konsole.



  • ja mit dem zeug befass ich mich ja schon die ganze zeit ... aber ich versteh bei dem ganzen C-zeug leider zu oft bahnhof !

    und wie meinst du das mit "mathe einfach von papier in c übernehmen" ???
    genau das ist ja der knackpunkt warum es bei mir scheitert 😞

    ich hab keine ahnung wie man den gauß-jordan algo inkl. I/O umsetzt !

    aber ich hab glaub ich eine lösung zum umsetzen der multiplikation gefunden !!! 😃



  • bounceboy schrieb:

    aber ich hab glaub ich eine lösung zum umsetzen der multiplikation gefunden

    ach was...

    mit blatt->c meine ich: 1+1 => 1+1 und 1*1 => 1*1. a = b => a = b. Viel Spass beim reinknien in C, darum kommst du wohl nicht rum. Deine Hausaufgaben mache ich dir nicht, ausser gegen Geld vielleicht 🙂



  • hi

    ich bin mittlerweile ganz gut vorangekommen ...

    wie deklariere ich variablen wie a11, a12, a13 usw ????

    weil das will das blöde C nicht 😡



  • int a12 = 5; /* einzelne variable */
    int mat[3][3]; /* 3x3 matrix */
    mat[0][1] = 4; /* das entspricht erster zeile zweites element */
    size_t matrix_dim1 = 7;
    size_t matrix_dim2 = 3;
    int *dyn_mat = (int *)malloc(matrix_dim1 * matrix_dim2 * sizeof(int));
    /* dynmat ist jetz ein eindimensionales array mit 7*3 intfeldern.
     addressierung wie folgt */
    
    int i = 5; // zeile
    int j = 2; // spalte
    
    int elem_5_2 = dyn_mat[ 
                       i*matrix_dim1 /* 'zeile' mal die zeilenlänge überspringen */
                       + j           /* und dann noch bis zur j. spalte gehen */
                   ];
    

    Für andere Datentypen analog. Nur Mut: ein kleines C Tutorial und du hast das alles in 30 minuten drauf!



  • Korbinian schrieb:

    Nur Mut: ein kleines C Tutorial und du hast das alles in 30 minuten drauf!

    Naiv oder arrogant? 🙄



  • Realist. Wer mit diesem Beispiel Variablendeklaration, Zuweisung und Arrayerstellung in 30min nicht versteht lässt das ganze lieber bleiben.



  • danke für die motivation 👍



  • wie krieg ich die eingegebene matrix in matrixform auf den bildschirm ???

    printf("Bitte Zeilenanzahl der Matrix eingeben:  ");
    
    		scanf("%d",&x);
    
    		printf("\nBitte Spaltenanzahl der Matrix eingeben: ");
    
    		scanf("%d",&y);
    
    		printf("\nDie Matrix hat %d",x);
    		printf(" Zeilen und %d",y);
    		printf(" Spalten.\n\n");
    
    		if (x!=y)
    		{
    			printf("Die Matrix ist nicht quadratisch ! Keine Berechnung der Inversen moeglich !\n\n");
    		}
    		else
    		{
    			printf("Berechnung der Inversen Matrix:\n\n");
    
    		//Eingabe der Matrix
    
    		{
    
    			float matrix[100][100];
    			float m;
    			float *pmatrix;
    			pmatrix=&matrix[0][0];
    
    			printf("Bitte zeilenweise die Zahlen der Matrix eingeben: \n\n");
    
    			for(int i=0;i<x;i++)
    			{
    				for(int j=0;j<x;j++)
    				{
    					scanf("%f",&m);
    					matrix[i][j]=m;
    
    				}
    
    			}
    
    		{
    			for (int i=0;i<x;i++)
    			{
    				*pmatrix++;
    				printf("%f", *pmatrix);
    			}
    			for (int j=0;i<x;j++)
    			{
    				*pmatrix++;
    				printf("\n%f", *pmatrix++);
    			}
    

    weil so klappt es leider nicht 😞



  • so jetzt hab ich das doch selbst geschafft ! Matrixeingabe, ausgabe usw. kein problem !

    nur ich habe ein ganz banales problem !

    ich habe mein programm in 2 teile unterteilt !
    1. inverse matrix bilden
    2. multiplikation von matrizen

    am anfang gibt der benutzer 1 oder 2 ein !
    ich wollte jetzt mit if (p==1) bzw. if (p==2) in die einzelnen programme "springen" und bei anderer eingabe else ABBRUCH

    aber es hüpft immer nur ins erste programm !!!

    was ist da los ????? bitte postet



  • bounceboy schrieb:

    am anfang gibt der benutzer 1 oder 2 ein !
    ich wollte jetzt mit if (p==1) bzw. if (p==2) in die einzelnen programme "springen" und bei anderer eingabe else ABBRUCH

    Wie sieht das denn in Quellcode-Form aus?

    if(p==1)
      invert();
    else if(p==2)
      mult();
    else
      exit(1);
    

    (wenn deine Programmstruktur keine Ähnlichkeit damit hat, solltest du nochmal drüber nachdenken)

    PS: Eventuell könntest du auch switch verwenden:

    switch(p)
    {
    case 1: invert();break;
    case 2: mult();break;
    default:exit(1);
    }
    


  • sorry sorry ....

    ich hab alle meine geschweiften klammern nochmal überprüft .... 🙄

    mein problem ist gelöst ! 😃



  • Hi,

    kannst du mal sagen wie du das Problem der Matrixinversion gelöst hast?
    Hatte da auch mal vor Jahren eine Hausarbeit zu geschrieben, bin bis jetzt aber noch nicht dahintergekommen, wie das Funktioniert.

    Hat da vielleicht jemand eine Lösung?


Anmelden zum Antworten