SHARE
TWEET

Untitled

a guest Oct 23rd, 2019 64 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Funciones para la resolución de un sistema matricial por el método de Cholesky */
  2.  
  3. #include "mn_determinante.h"
  4. #include "mn_lapack.h"
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7.  
  8. /// CÁLCULO DEL DETERMINANTE DE UNA MATRIZ USANDO UN ALGORITMO DEL
  9. /// MÉTODO DE GAUSS PARA CONVERTIR A UNA MATRIZ EN TRIANGULAR USANDO PIVOTACIÓN FÍSIC
  10. /// DEVUELVE 0 SI LA MATRIZ ESTÁ VACÍA O NO ES CUADRADA
  11. real mn_determinante_Gauss(Array2D< real > &M)
  12. {
  13.   /// COMPROBAMOS PARÁMETRO DE ENTRADA
  14.   if(M.dim1()==0 || M.dim1()!=M.dim2()) return 0.;
  15.  
  16.   /**  HACEMOS UNA COPIA DE LA MATRIZ ORIGINAL PARA MODIFICARLA Y CONVERTIRLA EN TRIANGULAR*/
  17.   Array2D< real > A=M.copy();
  18.  
  19.   /** DECLARAMOS LA MATRIZ Mi DONDE SE DEVUELVE LA MATRIZ INVERSA SI TODO VA BIEN */
  20.   Array2D< real > Mi(A.dim1(),A.dim2());
  21.  
  22.   /** VARIABLE DONDE SE ALMACENA Y DEVUELVE EL DETERMINANTE*/
  23.   real determinante;
  24.  
  25.   /** HACER ALUMNO */
  26.  
  27.   /** CONVERTIMOS EL SISTEMA EN UNO TRIANGULAR USANDO EL METODO DE GAUSS */
  28.   int Npiv=0;
  29.   for(int k=0;k<A.dim1();k++){
  30.     /** DETECTAMOS EL MAXIMO DE LA DIAGONAL HACIA ABAJO */
  31.     real max=fabs(A[k][k]);
  32.     int kmax=k;
  33.     for(int m=k+1;m<A.dim1();m++){
  34.       if(fabs(A[m][k])>max){
  35.         max=fabs(A[m][k]);
  36.         kmax=m;
  37.       }
  38.     }
  39.     /// SI LA DIAGONAL SE ANULA SALIMOS
  40.     if(max==0.) return 0.;
  41.  
  42.     /** HACEMOS LA PIVOTACION SI FUERA NECESARIO */
  43.     if(kmax!=k){
  44.       Npiv++;
  45.       for(int i=0;i<A.dim1();i++){
  46.         double temp=A[k][i];
  47.         A[k][i]=A[kmax][i];
  48.         A[kmax][i]=temp;
  49.       }
  50.     }
  51.     /** CONVERTIMOS EN 0 DE LA DIAGONAL HACIA ABAJO */
  52.     for(int j=k+1;j<A.dim1();j++){
  53.           real mul=-A[j][k]/A[k][k];
  54.           A[j][k]=0.;
  55.           for(int n=k+1;n<A.dim1();n++) A[j][n]+=mul*A[k][n];
  56.     }
  57.   }
  58.  
  59.   /// CALCULAMOS EL DETERMINANTE DE LA MATRIZ TRIANGULAR
  60.   determinante=1;
  61.   for(int k=0;k<A.dim1();k++)
  62.     determinante*=A[k][k];
  63.  
  64.   if(Npiv%2==1) determinante*=-1.;
  65.  
  66.   /// SE IMPRIME LA MATRIZ A TRIANGULARIZADA.
  67.   A.print("TRIANGULACION MATRIZ ORIGINAL (ALUMNO)");
  68.  
  69.   return determinante;
  70.  
  71. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top