You are on page 1of 6

Universidad Nacional de san Cristóbal de Huamanga

Escuela Profesional de Ingeniería Civil


Programación Digital (IC246)
Implementación de Algoritmos para Determinar el
Número π

Autor: MSc. Ing. Edmundo Canchari Gutiérrez


Comentarios: edmundo.canchari@unsch.edu.pe
Visite: http//cgedmundo.wordpress.com
16 de diciembre de 2018

Índice

Índice 1

Índice de tablas 1

Índice de figuras 1

1. Método de Monte-Carlo para obtener π 1


1.1. Pseudocódigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Código fuente julia . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3. Código fuente python . . . . . . . . . . . . . . . . . . . . . . . . . 3

Índice de tablas

Índice de figuras

1. Método de Monte-Carlo para obtener π


La aproximación del valor de π mediante el método de Monte-Carlo consiste
en el procedimiento siguiente:

a). Dibujar un cuadrado de lado L y dentro de este un círculo de radio R “ L{2.

1
b). Seguidamente es necesario crear N puntos aleatorios todos dentro del cua-
drado, luego identificar la cantidad de puntos que se encuentran en el círculo.
Se tiene entonces N (número de puntos total, todos dentro del cuadrado) y
Nc (Número de puntos dentro del círculo). Para crear los puntos aleatorios
P px, yq, la ordenada x y la absisa y deben ser generados aleatoria-mente, las
coordenadas deben estar restringidos a la superficie del cuadrado elegido.

c). Para obtener el valor de π aproximado se relaciona los números de puntos


y las superficies, área del círculo Ac “ πL2 {4, área del cuadrado A “ L2 ,
relacionado los puntos y las superficies Nc {N “ Ac {A, de donde π “ 4Nc {N .
El valor aproximado de π está en función del número de puntos total (dentro
del cuadrado) y el número de puntos identificados dentro del círculo, está
demostrado que a mayor cantidad de puntos mejor aproximación se tendrá
para el valor de π.

2
1.1. Pseudocódigo
Algoritmo 1: Pseudocódigo para obtener π mediante el método de
Monte-Carlo
Datos: r(radio), Nmi(iteraciones máximo), t(tolerancia)
Resultado: Pia(pi aproximado), j(número de puntos total, igual al
número de iteraciones), Nc(número de puntos dentro del
círculo), Nfc(número de puntos fuera del círculo)
1 inicio;
2 /* Asignar valores iniciales */
3 P ia Ð 0, N c Ð 0, N f c Ð 0, j Ð 0;
4 mientras |P ia ´ π| ě t y j ă N mi hacer
5 /* Crear puntos aleatorios */
6 x Ð rand ˚ 2r ´ r;
7 y Ð rand ˚ 2r ´ r;
8 /* El punto se encuentra dentro del círculo? */
a
9 si x2 ` y 2 ď r entonces
10 N c Ð N c ` 1;
11 Graficar el punto con color azul ;
12 en otro caso
13 N f c Ð N f c ` 1;
14 Graficar el punto con color rojo;
15 fin
16 /* Número de iteraciones */
17 j Ð j ` 1;
18 /* Obtener Pi aproximado */
Nc
19 P ia Ð 4 ˚ ;
j
20 fin
21 imprimir: P ia, N Ð j, N c, N f c;
22 fin;

1.2. Código fuente julia


Para ejecutar el código fuente 1 instale JuliaPro en su versión gratuita, luego
las librerías requeridas.

1.3. Código fuente python


Para una adecuada ejecución del código fuente 2 instale python 3.7 y las li-
brerías requeridas, se recomienda instalar Anaconda 5.3.1 que integra las librerías

3
comúnmente utilizadas en ingeniería, como entorno de desarrollo integrado puede
elegir PyCharm.

4
1 using Plots
2 function AproxPiMonteCarlo(r,Nmi,t)
3 Pia=0; Nc=0; Nfc=0; j=0
4 xyc=[0 0]; xyr=[r r] #inicia matrices para almacenar puntos
5 while abs(Pia-pi)>=t && j<Nmi
6 #Crear puntos aleatorios
7 x=rand()*2*r-r
8 y=rand()*2*r-r
9 #El punto se encuentra dentro del círculo?
10 if sqrt(x^2+y^2)<=r
11 Nc=Nc+1
12 #Almacena los puntos dentro del círculo
13 xyc=[xyc;[x y]]
14 else
15 Nfc=Nfc+1
16 #Almacena los puntos fuera del círculo
17 xyr=[xyr;[x y]]
18 end
19 #Numero de iteraciones
20 j=j+1
21 #Pi aproximado
22 Pia=4*Nc/j
23 end
24 #Graficar
25 p=Plots.scatter(xyc[:,1],xyc[:,2])
26 p=Plots.scatter!(p,xyr[:,1],xyr[:,2])
27 display(p)
28 #Mostrar resultados
29 println("Número de iteraciones:", j)
30 println("Número de puntos total: ", j) #j=Nc+Nfc
31 println("Número de puntos dentro del círculo:", Nc)
32 println("Número de puntos fuera del círculo:", Nfc)
33 println("Pi Aproximado:", Pia)
34 end
35

36 clearconsole()
37 AproxPiMonteCarlo(1,50000,0.00001)

Listing 1: Código fuente Julia para aproximar π mediante el método de Monte-Carlo

5
1 import random
2 import math
3 import numpy as np
4 import matplotlib.pyplot as plt
5

6 def PiMonteCarlo(r,Nmi,t):
7 Pia=0; Nc=0; Nfc=0; j=0
8 Xc=[]; Yc=[]; Xfc=[]; Yfc=[] # Inicia vectores para
ãÑ almacenar puntos
9 while abs(math.pi-Pia)>=t and j<Nmi:
10 #Crear puntos aleatorios
11 x=random.uniform(-r,r)
12 y=random.uniform(-r,r)
13 #D=math.sqrt(math.pow(x,2)+math.pow(y,2))
14 if math.sqrt(math.pow(x,2)+math.pow(y,2))<=r:
15 Nc=Nc+1
16 #Almacena puntos
17 Xc.append(x); Yc.append(y)
18 else:
19 Nfc=Nfc+1
20 #Almacena puntos
21 Xfc.append(x); Yfc.append(y)
22 #Número de iteraciones
23 j=j+1
24 #Pi aproximado
25 Pia=4.0*Nc/j
26 # Gráficar
27 plt.figure()
28 plt.scatter(Xc,Yc, color="red", label="Puntos dentro del
ãÑ círculo", s=1)
29 plt.scatter(Xfc, Yfc, color="blue", label="Puntos fuera del
ãÑ círculo", s=1)
30 plt.legend(loc=4)
31 plt.xlabel("Absisa X")
32 plt.ylabel("Ordenada Y")
33 plt.title("Aproximación de PI por el Método de Monte-Carlo")
34 plt.axis("tight")
35 plt.grid(True)
36 plt.show()
37 #Mostrar resultados
38 print("Número de iteraciones:", j)
39 print("Número de puntos total: ", j) #j=Nc+Nfc
40 print("Número de puntos dentro del círculo:", Nc)
41 print("Número de puntos fuera del círculo:", Nfc)
42 print("Pi Aproximado:", Pia)
43

44 # Ejecuta la función
45 PiMonteCarlo(1,50000,0.00001)

6
Listing 2: Código fuente Python para aproximar π mediante el método de
Monte-Carlo

You might also like