ESTE BLOG SE MANEJA COMO UN LIBRO. SI VAS AL INDICE ENCONTRARAS TODOS LOS TEMAS ORDENADOS POR MATERIAS. MUCHAS GRACIAS.

FORTRAN + ANALiSIS NUMERICO (Euler simple h variable)

Bueno, ahora vengo a presentares algo increíble... Un libro de fortran! Si. Descarga completamente gratuito, si leen atentamente tendrán todo lo que necesitan para interpretar el lenguaje fortran con facilidad. 

Este lenguaje de programación se utiliza para aplicaciones en ingeniería y matemática generalmente. Por lo tanto vengo a dejar también algunos programas interesantes.

Para los que no sepan de que va... el análisis numérico es la rama de la matemática que se encarga de utilizar las herramientas matemáticas previamente obtenidas para la resolución de problemas numéricos. Los problemas numéricos son aquellos que no pueden ser resueltos de manera analítica (es decir, haciendo cuentas con el lápiz y papel) y necesitan de una APROXIMACIÓN numérica. Un valor que, dependiendo del problema, se encontrara tan cerca del resultado que podemos asumir que es el resultado.

En el análisis numérico no se obtiene una función resultado como en la resolución analítica. Acá obtenemos una serie de puntos discretos (con un determinado error dependiendo del método de resolución seleccionado, cada uno con sus ventajas y desventajas) que serán la aproximación numérica de la función resultado. 

Libro de fortran: Descarga acá

Programa de análisis numérico: EULER SIMPLE.

Este método de resolución se basa en la aproximación por serie de Taylor utilizando los 2 primeros términos. Es una aproximación muy burda pero logra grandes resultados cuando se utiliza un intervalo relativamente chico y un paso de aproximación igual de chico.
Utiliza poca memoria y es fácil de programar. 
Desventajas: falla al hacer análisis de intervalos grandes. 

Este programa en particular que dejo escrito es con "h variable". Esto significa que el programa por si mismo corrige el paso para que los resultados tengan menos de un error previamente explicitado. Las desventajas son obvias... Quizas la h tiene que hacerse tan chica que nunca llega al final del intervalo, aparte que después buscar la respuesta que queres es dificultoso.. a menos que lo escribas en un archivo (altamente recomendable).

!en este programa alocan los vectores desde 1 y no desde 0
PROGRAM Eulersimple
implicit none 

real, allocatable::  v(:)
real xf,h
integer n,var 
REAL, PARAMETER :: ee=2.71828

 var= 2   !cantidad de componentes del vector
 allocate (v(var))
 v(1)=0.
 v(2)=5.
 xf=10.
 h=1.
    

 n=int((xf-v(1))/h+0.5)
 open(unit=2, file='puntos.dat', status='replace')
 write(2,*) v 
 call calculador(v,var,h)
 write(*,*) h
 deallocate(v)
 close(2)
 call system ("gnuplot -persist puntos.p")
 read(*,*) 

 CONTAINS

 FUNCTION vprima (v,var)
   integer var
   real :: v(var), vprima(var)
   vprima(1)= 1 !la derivada de x siempre es 1
   vprima(2)= -20*v(2)+ 7*(ee**(-0.5*v(1)))
  END FUNCTION vprima

 SUBROUTINE calculador (v,var,h)
  real:: v(var),h
  integer var

   do while (v(1)<=xf)
    h=ajustapaso(h, v)
    v= v+h*vprima(v,var)
    write(2,*) v
   end do 
  end subroutine calculador
  
FUNCTION ajustapaso(h,v) !aca ajusta el paso. Avanza 2 veces h/2 y 1 vez h, luego calcula la diferencia y compara con una tolerancia
  real:: h, tol, v(0:1), vec1 (0:1), vec2(0:1), ajustapaso
  logical ok 

  tol=0.005
  ok=.true.
  do while (ok)
    vec1= v+h*vprima(v,var)
    vec2= v+(h/2)*vprima(v,var)

  !print*,maxval(abs(vec2-vec1))
    if (maxval(abs(vec2-vec1))>=tol) then !aca compara con la tolerancia
      h=h/2.
      else
      ok=.false.
    end if
  end do
  ajustapaso=h
END FUNCTION ajustapaso


END PROGRAM 


                                                                       Muchas gracias.

No hay comentarios:

Publicar un comentario