Advertisement
manolitico

Fortran_Gauss

Feb 5th, 2019
426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ENLACE PARA LOS APUNTES: http://bit.ly/gia_informatica_gauss
  2.  
  3. ! PROGRAMA PRINCIPAL
  4.  
  5. program Gauss_Eliminacion
  6.  
  7.     !DONDE: A es la matriz ampliada de coeficientes de un sistema lineal
  8.     !DONDE: cont1, cont2, son contadores arbitrarios
  9.     !DONDE: x es el vector columna que almacena los resultados de x_1, x_2, ..., x_n
  10.  
  11.     use :: myModule
  12.     implicit none
  13.  
  14.     real(16), dimension (:,:), allocatable :: A
  15.     real(16), dimension (:,:), allocatable :: x
  16.  
  17.     integer :: n
  18.     integer :: cont1, cont2
  19.  
  20.     write(*,*) "Número de ecuaciones linealmente independientes: "
  21.     read(*,*) n
  22.  
  23.     allocate(A(n,n + 1))
  24.     allocate(x(1,n))
  25.  
  26.     !Leemos los datos de la matriz ampliada de coeficientes, por filas
  27.     do cont1 = 1, n
  28.         do cont2 = 1, n + 1
  29.             write(*,*) "Fila: ", cont1, ", columna: ", cont2
  30.             read(*,*) A(cont1, cont2)
  31.         end do
  32.     end do
  33.  
  34.     !Llamamos a la subrutina Gauss y escribimos los resultados de x_1, x_2, ..., x_n
  35.     call Gauss(A,n,x)
  36.     write(*,*) x(1, :)
  37.  
  38. end program Gauss_Eliminacion
  39.  
  40.  
  41.  
  42.  
  43.  
  44. !MODULO
  45. module myModule
  46.  
  47.     !DONDE: i, j, k son contadores arbitrarios
  48.     !DONDE: n es el número de ecuaciones linealmente independientes
  49.  
  50.     contains
  51.     subroutine Gauss (A,n,x)
  52.         integer i,j,k
  53.         integer, intent(in) :: n
  54.         real(16), intent(inout) :: A(n,n)
  55.         real(16), intent(out) :: x(n,1)
  56.  
  57.         !Hallamos la matriz triangular SUPERIOR. Se recomienda realizar
  58.         !este método a mano hasta entenderlo completamente.
  59.  
  60.         j = 1
  61.         do
  62.             i = 1
  63.             do
  64.                 if (i > j) then
  65.                     c = A(i,j)/A(j,j)
  66.                     k = 1
  67.                     do
  68.                         A(i,k)=A(i,k)-c*A(j,k)
  69.                         k = k + 1
  70.                         if (k > (n+1)) exit
  71.                     end do
  72.                 end if
  73.                 i = i + 1
  74.                 if (i > n) exit
  75.             end do
  76.             x(n, 1)=A(n, n + 1)/A(n,n)
  77.             if(j > n) exit
  78.             j = j + 1
  79.         end do
  80.  
  81.         !Escribimos en el vector columna (x) los resultados hallados de
  82.         !x_1, x_2, ..., x_n
  83.  
  84.         i = n - 1
  85.         do
  86.             sum = 0
  87.             j = i + 1
  88.             do
  89.                 sum = sum + A(i,j)*x(j, 1)
  90.                 j = j + 1
  91.                 if (j > n) exit
  92.             end do
  93.             x(i, 1) = (A(i,n+1)-sum)/A(i,i)
  94.             i = i - 1
  95.             if (i < 1) exit
  96.         end do
  97.  
  98.     end subroutine Gauss
  99. end module myModule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement