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
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