2. Repetir el problema anterior con el método de muestreo

Anuncio
Resuelto por: Javier Osca Cotarelo
2. Repetir el problema anterior con el método de muestreo uniforme. ¿Cuál es la
relación entre las varianzas de uno y otro método? ¿Cuál es la relación de tiempo de
ordenador de uno y otro método? ¿Qué método es más eficiente? ¿Cuántos segundos de
CPU harían falta para calcular la integral dada con un error absoluto menor que 10−6?
A continuación puede verse la relación entre las varianzas σ2 para el método de
Montecarlo H&M y el método de muestreo uniforme MU. La relación entre ambas (MU
σ2)/(HM σ2) tiende a 0.3 lo que representa que es menor para el método de muestreo
uniforme que para el método de Montecarlo pero que disminuyen con N de la misma
manera porque esta relación se mantiene constante.
N
10
100
1000
10000
100000
1000000
10000000
100000000
H&M σ2
1.60E-02
1.72E-03
1.77E-04
1.71E-05
1.69E-06
1.68E-07
1.68E-08
1.69E-09
MU σ2
9.60E-03
5.98E-04
5.37E-05
5.04E-06
4.94E-07
4.99E-08
4.98E-09
4.98E-10
(MU σ2)/(HM σ2)
0.6001
0.3484
0.3041
0.2936
0.2923
0.2961
0.2955
0.2955
En la siguiente tabla pueden verse los tiempos de ejecución de uno y otro algoritmo ttotal,
el tiempo que tarda por bucle tbucle y la relación entre uno y otro. El algoritmo de
muestreo uniforme tarda la mitad de tiempo que el de Montecarlo.
N
10
100
1000
10000
100000
1000000
10000000
100000000
H&M (ttotal)
0.00E+00
0.00E+00
0.00E+00
1.50E-02
4.70E-02
8.27E-01
8.30E+00
8.06E+01
MU (ttotal)
0.00E+00
0.00E+00
0.00E+00
0.00E+00
3.10E-02
4.21E-01
4.29E+00
4.21E+01
H&M (tbucle)
0.00E+00
0.00E+00
0.00E+00
1.50E-06
4.70E-07
8.27E-07
8.30E-07
8.06E-07
MU (tbucle)
0.00E+00
0.00E+00
0.00E+00
0.00E+00
3.10E-07
4.21E-07
4.29E-07
4.21E-07
MU/HM(tbucle)
0.00
0.66
0.51
0.52
0.52
Tarda menos tiempo y con una dispersión menor, el método de muestreo uniforme es el
más eficiente. Podemos estimar el tiempo total con este método a partir de las
siguientes ecuaciones, dada una desviación típica esta es inversamente proporcional a
la raíz de N. A su vez el tiempo total es proporcional a N por el tiempo que tarda en
ejecutarse un bucle.
σ
σ 
σ = o ⇒ N = o
N
σ 
ttotal = Nt bucle
2
La constante σo la podemos calcular a partir de la regresión lineal de la desviación
estándar frente a la inversa de la raíz cuadrada de N. Con este resultado y las anteriores
ecuaciones se calcula el tiempo total.
Método de muestreo uniforme σvsN
1.20E-01
-1/2
y = 0.3081x - 0.0012
R2 = 0.9955
1.00E-01
σ
8.00E-02
6.00E-02
4.00E-02
2.00E-02
0.00E+00
0
0.05
0.1
0.15
0.2
0.25
N-1/2
σ
1.00E-06
N
9.49E+10
ttotal(s)
39953
ttotal(h)
11.1
Código del algoritmo de muestreo uniforme.
program ejer2
!Librerias
use util
implicit none
!Parametros
integer,parameter :: nexperiment=8;
real (kind=double),parameter :: a=0,b=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,muestra
nloops=1;
do i=1,nexperiment
total=etime(starttime)
Area=0.0_double;
Error=0.0_double;
nloops=nloops*10;
do j=1,nloops
call random_number(u)
muestra=f(a+(b-a)*u)
Area=Area+muestra
Error=Error+muestra*muestra
end do
Area=Area/dble(nloops)
Error=sqrt((Error/dble(nloops)-Area*Area)/dble(nloops))
Area=(b-a)*Area
Error=(b-a)*Error
total=etime(endtime)
write(*,*), nloops,Area,Error,endtime(1)-starttime(1)
end do
end program ejer2
0.3
0.35
function f(x)
!Librerias.
use util
implicit none
!in/out
real (kind=double) :: x,f
f=sqrt(1-(x*x))
end function
Código del algoritmo de Montecarlo (mismo que el ejercicio nº 1)
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