Está en la página 1de 5

Fsica Computacional.

Tarea 1
s Galda
mez Martnez.
Andre
Agosto 26 de 2015

1.- Eval
ua las siguientes integrales usando el metodo de Motecarlo
Z

1/4

exp(x2 )dx

[2 + ex cos(4x)dx

El programa resuelve T1-E1.1.f90 la primera integral.


program integral
write(*,*) Dame un numero entero
read(*,*) n1
write(*,*) Dame el numero de realizaciones
read(*,*) n2
Aqu hemos pedido se nos den dos n
umeros enteros, n1 nos da la semilla para hacer la pareja de
n
umeros aleatorios. n2 determinara el numero de parejas que se tomaran en cuenta, cuanto mayor sea
n2 mas preciso sera el valor de nuestra integral.
x=rand (n1)
y=rand(0)
Aqui definimos la pareja de n
umeros aleatorios.
m=0
do i=1,n2
x=(0.25)*rand(0)
y=(exp(0.0625))*rand(0)
Multiplicamos por (0.25) porque rand(n1) da n
umeros aleatorios entre 0 y 1, nosotros solo queremos
entre 0 y 0.25 ya que es el valor m
aximo que tomara la x. Lo mismo se hace para la variable y.
if (y<exp(x**2)) m=m+1
end do

Aqu redefinimos la variable m si la pareja de n


umeros esta por debajo de la curva que vamos a
integrar.
write (*,*) El resultado es=,(0.25)*exp(0.0625)*float(m)/float(n2)
Finalmente sacamos la raz
on entre numero de parejas aleatorias que se encuentran por debajo de la
funcion con respecto al numero total de parejas. Se multiplica por el area del cuadrado delimitado por
los maximos valores que pudieron tomar x,y.
call cpu time(tiempo)
write(*,*) Tiempo de ejecucion=, tiempo
end
Por ejemplo;
Dame un numero entero
9
Dame el numero de realizaciones
100000
El resultado es= 0.255492002
Tiempo de ejecucion= 1.60000008E-02
El programa T1-E1.2.f90 que se uso para resolver la segunda integral tiene la misma estructura, con
siderando las modificaciones necesarias. Unicamente
se cambian los valores maximos que tomaran las
variables x,y.
program integral
write(*,*) Dame un numero entero
read(*,*) n1
write(*,*) Dame el numero de realizaciones
read(*,*) n2
x=rand (n1)
y=rand(0)
m=0
do i=1,n2
x=3*rand(0)
y=3*rand(0)
if (y<2+exp(-x)*cos(4*x)) m=m+1
end do
write (*,*)El resultado es=, 3*3*float(m)/float(n2)
call cpu time(tiempo)
write(*,*) tiempo de ejecucion=, tiempo
end
2

Por ejemplo;
Dame un numero entero
15
Dame el numero de realizaciones
1000000
El resultado es= 6.05227518
tiempo de ejecucion= 0.135999992
2.- Calcula el
area de un circulo de radio R=2 usando el metodo de Montecarlo
El programa tiene la misma estructura que T1-E1.1.f90, en este caso estamos considerando solo un
cuarto del circulo, el que se encuentra en el cuadrante I, es por esto que el resultado final es multiplicado
por 4
program integral
write(*,*) Dame un numero entero
read(*,*) n1
write(*,*) Dame el numero de realizaciones
read(*,*) n2
x=rand (n1)
y=rand(0)
m=0
do i=1,n2
x=2*rand(0)
y=2*rand(0)
if (y**2<4-x**2) m=m+1
end do
write (*,*)El resultado es=, 4*4*float(m)/float(n2)
call cpu time(tiempo)
write(*,*) Tiempo de ejecucion=, tiempo
end
Por ejemplo;
Dame un numero entero
15
Dame el numero de realizaciones
100000
El resultado es= 12.5708799
Tiempo de ejecucion= 8.00000038E-03

3.- Elabora un programa que calcule el factorial de un numero entero n usando a) variables reales de
presicion simple y b)variables reales de doble presicion cual es el valor maximo de n para el cual se
puede calcular el factorial en ambos casos?
El programa T1-E3.1.f90 nos permite calcular el factorial de un numero entero usando variables de
presicion simple.
program factorial
integer :: n,i
real (kind=4)::fact
Aqui definimos la variable real con presicion simple
write (*,*) Dame numero entero
read(*,*) n
fact=1.0
do i=1,n
Aqu indicamos que la estructura de control se repita desde que i valga 1 hasta que valga n
fact=fact*i
Aqu redefinimos a la variable fact de acuerdo con la definicion del factorial
end do
write(*,*)El resultado es=, fact
end
El valor maximo que nos permite calcular este programa es para n=34 ya que 34!=2.9523...E+38,
puesto que con una variable real de presicion simple tenemos un rango que va desde E-38 hasta
E+38[1]
Por ejemplo;
Dame numero entero
34
El resultado es= 2.95232823E+38
El programa T1-E3.2.f90 tiene la misma estructura que T.1-E3.1.f90 solo que utiliza variables reales
de presicion doble.

program factorial
integer :: n,i
real (kind=8)::fact
write (*,*) Dame numero entero
read(*,*) n
fact=1.0
do i=1,n
fact=fact*i
end do
write(*,*)El resultado es=, fact
end
Con esta modificaci
on el numero m
aximo al cual se le puede obtener el factorial es n=170 ya que
170!=7.2574...E+306 y con variables reales de presicion doble tenemos un rango de magnitud desde
E-308 hasta E+308[1].
Por ejemplo;
Dame numero entero
170
El resultado es= 7.2574156153079940E+306

Referencias
[1] Specification Statements University of Southern California [en lnea]. [Fecha de consulta: 23
agosto 2015]. Disponible en: http://www-classes.usc.edu/engr/ce/108/text/fbk01.htm