23/01/08 14:25
bangirasu
Io per cose scolastiche ho dovuto fare n programma che triangolarizzasse una matrice e poi che calcolasse di deterninante dalla matrice triangolarizzata.
Calcolare il det di una matrice triangolare è molto + facile ke calcolare il det di una matrice nn triangolare.
PS: il det della matrice e il det della matrice triangolarizzata sono uguali in modulo
Il segno può cambiare a causa dei cambiamenti di riga.
Calcolare il det di una matrice triangolare è molto + facile ke calcolare il det di una matrice nn triangolare.
PS: il det della matrice e il det della matrice triangolarizzata sono uguali in modulo
Il segno può cambiare a causa dei cambiamenti di riga.
/** Tringolizza A e calcola il det dimensioni di A: N x N A va inizializzato nell'array di array "matrice" ESEMPIO: se A è: 1 2 3 4 5 6 7 8 9 la matrice sarà inizializzata così: #define N 3 [...parte di codice...] float matrice[N][M] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; **/ #include <stdio.h> #define N 4 /*dimensione A*/ #define M N void print(float [][M]); void triangola(float [][M]); void swap(float [], float []); float detT(float [][M]); int main() { /*float matrice[N][M] = { {0, 1, 5}, {4, 1, 6}, {2, 9, 8}, };*/ float matrice[N][M] = { {0, 5, 1, 5}, {4, 10, 1, 6}, {2, 6, 9, 8}, {5, 89, 3, 96} }; print(matrice); triangola(matrice); print(matrice); printf("Determinante della triangolare: %.4f\n",detT(matrice)); return 0; } void print(float matrice[][M]) { int i, j; printf("\n -------------------------------------------------------\n"); for (i=0;i<N;i++) { printf(" |"); for (j=0;j<M;j++) printf("%10.3f ", *(*(matrice+i)+j)); printf(" |\n"); } printf(" -------------------------------------------------------\n"); } void triangola(float a[][M]) { int j=0, i=0, k=0, k2, l, noskip; float alfa; for (k=1;k<N;k++) { noskip=0; for (i=k;i<N;i++) { if (a[k-1][j] == 0) { for (l=k;l<N;l++) if (a[l][j]!=0) { noskip=1; break; } /*printf("a[l][j] è %.3f\n", a[l][j]);*/ if (noskip==0) break; /*significa ke tutta la colonna (da pivot in giù è uguale a 0) quindi di può passare alla prossima colonna*/ swap((a[l]), (a[k-1])); /*a[k][j]=0;*/ /*utile poichè il computer sbaglia a fare i calcoli*/ } alfa=-(a[i][j]/a[k-1][j]); /*printf("alfa: %.3f = -( %.3f / %.3f )\n", alfa, a[i][j], a[k-1][j]);*/ for (k2=j;k2<M;k2++) { a[i][k2] = a[i][k2] + alfa*a[k-1][k2]; /*print(a);*/ } } j++; } } void swap(float a[], float b[]) { int i=0; float tmp; for (i=0;i<M;i++) { tmp=a[i]; a[i]=b[i]; b[i]=tmp; } } float detT(float a[][M]) { int i=0; float det=1; for (i=0;i<N;i++) det*=a[i][i]; return det; }
aaa
23/01/08 20:30
bangirasu
Adesso mi sono reso conto che aggiungendo una semplice variabile posso fare in modo ke il segno rimanga giusto.
Riecco il codice senza problemi di segno.
Riecco il codice senza problemi di segno.
#include <stdio.h> #define N 4 /*dimensione A*/ #define M N int scambi=0; void print(float [][M]); void triangola(float [][M]); void swap(float [], float []); float detT(float [][M]); int main() { /*float matrice[N][M] = { {0, 1, 5}, {4, 1, 6}, {2, 9, 8}, };*/ float matrice[N][M] = { {0, 5, 1, 5}, {4, 10, 1, 6}, {2, 6, 9, 8}, {5, 89, 3, 96} }; print(matrice); triangola(matrice); print(matrice); printf("Determinante della triangolare: %.4f\n",detT(matrice)); return 0; } void print(float matrice[][M]) { int i, j; printf("\n -------------------------------------------------------\n"); for (i=0;i<N;i++) { printf(" |"); for (j=0;j<M;j++) printf("%10.3f ", *(*(matrice+i)+j)); printf(" |\n"); } printf(" -------------------------------------------------------\n"); } void triangola(float a[][M]) { int j=0, i=0, k=0, k2, l, noskip; float alfa; for (k=1;k<N;k++) { noskip=0; for (i=k;i<N;i++) { if (a[k-1][j] == 0) { for (l=k;l<N;l++) if (a[l][j]!=0) { noskip=1; break; } /*printf("a[l][j] è %.3f\n", a[l][j]);*/ if (noskip==0) break; /*significa ke tutta la colonna (da pivot in giù è uguale a 0) quindi di può passare alla prossima colonna*/ swap((a[l]), (a[k-1])); scambi++; /*a[k][j]=0;*/ /*utile poichè il computer sbaglia a fare i calcoli*/ } alfa=-(a[i][j]/a[k-1][j]); /*printf("alfa: %.3f = -( %.3f / %.3f )\n", alfa, a[i][j], a[k-1][j]);*/ for (k2=j;k2<M;k2++) { a[i][k2] = a[i][k2] + alfa*a[k-1][k2]; /*print(a);*/ } } j++; } } void swap(float a[], float b[]) { int i=0; float tmp; for (i=0;i<M;i++) { tmp=a[i]; a[i]=b[i]; b[i]=tmp; } } float detT(float a[][M]) { int i=0; float det=1; for (i=0;i<N;i++) det*=a[i][i]; if (scambi%2!=0) det = det *(-1); return det; }
aaa