Matrizen-Programmieraufgaben



  • void inverseberechnen(int invmatrix[3][3], int matrix[3][3], int dim);
    

    ⚠ Da du da (die Zeiger auf) Arrays übergibst, kannst du die Matrizen aus der Funktion herraus manipulieren.



  • Ach doch so einfach? ^^
    Hab es jez mit dem Funktionsprototypen versucht.. und noch die determinante hinzugefügt.

    Er kompiliert auch, aber sobald die Matrixelemente eingelesen wurden, crasht er.

    Er gibt mir auch einige warning vonwegen formale und übergebene parameter stimmen nich überein.( Bei Param 1 und 2, also den Matrizen). Aber es wird int an int übergeben.

    Hier die warnings:

    1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(49): warning C4024: 'inverseberechnen': Unterschiedliche Typen für formalen und übergebenen Parameter 1
    1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(49): warning C4047: 'Funktion': Anzahl der Dereferenzierungen bei 'int (*)[3]' und 'int' unterschiedlich
    1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(49): warning C4024: 'inverseberechnen': Unterschiedliche Typen für formalen und übergebenen Parameter 2
    1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(67): warning C4244: '=': Konvertierung von 'float' in 'int', möglicher Datenverlust
    1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(49): warning C4700: Die nicht initialisierte lokale Variable "inverse" wurde verwendet.
    1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(14): warning C4789: Das Ziel der Speicherkopie ist zu klein.
    

    Und mein jetziger Code:

    int main()
    {
        int dim =0;
    	int matrix[3][3];
    	int inverse[3][3];
    	int i = 0;
    	int j = 0; 
    	int determ = 0;
    	void inverseberechnen(int inverse[3][3], int matrix[3][3], int dim, int determ);
    
    	printf("Geben Sie die gewünschte Dimension der Matrize an: (1,2 oder 3)\n");
    	scanf("%d", &dim);
    
    	matrix[3][3] = matrix[dim][dim];                                             // Übertragen der gewünschten Dimension auf die Matrix
    
    	for(i=0;i<dim;i++)                                                          // Auffüllen der Matrix über zwei for-Schleifen Zeile für Zeile
    	{
    		for(j=0;j<dim;j++)
    		{
    			printf("Geben Sie Element [%d][%d] ein:\n", i,j);
    			scanf("%d", &matrix[i][j]);
    		}
    	};
    
    	if (dim==1)                                                                   // Berechnung von detMatrix
    	{
    		determ = matrix[0][0];
    	}
    
    	else if(dim==2)
    	{
    		determ = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
    	}
    
    	else
    	{
    
    		determ = matrix[0][0]*matrix[1][1]*matrix[2][2]+
    		matrix[0][1]*matrix[1][2]*matrix[2][0]+
    		matrix[0][2]*matrix[1][0]*matrix[2][1]-
    		matrix[2][0]*matrix[1][1]*matrix[0][2]-
    		matrix[2][1]*matrix[1][2]*matrix[0][0]-
    		matrix[2][2]*matrix[1][0]*matrix[0][1];
    	}
    
          inverseberechnen(inverse[3][3],matrix[3][3],dim, determ);
    
    	return 0;
    
    }
    
    	void inverseberechnen(int inverse[3][3], int matrix[3][3], int dim, int determ)
    	{
    		int i;
    		int j;
    
    		switch(dim)
    		{
    		case 0: inverse[0][0] = 1.0f/determ;
    
    		case 1: { inverse[0][0] = +matrix[1][1]/determ;
    				  inverse[0][1] = -matrix[0][1]/determ;
    				  inverse[1][1] = +matrix[0][0]/determ;
    				  inverse[1][0] = -matrix[1][0]/determ;
    				}
    
    		case 2: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ;
    				  inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ;
    				  inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ;
    				  inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ;
    				  inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ;
    				  inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ;
    				  inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ;
    				  inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ;
    				  inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ;
    				}
    		}
    
    		printf("Die Determinante der Matrix:\n");
    
    				for(i=0;i<dim;i++)                          //Ausgabe der Matrix                               
    	{   
    		printf("|\t");
    
    		for(j=0;j<dim;j++)
    
    		{
    			printf("%d\t",matrix[i][j]);
    
    			if(dim==3 && j==2)
    				printf("| \n");
    			else if (dim==2 && j==1)
    				printf("| \n");
    			else if (dim ==1 && j==0)
    				printf("| \n");
    
    		}
    	};
    
    		printf("ist:\n");
    
    			for(i=0;i<dim;i++)                       //Ausgabe der Inversen                                  
    	{   
    		printf("|\t");
    
    		for(j=0;j<dim;j++)
    
    		{
    			printf("%d\t",inverse[i][j]);
    
    			if(dim==3 && j==2)
    				printf("| \n");
    			else if (dim==2 && j==1)
    				printf("| \n");
    			else if (dim ==1 && j==0)
    				printf("| \n");
    
    		}
    	};
    
    	}
    

    mfg
    Roger



  • Ich denke der aufruf muss so lauten:

    inverseberechnen(inverse,matrix[3][3],dim, determ);
    


  • Bei den Fehlermeldungen steht doch alles dabei.
    Zeilennummer und die Beschreibung auf deutsch.

    Zeile 9 ist an der Stelle verkehrt. die gehört vor main().

    Und nimm endlich Zeile 14 raus.

    Du hast da kein int sondern ein int[3][3]. ⚠ Großer Unterschied.
    Nochmal: inverse[3][3] ist ein Element (das noch nicht mal existiert). Da gehört einfach nur inverse hin.
    Das Kapitel über Arrays und Zeiger (evtl Strings) nochmal durcharbeiten.

    Zeile 67:
    Was kommt raus wenn du 1 durch eine Zahl > 1 teilst. Was ist die zugehörige int dazu?



  • @pyhax
    Fast. Laut dritter Warnung tritt ein Problem auch bei Parameter 2 auf.
    Die Lösung überlasse ich Roger.



  • Ich versuchs mal ;).

    Melde mich wenns klappt.

    So Fehlermeldungen sind weg. Ab der Dimension 2 gibt mir die Inverse seher komische Werte raus aber ich guck mal ob ich den Fehler finde.

    Danke euch. 👍



  • DirkB schrieb:

    @pyhax
    Fast. Laut dritter Warnung tritt ein Problem auch bei Parameter 2 auf.
    Die Lösung überlasse ich Roger.

    Ah, stimmt 😃 Jetzt sehe ich es auch



  • Ah jez hab ich matrix, inverse und determ in floats umgewandelt und kommt immer determinante = 0 raus :D...
    Und printf/scanf sind aufeinmal nicht mehr deklariert o.O.Ich dreh hier gleich am Rad ^^



  • Zeig doch mal den umgewandelten Code ...



  • Und die Datei kann nicht zum schreiben geöffnet werden o.O

    void inverseberechnen(float inverse[3][3], float matrix[3][3], int dim, float determ);
    
    int main()
    {
        int dim =0;
    	float matrix[3][3];
    	float inverse[3][3];
    	int i = 0;
    	int j = 0; 
    	float determ = 0;
    
    	printf("Geben Sie die gewünschte Dimension der Matrize an: (1,2 oder 3)\n");
    	scanf("%lf", &dim);
    
    	for(i=0;i<dim;i++)                                                          // Auffüllen der Matrix über zwei for-Schleifen Zeile für Zeile
    	{
    		for(j=0;j<dim;j++)
    		{
    			printf("Geben Sie Element [%d][%d] ein:\n", i,j);
    			scanf("%lf", &matrix[i][j]);
    		}
    	};
    
    	if (dim==1)                                                                   // Berechnung von detMatrix
    	{
    		determ = matrix[0][0];
    	}
    
    	else if(dim==2)
    	{
    		determ = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
    	}
    
    	else
    	{
    
    		determ = matrix[0][0]*matrix[1][1]*matrix[2][2]+
    		matrix[0][1]*matrix[1][2]*matrix[2][0]+
    		matrix[0][2]*matrix[1][0]*matrix[2][1]-
    		matrix[2][0]*matrix[1][1]*matrix[0][2]-
    		matrix[2][1]*matrix[1][2]*matrix[0][0]-
    		matrix[2][2]*matrix[1][0]*matrix[0][1];
    	}
    	printf("%lf",determ);
    
    	if(determ==0.0f)
    		printf("det ist 0\n");
    	else
    		inverseberechnen(inverse,matrix,dim, determ);
    
    	return 0;
    
    }
    
    	void inverseberechnen(float inverse[3][3], float matrix[3][3], int dim, float determ)
    	{
    		int i;
    		int j;
    
    		switch(dim)                                                                             //Berechnung der Inversen
    		{
    		case 0: inverse[0][0] = 1.0f/determ;
    
    		case 1: { inverse[0][0] = +matrix[1][1]/determ;
    				  inverse[0][1] = -matrix[0][1]/determ;
    				  inverse[1][1] = +matrix[0][0]/determ;
    				  inverse[1][0] = -matrix[1][0]/determ;
    				}
    
    		case 2: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ;
    				  inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ;
    				  inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ;
    				  inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ;
    				  inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ;
    				  inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ;
    				  inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ;
    				  inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ;
    				  inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ;
    				}
    		}
    
    		printf("Die Inverse der Matrix:\n");
    
    				for(i=0;i<dim;i++)                          //Ausgabe der Matrix                               
    	{   
    		printf("|\t");
    
    		for(j=0;j<dim;j++)
    
    		{
    			printf("%f\t",matrix[i][j]);
    
    			if(dim==3 && j==2)
    				printf("| \n");
    			else if (dim==2 && j==1)
    				printf("| \n");
    			else if (dim ==1 && j==0)
    				printf("| \n");
    
    		}
    	};
    
    		printf("ist:\n");
    
    			for(i=0;i<dim;i++)                       //Ausgabe der Inversen                                  
    	{   
    		printf("|\t");
    
    		for(j=0;j<dim;j++)
    
    		{
    			printf("%f\t",inverse[i][j]);
    
    			if(dim==3 && j==2)
    				printf("| \n");
    			else if (dim==2 && j==1)
    				printf("| \n");
    			else if (dim ==1 && j==0)
    				printf("| \n");
    
    		}
    	};
    
    	}
    


  • Roger292 schrieb:

    Ah jez hab ich matrix, inverse und determ in floats umgewandelt und kommt immer determinante = 0 raus :D...

    HAst du auch den Formatstring von scanf und printf geändert?
    Und nimm gleich double statt float.
    ⚠ Bei scanf ist es dann %lf und bei printf %f

    Roger292 schrieb:

    Und printf/scanf sind aufeinmal nicht mehr deklariert o.O.Ich dreh hier gleich am Rad ^^

    Hast du #include <stdio.h> ?

    Sonst zeig den aktuellen Code



  • Schau mal nach, ob noch eine Instanz von deinem Programm läuft.
    Sonst kann der Compiler keine neue .exe schreiben.

    Du hast die Formatstrings bei scanf und printf voll durcheinander.

    Zeile 16. dim ist ein int. Wie heißt der Formatspecifier für int?



  • Sooo wasn heute los mit mir o.O? Ja stdio.h is jez drin -.-

    Und Zeile 17 ein %d.( Ausversehen geändert, als ich den ganzen kram auf float ändern wollte.) Immer diese dummen kleinen Fehler.

    Beim schließen des Fensters hatte sich der Prozess nich richtig geschlossen. Jez kann er kompilieren.

    Aber die Determinantenrechnung scheint noch einen Bug zu haben.( sie ist immer 0) Wie hab ich das denn hinbekommen? -.-

    mfg Roger

    PS: Tut mir Leid, dass heute irgendwie nichts bei mir klappt 😞



  • Roger292 schrieb:

    Aber die Determinantenrechnung scheint noch einen Bug zu haben.( sie ist immer 0)

    Wie kommst du darauf.

    Auch wenn du dim = 1 machst und als Wert 4 eingibst?

    Mach doch mal eine Funktion

    float Determinante(float matrix[3][3], int dim);
    

    , baust die ein, testest die und postest dann mal das Ergebnis. (Code und Ausgabe)



  • Ja auch wenn ich dim 1 mache...

    Aber ich versuche das mal mit der Funktion.



  • #include <stdio.h>
    void inverseberechnen(float inverse[3][3], float matrix[3][3], int dim, float determ);
    float Determinante(float matrix[3][3], int dim);
    
    int main()
    {
        int dim =0;
    	float matrix[3][3];
    	float inverse[3][3];
    	int i = 0;
    	int j = 0; 
    	float determ = 0;
    
    	printf("Geben Sie die gewünschte Dimension der Matrize an: (1,2 oder 3)\n");
    	scanf("%d", &dim);
    
    	for(i=0;i<dim;i++)                                                          // Auffüllen der Matrix über zwei for-Schleifen Zeile für Zeile
    	{
    		for(j=0;j<dim;j++)
    		{
    			printf("Geben Sie Element [%d][%d] ein:\n", i,j);
    			scanf("%lf", &matrix[i][j]);
    		}
    	};
    
    	Determinante(matrix,dim);
    
    	printf("%f",determ);
    
    	if(determ==0.0f)
    		printf("det ist 0\n");
    	else
    		inverseberechnen(inverse,matrix,dim, determ);
    
    	return 0;
    
    }
    
    	void inverseberechnen(float inverse[3][3], float matrix[3][3], int dim, float determ)
    	{
    		int i;
    		int j;
    
    		switch(dim)                                                                             //Berechnung der Inversen
    		{
    		case 0: inverse[0][0] = 1.0f/determ;
    
    		case 1: { inverse[0][0] = +matrix[1][1]/determ;
    				  inverse[0][1] = -matrix[0][1]/determ;
    				  inverse[1][1] = +matrix[0][0]/determ;
    				  inverse[1][0] = -matrix[1][0]/determ;
    				}
    
    		case 2: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ;
    				  inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ;
    				  inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ;
    				  inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ;
    				  inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ;
    				  inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ;
    				  inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ;
    				  inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ;
    				  inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ;
    				}
    		}
    
    		printf("Die Inverse der Matrix:\n");
    
    				for(i=0;i<dim;i++)                          //Ausgabe der Matrix                               
    	{   
    		printf("|\t");
    
    		for(j=0;j<dim;j++)
    
    		{
    			printf("%f\t",matrix[i][j]);
    
    			if(dim==3 && j==2)
    				printf("| \n");
    			else if (dim==2 && j==1)
    				printf("| \n");
    			else if (dim ==1 && j==0)
    				printf("| \n");
    
    		}
    	};
    
    		printf("ist:\n");
    
    			for(i=0;i<dim;i++)                       //Ausgabe der Inversen                                  
    	{   
    		printf("|\t");
    
    		for(j=0;j<dim;j++)
    
    		{
    			printf("%f\t",inverse[i][j]);
    
    			if(dim==3 && j==2)
    				printf("| \n");
    			else if (dim==2 && j==1)
    				printf("| \n");
    			else if (dim ==1 && j==0)
    				printf("| \n");
    
    		}
    	};
    
    	}
    
    	float Determinante(float matrix[3][3], int dim)
    	{
    		float determ=0;
    
    		if (dim==1)                                                                   // Berechnung von detMatrix
    	{
    		determ = matrix[0][0];
    	}
    
    	else if(dim==2)
    	{
    		determ = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
    	}
    
    	else
    	{
    
    		determ = matrix[0][0]*matrix[1][1]*matrix[2][2]+
    		matrix[0][1]*matrix[1][2]*matrix[2][0]+
    		matrix[0][2]*matrix[1][0]*matrix[2][1]-
    		matrix[2][0]*matrix[1][1]*matrix[0][2]-
    		matrix[2][1]*matrix[1][2]*matrix[0][0]-
    		matrix[2][2]*matrix[1][0]*matrix[0][1];
    	}
    
    	return determ;
    
    	}
    

    Augabe Determinante = 0.0000
    Ich versteh das nicht... Es wär ja nicht ganz so ärgelich, wenn es morgen nicht fertig sein müsste.



  • Du solltest das Ergebnis von Determinante(matrix,dim); auch deiner Variablen determ zuweisen. (Zeile 30)

    Wegen Zeile 26:
    `Nochmal zu scanf():

    Einlesen von float : %f // Nein, hier ist kein kleines L

    Einlesen von double: %lf // Ja, hier ist ein kleines L

    Nochmal zu printf():

    Ausgabe von float : %f // Nein, hier ist kein kleines L

    Ausgabe von double: %f // Nein, hier ist auch kein kleines L

    `

    Sonst mach ein paar Kontrollausgaben ala

    printf("Bin jetzt in else (dim = 3) determ = %f matrix[0][0] = %f\n", determ, matrix[0][0]);
    


  • Jo mal gucken... Das mit %lf und %f hab ich auch gerade geändert^^ .

    EDIT: Ok das mit der Determinante geht jetzt, aber es ist mir schleierhaft, warum es vorher nicht ging, also als es noch nicht in einer Funktion war.

    Dann hab ich es ja fast. Die Inverse passt nämlich noch gar nicht. Ganz wirre Ausgabe mit sehr langen Zahlen.

    Mal gucken wo der Fehler liegen könnte, denn die Formel ist eigentlich ausm Anhang kopiert. Vielleicht helfen ein paar Kontrollausgaben.

    mfg
    Roger



  • Also er Springt aufjedenfall in de richtigen Case für jedes dim...
    Und es wird jedes Element der Inversen richtig ausgerechnet.

    Also hängt es irgendwo in der Ausgabe.

    switch(dim)                                                                             //Berechnung der Inversen
    		{
    		case 1: inverse[0][0] = 1.0f/determ;
    
    		case 2: { inverse[0][0] = +matrix[1][1]/determ;
    			      printf("CASE2 ELEMENT 00 %f",inverse[0][0]);
    				  inverse[0][1] = -matrix[0][1]/determ;
    				  printf("CASE2 ELEMENT 01 %f",inverse[0][1]);
    				  inverse[1][1] = +matrix[0][0]/determ;
    				  printf("CASE2 ELEMENT 11 %f",inverse[1][1]);
    				  inverse[1][0] = -matrix[1][0]/determ;
    				  printf("CASE2 ELEMENT 10 %f",inverse[1][0]);
    				}
    
    		case 3: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ;
    				  inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ;
    				  inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ;
    				  inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ;
    				  inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ;
    				  inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ;
    				  inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ;
    				  inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ;
    				  inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ;
    				}
    

    Die Kontrollprintfs geben die richtigen Werte aus!

    EDIT: Es klappt jetzt. Wieder ein SEHR DUMMER FEHLER das break; hinter jedem case hat gefehlt, der lief immer alle 3 cases durch -.-

    So jetzt nur noch ein LGS lösen und dann bin ich fertig, aber das sollte kein Problem sein^^.

    mfg Roger



  • So ich hoffe es ist noch wer da... 😃

    Ein letztes mal muss ich euch noch belästigen:

    Hab das Problem, dass die eingelesenen Werte eines Vektors irgendwie nicht gespeichert werden.

    Es handelt sich um den Vektor inhomogen:

    #include <stdio.h>
    void inverseberechnen(double inverse[3][3], double matrix[3][3], int dim, double determ);
    double Determinante(double matrix[3][3], int dim);
    double matrixmultiplikation(double inverse[3][3],double inhomogen[3],double geloest[3],int dim);
    
    int main()
    {
        int dim =0;
    	double matrix[3][3];
    	double inverse[3][3];
    	double inhomogen[3];
    	double geloest[3];
    	int i = 0;
    	int j = 0; 
    	double determ = 0;
    
    	printf("Geben Sie die gewünschte Dimension der Matrix an: (1,2 oder 3)\n");
    	scanf("%d", &dim);
    
    	for(i=0;i<dim;i++)                                                          // Auffüllen der Matrix über zwei for-Schleifen Zeile für Zeile
    	{
    		for(j=0;j<dim;j++)
    		{
    			printf("Geben Sie Element [%d][%d] ein:\n", i,j);
    			scanf("%lf", &matrix[i][j]);
    		}
    	};
    
    		for(i=0;i<dim;i++)                                                     // Einlesen des inhomogenen Anteils
    		{
    			printf("Geben Sie Element [%d] des inhomogenen Anteils ein:\n", i);
    			scanf("%lf", &inhomogen[i]);
    		};
    
    		printf("HOMO 0 %d",inhomogen[0]);  // Kontrolle ob gespeichert
    		printf("HOMO 1 %d",inhomogen[1]);
    		printf("HOMO 2 %d",inhomogen[2]);
    
    	determ=Determinante(matrix,dim);
    
    	if(determ==0)
    		printf("Determinante ist 0. Es gibt keine Inverse und keine Lösung.\n");
    	else
    	{
    		inverseberechnen(inverse,matrix,dim,determ);
    		matrixmultiplikation(inverse,inhomogen,geloest,dim);
    
    		printf("Die Lösung des Gleichungsystems\n");
    
    					for(i=0;i<dim;i++)                          //Ausgabe der Matrix                               
    	{   
    		printf("|\t");
    
    		for(j=0;j<dim;j++)
    
    		{
    			printf("%f\t",matrix[i][j]);
    
    			if(dim==3 && j==2)
    				printf("|\tx%d\t%d\n",i+1,inhomogen[i]);
    			else if (dim==2 && j==1)
    				printf("|\tx%d\t%d\n",i+1,inhomogen[i]);
    			else if (dim ==1 && j==0)
    				printf("|\tx%d\t%d\n",i+1,inhomogen[i]);
    
    		}
    
    	};
    	}
    
    	return 0;
    
    }
    
    	void inverseberechnen(double inverse[3][3], double matrix[3][3], int dim, double determ)
    {
    
    		switch(dim)                                                                             //Berechnung der Inversen
    		{
    		case 1: {inverse[0][0] = 1.0f/determ;
    			     break;
    				}
    
    		case 2: { inverse[0][0] = +matrix[1][1]/determ;
    				  inverse[0][1] = -matrix[0][1]/determ;
    				  inverse[1][1] = +matrix[0][0]/determ;
    				  inverse[1][0] = -matrix[1][0]/determ;
    				  break;
    				}
    
    		case 3: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ;
    				  inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ;
    				  inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ;
    				  inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ;
    				  inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ;
    				  inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ;
    				  inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ;
    				  inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ;
    				  inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ;
    				  break;
    				}
    		}
    }
    
    	double Determinante(double matrix[3][3], int dim)
    	{
    		double determ=0;
    
    		if (dim==1)                                                                   // Berechnung von detMatrix
    	{
    		determ = matrix[0][0];
    	}
    
    	else if(dim==2)
    	{
    		determ = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
    	}
    
    	else
    	{
    
    		determ = matrix[0][0]*matrix[1][1]*matrix[2][2]+
    		matrix[0][1]*matrix[1][2]*matrix[2][0]+
    		matrix[0][2]*matrix[1][0]*matrix[2][1]-
    		matrix[2][0]*matrix[1][1]*matrix[0][2]-
    		matrix[2][1]*matrix[1][2]*matrix[0][0]-
    		matrix[2][2]*matrix[1][0]*matrix[0][1];
    	}
    
    	return determ;
    
    	}   
    
    	double matrixmultiplikation(double inverse[3][3],double inhomogen[3],double geloest[3],int dim)
    	{
    
    				switch(dim)                                                                             //Berechnung der Lösungen
    		{
    		case 1: {geloest[0] = inhomogen[0];
    
    			     break;
    				}
    
    		case 2: { geloest[0] = inverse[0][0]*inhomogen[0]+inverse[0][1]*inhomogen[1];
    				  geloest[1] = inverse[1][0]*inhomogen[0]+inverse[1][1]*inhomogen[1];
    				  break;
    				}
    
    		case 3: { geloest[0] = inverse[0][0]*inhomogen[0]+inverse[0][1]*inhomogen[1]+inverse[0][2]*inhomogen[2];
    				  geloest[1] = inverse[1][0]*inhomogen[0]+inverse[1][1]*inhomogen[1]+inverse[1][2]*inhomogen[2];
    				  geloest[3] = inverse[2][0]*inhomogen[0]+inverse[2][1]*inhomogen[1]+inverse[2][2]*inhomogen[2];
    				  break;
    				}
    
    	return 0;
    
    	}
    }
    

    Der Compiler gibt mir auch keinen Fehler aus. Bei der Kontrollabfrage der Elemente kommt 0 raus.

    Mfg
    Roger


Anmelden zum Antworten