Ejercicio_2.1Javier Osca

Anuncio
Resuelto por: Javier Osca Cotarelo
1. Calcular, usando el método de Monte-Carlo de aciertos y fallos la integral
1
∫
0
1 − x 2 dx =
π
4
Calcular la dependencia de la desviación cuadrática media σ del estimador MonteCarlo con el número de puntos usados (tomar N=10,100,1000, etc.) Calcular la integral
analíticamente y hacer una gráfica logarítmica del error real (entendido como la
diferencia entre el valor exacto y el estimador Monte-Carlo) frente a N. ¿A qué tiende la
pendiente de la gráfica cuando N -> ∞?
El método de Montecarlo consiste en generar N puntos aleatoriamente y contar
Cuantos puntos Na caen bajo la curva. Podemos relacionar la cantidad de puntos bajo la
curva con el área. Al ser un proceso de aceptación/rechazo el resultado sigue una
distribución binomial con una probabilidad p de aceptación. El error lo obtenemos a
partir de la desviación típica de una distribución binomial.
I = c (b − a ) p ± c(b − a )
p=
p (1 − p )
N
< Na >
N
Realizamos distintos experimentos para N=10, 100, 1000, etc. A partir de estos
experimentos calculamos el área, la desviación estándar σ, el error respecto del
resultado exacto ε y sus respectivos logaritmos.
N
10
100
1000
10000
100000
1000000
10000000
100000000
Area
0.800000
0.780000
0.771000
0.780200
0.784840
0.785744
0.785501
0.785403
σ
1.26E-01
4.14E-02
1.33E-02
4.14E-03
1.30E-03
4.10E-04
1.30E-04
4.11E-05
ε
0.014602
0.005398
0.014398
0.005198
0.000558
0.000346
0.000103
0.000005
log(N)
1
2
3
4
5
6
7
8
log(σ)
-0.897940
-1.382741
-1.876555
-2.382883
-2.886229
-3.386893
-3.886714
-4.386642
log(ε)
-1.835593
-2.267754
-1.841693
-2.284150
-3.253239
-3.461129
-3.987852
-5.291868
A continuación se pueden ver los resultados representados en escala logarítmica
dibujados respecto a la curva de desviación estándar teórica σt.
π
π
(1 − )
4
4
N
σt =
log(σ) vs log(N)
0
-1
log(σ)
-2
-3
-4
-5
-6
1
2
3
4
5
6
7
8
5
6
7
8
log(N)
log(ε) vs log(N)
0
log(σ)
-1
-2
-3
-4
-5
-6
1
2
3
4
log(N)
El logaritmo de la desviación estándar teórica log(σt) decrece con una pendiente de -1/2
respecto del logaritmo de N tal y como se deduce de las ecuaciones.
1
log( σ ) = − log( N ) + log(
2
p (1 − p )c (b − a ))
Obsérvese que la desviación estándar calculada sigue la curva teórica mientras que el
error real sigue una pendiente un poco más pequeña. El motivo es que el error estimado
es un poco mayor que el real.
Código:
program ejer1
!Librerias
use util
implicit none
!Parametros
integer,parameter :: nexperiment=8;
real (kind=double),parameter :: a=0,b=1,c=1;
!Funciones
real (kind=double) :: f
!indices
integer :: i,j
!variables
integer :: na,nloops
real :: total,etime,starttime(2),endtime(2)
real (kind=double) :: u,v,p,Area,Error
nloops=1;
do i=1,nexperiment
total=etime(starttime)
na=0.0_double;
nloops=nloops*10;
do j=1,nloops
call random_number(u)
call random_number(v)
if ( f(a+(b-a)*u)> c*v ) na=na+1
end do
p=dble(na)/dble(nloops)
Area=c*(b-a)*p
Error=sqrt(p*(1-p)/dble(nloops))*c*(b-a)
total=etime(endtime)
write(*,*), nloops,Area,Error,endtime(1)-starttime(1)
end do
end program ejer1
function f(x)
!Librerias.
use util
implicit none
!in/out
real (kind=double) :: x,f
f=sqrt(1-(x*x))
end function f
Descargar