Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement