Determinante in C mittels GSL
-
Hallo zusammen,
so langsam verzweifle ich an folgendem Problem:
Ich habe ein Programm geschrieben, in dem ich u.a. die Determinante einer Matrix benötige. Dazu verwende ich dann die sowieso schon in diesem Programm verwendete GSL.
Mein Code sieht nun also wie folgt aus:
double gsl_det(long **vecs, long dim) { double det = 0.0; int sign = 0; long i, j; gsl_permutation *p = gsl_permutation_alloc(dim); gsl_matrix *A = gsl_matrix_alloc(dim,dim); for (i=0; i<dim; i++) for (j=0; j<dim; j++) gsl_matrix_set(A,i,j,vecs[i][j]); gsl_linalg_LU_decomp(A,p,&sign); det = gsl_linalg_LU_det(A,sign); gsl_permutation_free(p); gsl_matrix_free(A); return det; }
Das Problem ist nun, dass mir diese Prozedur immer die Dimension statt der Determinante ausgibt.
Dazu habe ich den Code wie folgt geändert:double gsl_det(long **vecs, long dim) { double det = 0.0; int sign = 0; long i, j; gsl_permutation *p = gsl_permutation_alloc(dim); gsl_matrix *A = gsl_matrix_alloc(dim,dim); for (i=0; i<dim; i++) for (j=0; j<dim; j++) gsl_matrix_set(A,i,j,vecs[i][j]); printf("gsl-matrix:\n");for(i=0;i<dim;i++){for(j=0;j<dim;j++){double test=gsl_matrix_get(A,i,j);printf(" %2f",test);}printf("\n");} gsl_linalg_LU_decomp(A,p,&sign); printf("gsl-matrix:\n");for(i=0;i<dim;i++){for(j=0;j<dim;j++){double test=gsl_matrix_get(A,i,j);printf(" %2f",test);}printf("\n");} det = gsl_linalg_LU_det(A,sign);printf("Det.: %f\n",det); det = gsl_linalg_LU_det(A,sign); printf("Det.: %f\n",det); gsl_permutation_free(p); gsl_matrix_free(A); return det; }
Die Ausgabe im Gesamtprogramm sieht dann z.B. wie folgt aus:
Dim = 3 Matrix: 2 1 0 1 2 1 0 1 2 Initial-Matrix is 2 1 0 1 2 1 0 1 2 gsl-matrix: 2.000000 1.000000 0.000000 1.000000 2.000000 1.000000 0.000000 1.000000 2.000000 gsl-matrix: 2.000000 1.000000 0.000000 0.500000 1.500000 1.000000 0.000000 0.666667 1.333333 Det.: 3.000000 Det.: 3.000000
oder
Dim = 5 Matrix: 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 Initial-Matrix is 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 gsl-matrix: 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 gsl-matrix: 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 Det.: 5.000000 Det.: 5.000000 Determinante: 5
Wo ist mein Fehler? Die Ausgabe der LU-Zerlegung stimmt ja noch, nur dann wird irgendwie nicht das Produkt der Diagonalelemente als Determinante gesetzt.
Vielen Dank schonmal.
-
6H05T schrieb:
double gsl_det(long **vecs, long dim) { ... return det; }
Das Problem ist nun, dass mir diese Prozedur immer die Dimension statt der Determinante ausgibt.
Deine Funktion gibt den Inhalt der Variablen det zurück, für alles andere bist du selbst zuständig.
-
Hast du schon mal
sign
verändert?
-
DirkB schrieb:
Hast du schon mal
sign
verändert?Ja, das habe ich schon versucht. Ich habe jetzt nicht mehr weiter nachgeschaut, da ich ja auch einfach die Diagonaleinträge und sign multiplizieren kann. Dann stimmt die Determinante.
Trotzdem danke.
Bei Gelegenheit werde ich den Fehler einmal suchen.