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