Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Paul_H
Anmeldungsdatum: 01.02.2006 Beiträge: 52 Wohnort: Bonn
|
Verfasst am: 11. Mai 2006 18:40 Titel: Determinante |
|
|
Hallo Leute,
wir haben kürzlich mit C angefangen (Gottseidank), und sollen nun ein Programm schreiben, welches folgende Matrizen multipliziert und anschließend nach Sarrus die Determinante der Ergebnismatrix berechnet.
Nun ja, an sich kein Problem. Mein Programm gibt jetzt meines Erachtens auch das richtige Ergebnis aus, aber die Programme von ein paar Studienkollegen geben in jedem Fall Null aus. Vielleicht seht ihr euch mein Programm mal an und sagt mir, was ihr davon haltet. |
|
Nach oben |
|
|
|
Paul_H
Anmeldungsdatum: 01.02.2006 Beiträge: 52 Wohnort: Bonn
|
Verfasst am: 11. Mai 2006 18:52 Titel: |
|
|
Ist die Dateierweiterung nun für jeden ersichtlich???
Ich kann nur drauf zugreifen, wenn ich eingeloggt bin. |
|
Nach oben |
|
|
Paul_H
Anmeldungsdatum: 01.02.2006 Beiträge: 52 Wohnort: Bonn
|
Verfasst am: 11. Mai 2006 18:54 Titel: |
|
|
#include <stdio.h>
#include <math.h>
main() {
int a=0;
int d=0;
int b=0;
int c=1;
double x[3][4];
double y[4][3];
double z[3][3];
double det;
/* Füllen der Matrizen mit dem Testbeispiel */
/* A */
for(a=0; a<4; a++){
for(b=0; b<3; b++){ /* fülle Matrize mit 1...12 auf */
y[a][b] = c;
c++;} }
/* B */
c=1;
for(a=0; a<3; a++){
for(b=0; b<4; b++){ /* fülle Matrize mit Wurzel_1... */
x[a][b] = sqrt(c); /* ...Wurzel_12 auf */
c++;} }
/* Berechnung von C durch Matrizenmultiplikation */
c=0;
d=0;
for(a=0; a<3; a++){ /* berechne nach bekannter Art und Weise*/
for(b=0; b<3; b++){ /* (X * Y) bzw. (B * A) */
z[a][b] = x[a][c]* y[d][b]+ x[a][c+1]* y[d+1][b]+
x[a][c+2]* y[d+2][b]+ x[a][c+3]* y[d+3][b];}
}
/* Ausgabe Matrix C */
printf("\nZ = X * Y: \n\n"); /* gebe schnell Matrix Z bzw. C mit 5 Nach- */
for(a=0; a<3; a++){ /* kommastellen aus */
for(b=0; b<3; b++){
printf("%.5f ", z[a][b]);} printf("\n");}
/* Berechnung der Det nach 'Sarrus' */
det = z[0][0]* z[1][1]* z[2][2]
+ z[0][1]* z[1][2]* z[2][0]
+ z[0][2]* z[1][0]* z[2][1]
- z[2][0]* z[1][1]* z[0][2]
- z[2][1]* z[1][2]* z[0][0]
- z[2][2]* z[1][0]* z[0][1];
printf("\n detC = %.28f \n", det); /*Det verdammt klein*/
} /*copyright 2006*/
Zuletzt bearbeitet von Paul_H am 11. Mai 2006 22:23, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Tobias
Anmeldungsdatum: 15.02.2005 Beiträge: 149
|
Verfasst am: 11. Mai 2006 21:45 Titel: |
|
|
Der exakte Wert der Determinante ist nach meiner Berechnung 0.
Wenn du einen sehr kleinen Wert erhältst, ist das nicht unbedingt auf einen Fehler im Algorithmus zurückzuführen sondern kann ein Rundungsfehler wegen fehlender Genauigkeit sein.
Kannst du mir erklären, was das .28 in printf "%.28f" macht? |
|
Nach oben |
|
|
Paul_H
Anmeldungsdatum: 01.02.2006 Beiträge: 52 Wohnort: Bonn
|
Verfasst am: 11. Mai 2006 21:57 Titel: |
|
|
ja klar, also das .28f sorgt dafür, dass 28 Stellen nach dem Komma ausgegeben werden.
Wahrscheinlich ist der Wert der Determinante wirklich null, und der Wert entsteht durch zwangsläufiges Abrunden bei kritischen Wurzeln.
Da ich aber diesbezgl. nicht sicher war, und ich halt zufällig entdeckt hab, dass viele Stellen nach dem Komma (bis zur 28ten) tatsächlich noch Ziffern ungleich null auftauchen, hat mich das doch ziemlich verwirrt. |
|
Nach oben |
|
|
|