Advertisement
Guest User

a

a guest
Oct 31st, 2014
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.67 KB | None | 0 0
  1. /* COGNOM1: PASCUAL
  2.  * COGNOM2: MIRALLES
  3.  * NOM : NICOLÁS
  4.  * DNI :47942665-Q
  5.  * Exercici 3.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <math.h>
  11.  
  12. int main (void){
  13.     carregarMatriu();
  14.   return 0;
  15. }
  16.  
  17. void carregarMatriu(void){
  18.     int n, i, j, variable;
  19.     double **A, **B, tol, **C;
  20.     //demanem la dimensio de la matriu
  21.     printf("doneu la dimensio de la matriu, (n) =\n");
  22.     variable= scanf("%d", &n);    
  23.     //demanem la tolerancia
  24.     printf("introdueix la tolerancia:");
  25.     variable= scanf("%lf", &tol);
  26.     //introduim els valors de la matriu A
  27.     printf("introduiu els valors de la matriu A: \n");  
  28.     A= (double **)malloc(n*sizeof(double*));    //reservem memoria per A
  29.     if (A== NULL){
  30.       printf("No hi ha prou memoria");
  31.       exit(1);
  32.     }
  33.     //llegim fila per fila
  34.     for (i=0; i<n; ++i){
  35.       A[i] = (double*)malloc(n*sizeof(double));
  36.       if(A[i]== NULL) {
  37.     exit(2);
  38.       }
  39.         for (j=0; j<n; ++j){     //llegim columna per columna
  40.             variable= scanf("%lf", &A[i][j]);  //escanejem el valor i l'adjudiquem a A[i][j]
  41.             if(fabs(A[i][j])<= tol){  // si el nombre introduit es mes petit que la tolerancia donada
  42.                 A[i][j]=0.000;          //el nombre serà igual a 0.
  43.             }
  44.         }
  45.     }  
  46.     //creem la matriu identitat amb 1 a la diagonal
  47.     printf("la matriu B es: \n");
  48.     B= (double **)malloc(n*sizeof(double*));
  49.     for(i=0; i<n; i++){
  50.         B[i] = (double*)malloc(n*sizeof(double));
  51.         for (j=0; j<n; j++){
  52.             if(j==i){
  53.                 B[i][j]=1;
  54.             } else {
  55.                 B[i][j]=0;
  56.             }
  57.         }
  58.     }
  59.     printf("\n Matriu A: \n");
  60.     mostraMatriu(n, A);
  61.     printf("Matriu B: \n");
  62.     mostraMatriu(n,B);
  63.     inversaA(n,A,B,tol);
  64.     C= (double **)malloc((n)*sizeof(double*));
  65.     prodMatMat(n, A,B,C);
  66.   }
  67.  
  68.   //creem un metode per imprimir la matriu
  69.   void mostraMatriu(int n, double **A){
  70.       int i,j;
  71.       for(i=0; i<n; ++i){
  72.           for(j=0; j<n; ++j){
  73.               printf("%16.7e ", A[i][j]);
  74.           }
  75.           printf("\n");
  76.       }
  77.   }
  78.  
  79.   //creem un metode per imprimir la matriu
  80.   void mostraMatriu2(int n, int k, double **A){
  81.       int i,j;
  82.       for(i=0; i<n; ++i){
  83.           for(j=0; j<k; ++j){
  84.               printf("%16.7e ", A[i][j]);
  85.           }
  86.           printf("\n");
  87.       }
  88.   }
  89.   //creem un metode per imprimir un vector
  90.   void mostraVector(int n, double *b){
  91.       int i;
  92.       for(i=0; i<n; ++i){
  93.           printf("%16.7e ", b[i]);
  94.       }
  95.       printf("\n");
  96.   }
  97.  
  98.   int inversaA(int n, double **A, double **B, double tol){
  99.     double **AB;
  100.     double r, mult, negat;
  101.     int j, j2, i, k, aux, i2, aux2, cicle, j3, contador, contador2;
  102.     //k sera la dimensio de la nova matriu
  103.     k=n+n;
  104.     //reservem memoria per la matriu AB
  105.     AB= (double **)malloc((n+n)*sizeof(double*));
  106.     //recorrem les files
  107.     for(i=0; i<n; i++){
  108.         AB[i]= (double *)malloc(k*sizeof(double));
  109.         for(j=0; j<n; j++){ //recorrem les columnes
  110.             AB[i][j]= A[i][j];  //copiem en AB la part que volem de A
  111.             AB[i][n+j]= B[i][j];    //copiem en AB despres de A, la matriu identitat  
  112.           }
  113.       }
  114.       printf("Matriu AB: \n");
  115.       mostraMatriu2(n,k, AB);
  116.       printf("\n \n");
  117.       // fins aqui la creacio de la matriu AB #######################
  118.       // ara busquem començar a fer gauss amb 1 en la diagonal#######      
  119.       cicle=0;    //inicialitzem diverser variables que farem servir mes endavant
  120.       j=0;
  121.       aux=0;
  122.       for (j3= 0; j3<n; j3++){  //recorrem les columnes
  123.         for (i=aux; i<n; i++){  //baixem en diagonal
  124.               mult= (1/(AB[i][j3])); //guardem l'invers de la posicio que ens interessa
  125.               if(AB[i][j3]!=1){ //si no es un 1 entrem en el bucle                      
  126.                   for(j2=0; j2<k; j2++){ //per cada columna de tota la matriu AB
  127.                       AB[i][j2]= mult* (AB[i][j2]);     //multipliquem la fila per l'invers
  128.                   }
  129.               }          
  130.               aux++; //incrementem el contador per anar en diagonal en el bucle
  131.           }
  132.       aux2=cicle;
  133.           for (i=cicle; i<n-1; i++){
  134.               for(j=0; j<k;j++){
  135.                   AB[i+1][j]= (AB[i+1][j])-(AB[aux2][j]);   //agafem i fem la resta i ho guardem en la posicio
  136.           }
  137.         }
  138.       cicle= cicle++;
  139.       aux= cicle;
  140.       }
  141.       // aqui ja hem conseguit els 0 en el triangle inferior##############################
  142.       /// Ara anem a posar 0 en el triangle superior #####################################
  143.     contador=0; //inicialitzem un contador
  144.     for(j=1; j<n; j++){     //iterem per columnes començant per la 2na
  145.         contador++;         // incrementem el contador
  146.         for(i=0; i<contador; i++){  //baixem en diagonal les i
  147.             i2=contador;            //igualem i2 el contador
  148.             negat= 0-(AB[i][j]);    //agafem en una variable l'invers a multiplicar
  149.             for(j2=j; j2<k; j2++){  //per totes les variables de la matriu en columnes
  150.             AB[i][j2]= AB[i][j2]+(AB[i2][j2]*negat);  //multipliquem el valor de la columna i sumem l'altre
  151.            }
  152.          }  
  153.     }
  154.     printf("La matriu resultant es: \n");
  155.     mostraMatriu2(n,k,AB);
  156.     printf("############################### \n");
  157.        
  158.     //un cop tenim AB anem a agafar la matriu que ens interessa i guardarla en B  
  159.     for(i=0; i<n; i++){
  160.         aux=0;
  161.         for(j=n; j<k; j++){
  162.             B[i][aux]= AB[i][j];
  163.             aux++;
  164.         }
  165.     }
  166.     printf("\n la matriu inversa es: \n");
  167.     mostraMatriu2(n,aux,B);
  168.   }
  169.  
  170.  
  171.   void prodMatMat (int n, double **A, double **B, double **C){
  172.       int i,j;
  173.       double k;
  174.      
  175.     for(i=0; i<n; i++){
  176.         C[i]= (double *)malloc(n*sizeof(double));
  177.         k=0.0;
  178.           for(j=0; j<n; j++){
  179.               k= k+ (A[i][j]*B[j][i]);
  180.           }
  181.         C[i][j]= k;
  182.       }
  183.       printf("el vector C es: \n");
  184.       mostraMatriu(n,C);
  185.   }
  186.  
  187.   void prodMatVec(int n, double **A, double *x, double *y){
  188.     int i, j;
  189.     double k;
  190.    
  191.     for (i=0; i<n; i++){                    //recorrem fila per fila
  192.         k=0.0;                              //igualem una variable a 0 cada cop que cambiem de fila
  193.         for(j=0; j<n; j++){                 //recorrem columna per columna
  194.             k= k+ (A[i][j]*x[j]);           // fem la multiplicacio i sumem la fila
  195.            
  196.         }
  197.         y[i]= k;                            //guardem el valor en el vector y
  198.    
  199.     }
  200.  
  201.    
  202.     printf("el vector y es: \n");
  203.     mostraVector(n, y);                     // cridem a mostrar vector
  204.    
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement