Matlab - MATLAB AGUJA DE BUFFON

 
Vista:
sin imagen de perfil

MATLAB AGUJA DE BUFFON

Publicado por LUIS ALEJANDRO GOMEZ ARREAGA (9 intervenciones) el 09/07/2017 20:55:06
Buenas tardes,

Tengo que realizar un algoritmo para estimar el valor de pi utilizando el metodo de las agujas de buffon pero tengo un inconveniente y creo que estoy generando de manera incorrecta los numeros aleatorios

Estimación de los numeros aleatorios

Sea “a” la distancia entre el punto medio de la aguja
y la lınea más cercana. Esta distancia “a” es una variable aleatoria distribuida uniformemente en
el intervalo [0 , d/2]
Debido a la simetrıa, el ángulo que forma la aguja respecto a las lıneas paralelas, “θ” , es una
variable aleatoria distribuida uniformemente en el intervalo [0 , π] = [0 , 180°].
Una vez obtenidos los valores de “a” y “θ” , puede seguirse el siguiente procedimiento para
decidir si la aguja toca o intersecta la lınea más próxima al centro de la aguja (ver Figura 3.2):
• Si a ≤ (l/2) · sin(θ) , entonces la aguja toca o corta la lınea.
• Si a > (l/2) · sin(θ) , entonces la aguja ni toca ni corta la lınea.

Las muestras aleatorias “a” y “θ” pueden obtenerse a partir de números seudo aleatorios, u1 y
u2 , de la forma siguiente:
● a = (d/2) · u1 (3.4)
θ = 180° · u2 (3.5)

donde u1 y u2 son observaciones de una variable aleatoria uniformemente distribuida en el
intervalo [0,1].



*****************Algoritmo en matlab**********************

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
%inicializar Ncorta y n
Ncorta=0; %número de veces que la aguja corta o toca la l?nea 
n=0; %numero de lanzamientos 
 
%inicializar l, d, y Ntotal
Ntotal=3000; %numero total de lanzamientos de la aguja
l=10; %longitud de la aguja
d=20; %espaciado entre lineas paralelas donde d>=l
 
 
 
while(n<Ntotal)
 
%generar dos numeros pseudoaletorios u1, u2
 
 
u1 = random('Uniform',0,1);
u2 = random('Uniform',0,1);
 
 
%calcular a y angulo
a=(d/2)*(u1);
angulo=180*u2;
 
 
%procedimiento para saber si la aguja toca la linea
if a <= ((l/2)*(sin(angulo)))
n=n+1;
Ncorta=Ncorta+1;
else
n=n+1;
 
end
 
end
p=Ncorta/Ntotal;
pi=(2*l)/(p*d);
 
 
disp(pi);


Al ejecutarlo me dau n valor de 6.25 aproximadamente lo cual es erroneo


Agradezco de antemano cualquier ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

MATLAB AGUJA DE BUFFON

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 10/07/2017 00:02:40
cambia la funcion sin por sind ya que el ángulo está en grados :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
%inicializar Ncorta y n
Ncorta=0; %número de veces que la aguja corta o toca la l?nea 
n=0; %numero de lanzamientos 
%inicializar l, d, y Ntotal
Ntotal=3000; %numero total de lanzamientos de la aguja
l=10; %longitud de la aguja
d=20; %espaciado entre lineas paralelas donde d>=l
while(n<Ntotal)
%generar dos numeros pseudoaletorios u1, u2
u1 = random('Uniform',0,1);
u2 = random('Uniform',0,1);
%calcular a y angulo
a=(d/2)*(u1);
angulo=180*u2;
%procedimiento para saber si la aguja toca la linea
if a <= ((l/2)*(sind(angulo)))
n=n+1;
Ncorta=Ncorta+1;
else
n=n+1;
end
end
p=Ncorta/Ntotal;
pi=(2*l)/(p*d);
disp(pi);

saludos
https://www.facebook.com/royethmatlab/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar