Aproximándonos a pi
Existen muchos métodos que nos permiten aproximarnos al mágico número $latex pi $. Con un poco de astucia podemos, pensando un poco, imaginar un método para su aproximación. Lo difícil es que seamos capaces de inventar algo eficiente.
Hace algún tiempo comentaba este tema con un amigo. Hablábamos de la Aguja de Buffón, un método que yo acababa de conocer y que me dejó pasmado, pues es tremendamente ocurrente y no demasiado complejo.
Éste método nos dice que, si tenemos una aguja de longitud $latex ell $ y la dejamos caer de forma aleatoria sobre un plano dividido en lineas paralelas entre sí una distancia $latex D le ell $, la probabilidad de que la aguja corte a alguna linea es de $latex frac{2 ell}{D pi}$. De ahí, y suponiendo $latex N $ agujas totales y $latex C $ agujas que cortan una linea, tenemos que $latex pi = frac{2ND}{C ell} $. Cuantas más agujas tiremos, mejor aproximación obtendremos de $latex pi $. La demostración en el enlace de antes.
Éste método es bastante lento, pues ganamos unos pocos decimales por cada cientos de iteraciones. Pero lo curioso del asunto no es la eficiencia, sino la ocurrencia del método. Si de verdad queremos una buena aproximación deberíamos interesarnos por las Series de Ramanujan (nada recomendable sin un buen nivel de matemáticas), que convergen a $latex pi $ con velocidades de vértigo. Especialmente la descubierta por los hermanos Chudnovsky en 1987, que ofrece ni más ni menos que 15 cifras decimales de $latex pi$ por término:
$latex frac{1}{pi} = 12 sum^infty_{k=0} frac{(-1)^k (6k)! (13591409 + 545140134k)}{(3k)!(k!)^3 640320^{3k + 3/2}} $
Existen otros métodos para las aproximaciones de $latex pi $. Si queréis mas información, echad un vistazo al Algoritmo de Borwein, de orden de convergencia 4 (en cada iteración se cuadruplica el número de decimales) y a sus derivaciones, el Algoritmo de Gauss-Legendre/Brent-Salamin con convergencia de segundo orden, la Fórmula de Bailey-Borwein-Plouffe que permite calcular el n-ésimo dígito de $latex pi $ sin necesidad de calcular los anteriores (¡realmente interesante!), la Fórmula de Leibniz , el Algoritmo de Liu Hui que es bastante gráfico (aunque no tanto como el que enseñaré luego), las fórmulas de tipo Machin, que es el método que se usó para batir el record de cómputo de decimales de $latex pi $, la solución de Euler al Problema de Basilea o el Producto de Wallis del que hablaré otro día.
El método de la Diana
Lo que yo venía a contar era esto. Como comentaba antes, un día estaba hablando con un colega de la Aguja de Buffón. Yo quedé sorprendido por lo fácilmente aplicable en la vida real que era el método, pero me enseñó otro aún mas sencillo.
Imaginemos un círculo inscrito en un cuadrado de lado $latex 2u $. Éste círculo tendrá, lógicamente, radio 1. El área del cuadrado será $latex A_{cuad} = l^2=4u^2$ y la del círculo inscrito será $latex A_{circ} = pi r^2 = pi u^2 $. De aquí en adelante obviaré las unidades.
Ahora bien, ¿cual es la probabilidad de que dado un punto dentro de la figura, éste esté dentro del círculo? O dicho de otra forma: si nuestra figura fuera una diana y estuviéramos jugando a los dardos, ¿cual sería la probabilidad de que un dardo diera en la diana (círculo) y no en el marco?
La probabilidad vendrá dada por la relación que hay entre el área del círculo y la del cuadrado, es decir, $latex frac{A_{circ}}{A_{cuad}} = frac{pi}{4} $. También podremos calcular la probabilidad a base de pruebas, es decir, tirando dardos al azar (podemos llamar a Steve Wonder y José Feliciano) y viendo la relación que hay entre las veces que acertamos y las totales: $latex frac{dardos_{diana}}{dardos_{total}} $
Podemos por tanto igualar ambas relaciones (la teórica y la experimental): $latex frac{pi}{4} = frac{ dardos_{diana}}{dardos_{total}} $ y despejando $latex pi $ tenemos que $latex pi = 4 frac{dardos_{diana}}{dardos_{total}} $
¿Qué nos dice esto exactamente? Pues, siendo claros, que cuantos más dardos tiremos, más nos acercaremos a $latex pi $. Siendo técnicos, deberíamos decir que la función $latex f(dardos)= 4 frac{dardos_{diana}}{dardos_{total}} $ converge a $latex pi $ cuando $latex dardos $ tiende a infinito.
Para demostrarlo, podríamos pasarnos días y días tirando dardos con los ojos vendados sobre nuestra diana e ir apuntando los resultados. Pero hombre… para algo están los ordenadores. El siguiente script lo he hecho en python+pythong y calcula decimales de $latex pi $ por éste método para un número de dardos concreto.
def pi_diana(disparos):
create_rectangle(0, 0, 1000, 1000, "blue")
create_circle(500, 500, 500, "red")
dentro=0
for i in range(disparos):
x=random()*1000
y=random()*1000
if sqrt(pow(500-x, 2)+pow(500-y, 2))<500:
create_point(x, y, "green")
dentro+=1
else:
create_point(x, y, "red")
return float(4*dentro/float(disparos))
Como veis, es bastante sencillo. Ahora los resultados para distintos disparos:
Tal y como era de esperar, el resultado nos recuerda un poco a $latex pi $. Pero tampoco mucho. Hemos estado dos tardes jugando a los dardos, y obtenemos dos únicas cifras significativas, vaya chasco, ¿una cifra por día?
No nos queda otra que seguir tirando dardos.
Durante los próximos dos meses, seguimos sacrificando la siesta por los dardos, hasta que llegamos a la cifra de los 10.000 dardos lanzados.
Uf, ya hemos hecho un montón de agujeros, ¿eh?. Hemos conseguido otra cifra significativa más. Ya la mayoría de la gente se conformaría con decir que $latex pi = 3.14 $ y se quedarían tan anchos. Pero nosotros no, nosotros somos queremos más.
No nos rendimos, y después de dos años y medio jugando a los dardos sin parar para comer, los dardos ya no clavan porque no queda diana. Lo que antes era diana, ahora es un gran agujero y nuestros dardos chocan con la pared. Paramos pues, y nos conformamos con lo que tenemos.
Lo peor de todo es que han sido dos años perdidos, pues no hemos conseguido ni una cifra significativa más. Creo que después de esto podemos reconocer que el método no es demasiado efectivo… ¡pero nosotros hemos estado dos años sin ir a trabajar!
En fin, como veis, el ocurrente método es ineficiente como él sólo, pero no importa. La gracia del asunto es ver cómo $latex pi$, y las matemáticas en general, están más presentes en la vida real de lo que pensamos, y que esos números que en un principio nos parecen inventados como $latex pi $, $latex e$ o $latex i $ nos rodean en todo momento.









Buenas!!
Que interesante los métodos que “casualmente” convergen a múltiplos de Pi. ¿Que relación tiene este número, que no se puede coger(tan solo dibujar), con el ser humano?
Te propongo una peli de aronofsky, llamada unnmmmm, no me acuerdo….. ah! SI! la peli se llama “Pi” xD
P.D.: ¿alguien tiene agujas de L? las que tengo son rectas… xD
Salu2
Eso se llama el método de Montecarlo.
La peli que comenta Salvatore creo que en España se estrenó con el título “Pi. Fe e el caos” y a pesar de su ridículo presupuesto merece la pena verse. No voy a comentar nada sobre ella por si alguien no la visto y quiere pasar un buen rato, pero introduce un par de conceptos sobre Pi bastante inquietantes.
Una breve reseña de solo 3m de la peli en el youtube.
http://www.youtube.com/watch?v=jrHvw_y0Fgg
Revisa el algoritmo, no sea que esté mal.
Intenta hacer algunas pruebas más, si en ellas te converge en 3.145… es posible que haya un error.
Que bacán este post, Saludos desde Perú!!
Hola. Me ha parecido muy interesante tu artículo y explicado de una forma muy “comestible”
Considero que está muy bien este método si lo realizas mediante un programa como ese en el que utilizas una variable aleatoria de tipo UNIFORME mediante random(), pero en la vida real, si te pones a pegar tiros a una diana, esa variable aleatoria dejaría de ser uniforme, tendiendo a una variable aleatoria GAUSSIANA y por tanto este método se echaría a perder. ¿Me equivoco?
Un saludo y gracias por el artículo, muy interesante
Respondiendo a Crispu:
Depende de la pericia del lanzador. Si suponemos que el lanzador apunta al centro de la diana y, además, que se trata de un lanzador experto podemos pensar que es más probable que acierte cerca del centro de la diana que en la periferia. En ese caso, una distribución de tipo gaussiano podría resultar adecuada. Si suponemos que el lanzador es malo, malo, entonces una distribución uniforme puede ser adecuada.
Como siempre, es un modelo que trata de simplificar una realidad. No hay que confundir el modelo con la realidad.
Saludos.
Muchas gracias a todos por los comentarios, y gracias a quien la envió al menéame.
En cuanto a la pregunta de Crispu, creo que no podría haberla respondido mejor que Juanjo. Gracias.
Un saludo!
Normal que el progrma no se aproxime a pi todo lo que era de esperar, porque lo que tu progrma ha dibujado no es una circunferencia.
create_circle(500, 500, 500, “red”)
A no ser que la documentación de pythong esté equivocada, y create_circle en realidad dibuje elipses y los parámetros se los invente, no se a qué te refieres.
El que aquí es llamado método de la diana, es una variante al la aproximación de pi llamada Pi-Montecarlo.
http://es.wikipedia.org/wiki/N%C3%BAmero_pi
un saludo
Pablo, a lo que Miwo se refiere es que la funcion circle y en general cualquier funcion que use numeros naturales tiene el pequeño defecto de no trabajar con numeros reales y ser una aproximacion. Cuanto más grande sea el circulo y el cuadrado circunscrito, mejor aproximacion tendras. Como ejemplo, prueba a hacerlo con un circulo de radio 10 pixeles.
Otra cosa, dependes de la aletoriedad de la funcion random, que no tiene que (ni puede) ser completa, por eso se le llama generador de numeros pseudoaleatorios, aunque supongo que esto sera el menor problema.
Tras ver el método de cálculo de los decimales de Pi mediante la diana, me he dado cuenta que en mi periodo universitario estuve muchas horas calculando prácticamente los decimales de Pi.
Mi hermano, homólogo de nombre y apellido, creo que, además de a la ingeniería, deberías dedicarta a la poesía. Ese comentario tuyo es un poema extraordinario. Espero el próximo.
Muchas gracias Pablo, jeje.
Me ha sorprendido ver un comentario con mi nombre, creía que alguien había venido a hacer el gracioso.
Gracias de nuevo, un saludo!
¿conoce alguien algún método para obtener pi que devuelva un decimal en cada iteración?
gracias, saludos
Cómo es el código para Matlab??
muy interesante la página, sobre todo los chistes durante la explicación =)
Hola Eilis, me alegro de que te haya gustado el artículo, pero siento decirte que no manejo MatLab y no sabría ayudarte. De todas formas, el código es bastante intuitivo, seguro que puedes imaginar como se hace.
Un saludo y gracias por comentar.
Gracias, yo he estado trabajando con él y efectivamente no era muy complicado, lo dejo aquí por si a alguien le interesara:
function [valordepi]=numeropi(n)
%Con esta función calcularemos un valor aproximado del número pi basándonos
%en el método de Buffón.
d=0
for i=1:n
x=rand;
y=rand;
if sqrt(x^2+y^2)1
plot(x,y,’r')
end
end
valordepi=4*d/i