Oppure

Loading
22/01/08 22:30
alexanderc88
Cercasi con urgenza programma in ANSI c che calcoli il determinante di una qualsiasi matrice quadrata.Spero che possiate rispondere a questa mia richiesta........
:asd:
aaa
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.
/**
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.
#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