Algoritmos para el cálculo de Pi

En toda la historia se han descubierto/creado muchas maneras para calcular aproximaciones del número Pi. En el post del día de Pi ya vimos algunas aproximaciones numéricas. Hoy os traigo dos algoritmos para el cálculo de aproximaciones de Pi. Vamos con ellos:

  • Algoritmo de Gauss-Legendre:

    Partimos de los siguientes datos iniciales:

    Datos iniciales del algoritmo de Gauss-Legendre

    A partir de ellos realizamos la siguientes operaciones:

    Algoritmo de Gauss-Legendre

    Entonces Pi se aproxima de la siguiente forma:

    Aproximación de Pi por el algoritmo de Gauss-Legendre

    El método tiene convergencia de segundo orden. Es decir, en cada iteración duplicamos el número de dígitos exactos obtenidos en la iteración anterior.

  • Algoritmo de Borwein:

    Partimos de los siguientes datos iniciales:

    Datos iniciales del algoritmo de Borwein

    Con ellos operamos de la siguiente forma:

    Algoritmo de Borwein

    Entonces se tiene lo siguiente:

    Aproximación de Pi mediante el algoritmo de Borwein

    La convergencia de este método es cuártica. Es decir, en cada iteración se consiguen el cuádruple de dígitos exactos que en la iteración anterior. Existen variaciones de este método que consiguen en cada iteración muchos más dígitos exactos. En este enlace de la Wikipedia inglesa podéis ver algunas de ellas.

Evidentemente existen muchísimos más. Y también muchas fórmulas que involucran a Pi mediante las cuales podemos calcular aproximaciones de este número. Más adelante irán apareciendo en este blog muchas más. Se aceptan sugerencias en los comentarios.

Autor: ^DiAmOnD^

Miguel Ángel Morales Medina. Licenciado en Matemáticas y autor de Gaussianos y de El Aleph. Puedes seguirme en Twitter o indicar que te gusta mi página de Facebook.

45 Comentarios

  1. Particularmente me gusta la idea de la aproximación por el método de Montecarlo:

    Construimos un cuadrado de lado igual a 2 y inscribimos una circumferencia. Entonces la circumferencia tendra un radio igual a 1.
    La superfície de la circumferencia serà: pi*r^2 = pi.
    Y la superfície del cuadrado: l^2 = 4.
    Entonces, si empezásemos a lanzar dardos aleatoriamente dentro del cuadrado, la probabilidad de que este entrase en el círculo seria de pi/4. Solo deberiamos contar las veces que hemos lanzado dardos y cuantos de estos han entrado en el círculo, dividirlo y multiplicarlo por cuatro de forma que:
    pi = (dardos en círculo / dardos totales) * 4.
    No es un método muy exacto (se necesitarian muchísimos tiros para aproximarse a pi), pero es bonito y ingenioso.
    Hice un pequeño programa de simulación en Delphi. Si a alguien le interesa:
    http://gftpklient.sourceforge.net/l2p/?p=15
    El artículo está en catalán, pero el código fuente es el código fuente, jeje y abajo podéis encontrar el .pas y un .zip para descargarlo y ejectuarlo. Saludos!

    Publica una respuesta
  2. Mmmm… no me acaban de convencer estos métodos.

    Con el primero tendríamos, de entrada, saber el valor de raíz de 2, y luego calcular unas cuantas raices cuadradas en cada valor. No es que me cree un conflicto en mi interior el usar raíces cuadradas, es que tenemos que tener en cuenta que hay que cortar en algún lugar el cálculo de la raíz y eso afecta (y mucho) a lo precisos que queramos ser con Pi

    Con el segundo tenemos raíces de orden cuarto… Pues más de lo mismo.

    Con lo del método de lanzar dardos sobre una diana, hace ya algunos años hice la simulación y la verdad que saqué 6 decimales de pi con 100.000 tiradas, pero el problema fundamental es la serie aleatoria que uses.

    De los 15 generados de números pseudoaleatorios que usé, sólo con uno conseguí converger a pi con más de 3 decimales. Y en teoría eran buenos generadores sacados de papers (uno incluso ofrecía una recompensa de 10.000 $ a quien lograse demostrale una correlación en su generador). Estuve tentado (MUY tentado) de mandarle la simulación, pero dejé correr un tupido velo de silencio.

    Con el único con el que conseguí la convergencia de 6 decimales fué con el Lineal Congruencial que usa el Mathemática, pero era especialmente costoso, porque trabaja con un módulo de (2^31)^48 – (2^31)^8 + 1, lo cual es una auténtica burrada computacionalmente hablando.

    Y aún así con este generador pasan 2 cositas:

    i) No es perfecto (A. M. Ferrenberg, D.P. Landau, and Y.J. Wong. Monte carlo simulations: hidden errors from “good” random number generators. Phys. Rev. Lett., 69:3382-3384, 1992.)

    ii) Todo generador de números pseudoaleatorios tiene un periodo con el que acaba volviendo a repetir la serie. Así que tenemos un límite al número de decimales que podríamos conseguir. Podríamos decir que: Mayor número de decimales = Mayor número de tiradas, pero las tiradas están limitadas por el periodo de la serie pseudoaleatoria

    La única forma de conseguir sacar Pi con muchísimos decimales y sin error es conectar un contador geiger a un ordenador y ponerlo a medir la radiación de una muestra de algún material radioactivo.

    El problema de eso es sería muchiiiiiisimo más lento que cualquier generador de números pseudoaleatorios porque la CPU tendría que estar esperando a que el contador diese medida, y la CPU es mucho más rápida (de orden del millón de veces más) de lo que el contador devuelve datos.

    La solución, capturar los datos de contador, ponerlos en un fichero y usar esos datos ya tomados de antemano.

    Publica una respuesta
  3. ¿¿Cómo se demuestra matemáticamente que esos algoritmos conducen efectivamente a PI al iterar una infinidad de veces??

    Publica una respuesta
  4. Más información sobre cómo calcular PI por el “método de Buffon” aquí.

    Ondia, eso lo he escrito yo!! qué autobombo más indiscreto xD

    Publica una respuesta
  5. Un dia descubrí uno muy curioso, ineficiente como él sólo, pero curioso como ninguno. Es usando el Conjunto de Mandelbrot.

    Se trata de que en la unión del cardiode con la circunferencia de la izquierda, realmente no existe. La gracias es que mientras más te acercas al punto exacto de la unión (-3/4) en el eje y, más iteraciones se necesitan para demostrar que está fuera del Conjunto de Mandelbrot. Si coges un número muy cercano del estilo -3/4 + εi, donde ε es un número muy pequeño, 0.00000001, p.e. Calculas el número de iteraciones en ese punto necesarias para determinar que el punto no pertenece al conjunto, y lo multiplicas por ε, te da pi, mientras más pequeño sea ε, más te aproximarás a pi.

    Como he dicho el método es ineficiente de narices, pero es curioso, usando únicamente multiplicaciones y sumas. Le calculo una complejidad aproximada de 10 elevado al número de decimales que quieras.

    Publica una respuesta
  6. En el último número de la Gaceta de la RSME (vol 10 núm 1) hay un artículo muy interesante que describe muchos algoritmos y fórmulas para calcular pi.

    Publica una respuesta
  7. Hace tiempo lo comenté, y me parece curiosísimo (y cuya aplicación en la vida real es nula claro):

    Utilizando la función iteración que genera el conjunto de mandelbrot:

    z0 = 0
    z = z^2 + c
    c = -3/4 + a i

    Para a = 0 el punto pertenece al conjunto; sin embargo si n es el número de iteraciones que tardamos en conseguir un z cuyo módulo sea mayor que 2 (radio de escape):

    n * a = pi

    Y la precisión es la misma que la de a

    Es matemáticamente irrelevante quizá, costoso de calcular, pero curioso sin duda 🙂

    – ferdy

    Publica una respuesta
  8. Os recomiendo el programa gratuito que circula por ahí PiFast para calcular mega archivos con cifras de pi hasta millones y millones en poco rato.

    Publica una respuesta
  9. Es interesante la pregunta de wallace.
    Las convergencia de las iteraciones tiene su propia demostración en cada caso. Habitualmente, se basa en que el punto límite de la sucesión cumple un papel determinado que sólo puede cumplir el número pi.
    Ahora mismo no recuerdo ninguna en concreto, pero síme viene a la cabeza una demostración de convergencia que se limitaba a comprobar que la tangente (en radianes) de la cuarta parte del límite era 1. Para obtener la tangente empleaba una transformada que simplificaba las fórmulas extraordinariamente.

    Publica una respuesta
  10. Acabo de rehacer un método basado en el que ya pensó Arquímedes: el polígono inscrito.

    Sabiendo que media circunferencia es pi/2, partimos del lado AB de un cuadrado inscrito: A:(1,0) B:(x=0,y=1), de longitud raiz(2) y aproximamos pi=2*raiz(2). Doblamos los lados del polígono calculando el corte de la recta que pasa por (0,0) y el punto medio del anterior: (Xm=(1+0)/2,Ym=(0+1)/2). El número de lados es 2^i, así que aproximamos pi=2^i*L.

    En ecuaciones (ojo con i+1 que es el siguiente término):

    i=iteración

    Li=raiz(Xi^2+Yi^2)
    ~pi=2^i*Li
    Xmi=(1+Xi)/2
    Ymi=Yi/2
    — para el siguiente término:
    Xi+1=raiz(1/(1+Ymi/Xmi))
    Yi+1=(Ymi/Xmi)*Xi+1
    Li+1=raiz(Xi+1^2+Yi+1^2)
    ~pi=2^i+1*Li+1

    Estos resultados me da, con OpenOffice Calc:

    i=1
    X1=0
    Y1=1
    ~pi=2,8284271247461900

    i=12
    X12=0,9999997058628820
    Y12=0,0007669903187427
    ~pi=3,1415925765848700

    i=24
    X24=0,9999999999999820
    Y24=0,0000001872535141
    ~pi=3,14159265358979

    y ahí se acaba la precisión del OpenOffice, en 14 decimales.

    Según mis cuentas empieza sacando 0,5 decimales de pi por cada iteración y va aumentado hasta casi 0,6 decimales, pero la convergenica tiene la pinta (graficándola) de tener un límite o, al menos, de aumentar muy despacio.

    Harina de otro costal es lidiar con la inexactitud arrastrada entre iteraciones al calcular raices, como bien dice Unodetantos. No obstante, parece que no “desbarra” y tiene como límite los propios decimales de exactitud con que se realice el cálculo. Pero esto habría que demostrarlo.

    Bueno, no está mal para haberlo hecho en un ratico: un método con convergencia de orden “casi 6/10”.

    Publica una respuesta
  11. estoy de acuerdo con witilongi, ya que he usado ese programa y he calculado 1.000.000 de digitos del numero pi. se podrian calcular mas pero el tiempo seria mucho mayor. se los recomiendo ese programa. ademas se puede calcular la raiz de 2 y el numero e.

    leandro.

    Publica una respuesta
  12. 1. Toma una calculadora
    2. Presiona los tres primeros dígitos de tu numero telefónico
    3. Multiplícalo por 80.
    4. Súmale 1.
    5. Multiplícalo por 250.
    6. Súmale los últimos cuatro dígitos de tu numero telefónico.
    7. Otra vez, súmale los últimos cuatro dígitos de tu numero telefónico.
    8. Réstale 250.
    9. Divídelo por 2
    Reconoces el numero?????? ????????

    Publica una respuesta
  13. ¿Qué tan eficiente y exacto sería usar lo del problema de Basilea para calcular Pi?

    (Pi^2)/6 = 1/(1^2) + 1/(2^2) + 1/(3^2)+…+ 1/(n^2)

    ó
    Pi = Sqrt(6[1/(1^2) + 1/(2^2) + 1/(3^2)+…+ 1/(n^2)])

    Publica una respuesta
  14. daniel, no se de exactitud, yo creo que se dice que un método es mejor que otro en función de la velocidad de convergencia.

    Publica una respuesta
  15. y que tal buscar la solución a la ecuación
    sen(x) = 0 en [3,4]
    que se puede resolver por muchos métodos iterativos (bisección*, newton-raphson…)

    o se puede buscar el punto fijo de la función f:
    f(x) = sen(x) – x
    se empieza, en 3, por ejemplo y seguimos por f(3), f(f(3)), f(f(f(3)))…

    *bisección basicamente consiste en dividir [3,4] en dos subintervalos y quedarnos con aquel que cumpla bolzano (sen(a)*sen(b)

    Publica una respuesta
  16. Daniel, he calculado lo del probelma de Basilea y me sale bastante ineficiente: al inicio consigue unas 0,2 cifras por iteración, pero al cabo de 200 baja hasta 0,002. Necesita 600 iteraciones para llegar a la aproximación 3,14 y por entonces sólo avanza 0,01 cifras por iteración. Avanza MUY lentamente, pero lo que más gracia me hace es que ¡¡¡ sabemos que, igual que el resto de métodos, en el infinito también sale PI !!!

    Publica una respuesta
  17. Tal vez la serie que propone Daniel sea muy lenta, pero ¡qué decir de la serie de Ramanujan! que se aproxima al valor de pi a velocidad de vértigo. Cada nuevo sumando proporciona 8 decimales exactos de pi. La fórmula se puede ver en
    http://www.epsilones.com/paginas/i-formulas.html#formulas-piramanujan
    Poco más arriba de este enlace aparece otra fórmula que proporciona 14 decimales…

    Contestando al interrogante planteado en epsilones, Ramanujan ideó la fórmula investigando las funciones modulares(alguien de aquí lo entenderá…) Pueden ver la fórmula de otra manera
    http://suanzes.iespana.es/ramanuj.htm

    Y para los avanzados e interesados en más fórmulas de Ramanujan para el cálculo de pi
    http://personal.auna.com/jguillera/ramaslides.pdf

    Un gran genio y personaje. Y algo más de la vida de Ramanujan como no en http://criptociencia.blogspot.com/2007/05/calculo-mental.html 😉

    Publica una respuesta
  18. Al estilo de Ramanujan

    (150 + 1/200)^2
    ——————- = casi un entero (231)
    pi ^4

    Publica una respuesta
  19. Daniel, yo tuve la misma idea que vos….

    de hecho, hice un programita en VB que itera basado en el problema de basilea y desp de 2.000.000 de iteraciones el resultado es este:

    3. 14 15 92 17 61 25 09

    Son 6 decimales para 2.000.000 de iteraciones
    El problema, creo yo, es que la raiz cuadrada hace que pierda mucha potencia,

    El metodo no es bueno para aproximar pi

    Publica una respuesta
  20. Este mensaje va dirigido al que puso el comentario sobre una formula para el numero pi
    con el nombre de rober con fecha 12 junio 2007
    he intentado hacer funcionar tu formula en un programa de ordenador y no he obtenido el resultado esperado supongo que es debido a que la interpretacion de tu escrito no es la misma que la que tu posees.Quisiera que me dieses una explicacion mas detallada y clara sobre tu formula puedes hacerlo a traves de estos comentarios o mandarme un mensaje a la direccion de E-mail MSN messenger. oteropera@hotmail.com.Estoy interesado en cualquier formula o demostracion de formula para el numero pi por lo tanto si me envias una respuesta te estare muy agradecido.Y por ultimo quisiera hacer un comentario sobre tu formula si la variable Xi parecen ser el coseno de un angulo y la variable Yi el seno de un angulo segun mi interpretacion de tu formula la variable Li parece ser unicamente el radio de la circunferencia.Esperando una pronta respuesta.Cordiales saludos candido otero

    Publica una respuesta
  21. Talvez si los programadores utilizarían las ya clasicas fórmulas de Leibniz y Euler, les podría parecer más útil, en todo caso, yo no se mucho sobre programación pero en algoritmos matemáticos que justifiquen el valor de pi, talvez pueda dar algunas sugerencias

    Publica una respuesta
  22. hola, me gustaría saber como puedo conseguir dibujar pi en la recta real de forma exacta. Gracias.

    Publica una respuesta
  23. disculpa quisiera saber como ordena la siguientes funciones de un programa en java q es oriendato a objetos, acerca de estadistica para calcular la media,moda,desviacion estandar ,media armonica,el rango,varianza ,para datos agrupados claro. porfa aclara mis dudas.

    Publica una respuesta
  24. Hola soy alumno de bioquimica, pero aun asi amante de la matematica, y desarrollé un método bastante “bruto” para calcular pi a gusto.
    Es bastante simple, el unico problema es que incluye la función seno, bueno soy un amateur, por lo tanto les dejo el desafio de seguir mejorándola..
    Bueno acá va con explicación:
    Si tienes una circunferencia de radio 1, le dibujas 4 radios que esten a 90º uno del otro y luego trazas diagonales entre el extremo de cada radio, por supuesto obtendremos 4 diagonales con valor squr (2), llamemos a esto una secuencia P, en su primer valor o sea P(1), esta nos lanzará el valor 4 squr (2). Si analizamos esta figura con mucha atención, podremos ver 4 triángulos rectángulos, su hipotenusa será 2, su cateto opuesto squr (2). y su cateto adyacente también. El asunto es que si somos aún mas observadores notaremos que este perimétro está dado por 4 sen 45º, o sea P(1) = 4 sen 45º. Sigamos la secuencia y a cada diagonal le buscamos un punto medio, y de este trazamos dos líneas que irán a los extremos de cada diagonal, así obteniendo 8 trazos. Ahora se ve más complicado pero no lo es. Solo hacemos el análisis anterior y notaremos que hay el doble de triángulos, y el ángulo q usamos anteriormente de redujo a la mitad. o sea si aplicamos el mismo concepto, P(2) = 8 sen 22,5º. Entonces si generalizamos obtendremos la siguiente fórmula…

    Lim (2^(n + 1)) * sen (45º / 2^(n-1)) = pi
    n->inf

    El problema es que el seno nos complica la tarea… pero igualmente es efectiva en máquinas y calculadoras, y nos dará el valor de pi con la exactitud que queremos. Bueno espero que les sirva …

    Publica una respuesta
  25. José: no se puede. Fíjate los artículos sobre regla y compás.

    Publica una respuesta
  26. Para una libreria que estoy programando necesitaba calcular pi, y decidí usar la fórmula de Euler, pero pude comprobar lo lento que convergía.

    Buscando por internet, encontré un interesante programa de ejemplo en Java que calculaba pi con precisión configurable.

    Utiliza la fórmula:

    pi/4 = 4 * arctan( 1/5 ) – arctan( 1/239 )

    y para calcular el arcotangente, utiliza la serie:

    arctan(x) = x – (x^3)/3 + (x^5)/5 – (x^7)/7 + (x^9)/9 …

    que, al ser el argumento pequeño, converge bastante rápidamente.

    Para lo que yo lo necesito, me viene perfecto.
    (en mi PC calcula 10.000 decimales en menos de 2 segundos).

    Seguramente no es el método más rápido para calcular pi, pero es sencillo y aceptablemente rápido.

    el programa, lo podéis encontrar en:
    http://blog.taragana.com/index.php/archive/calculate-pi-to-arbitrary-precision-sample-java-code/

    Publica una respuesta
  27. hola que tal yo quiero saber como puedo desarrollar este algoritmo
    el algoritmo es una calculadora cientifica con las funciones de seno y coseno
    sera que me pueden decir algunas paginas en las que pueda encontrar algo
    muchisimas gracias

    Publica una respuesta
  28. Hola. He intentado calcular el valor de Pi (y generarlo con C++) utilizando una serie. La serie es mas o menos así:

    Pi = 4*(1 -1/3 +1/5 -1/7…) donde la serie va aumentando el denominador en un número impar y el signo va cambiando de término en término. Pero no se que ha pasado, no se si hice un infinito y nunca logré cerrar el bucle while propiamente. Suscede que para calcular un valor aproximado, utilizo un paso donde calculo el valor absoluto de la resta entre el ultimo término y el penúltimo y si es menor o igual a 10^-6 entoces debería parar.. pero nunca lo hace.

    Estan muy interesantes los metodos propuestos aqui.

    Publica una respuesta
  29. ola, daniel yo tengo el mismo problema y es para una tarea si lo solucionaste me mandarias el programa porfa
    gracias xau

    Publica una respuesta
  30. necesito hacer un programa en dev c++ para calcular el valor de pi de la siguiente serie xx= 4*(1/3 – 1/3+1/5-1/7…1/n)
    el programa debe indicar el numero de terminos rekeridos para obtener una presicion menor o igual a 0.0001( precision es la diferencia entre pi y el valor de la serie)

    SI PUDEN AYUDARME PORFAVOR ES URGENTE.GRACIAS

    Publica una respuesta
  31. Hola necesito hacer un programa en devc que haga todos los calculos y dibuje el triangulo de pascal.

    Es urgente please!!!

    Publica una respuesta
  32. Hay una sucesión muy sencilla, que ya debeis conocer supongo, que se obtiene apartir de los poligonos inscritos y aumentando el numero de lados (n) el cociente entre el perimetro y el diametro del poligono tiende a pi. Aunque no sea un algoritmo lo pongo por si a alguien le interesa.

    \lim_{n \to \infty} \sin \left ({360 \over 2n} \right)n = \pi

    Publica una respuesta
  33. hola me pueden ayudar por favor necesito buscar la respuesta a esto y no se nada sajkasjka

    gracias!!!

    Calcule el número pi, para ello use los tres métodos observados:
    bisección, secante y newton. Para lograr ello debe escoger alguna de las
    funciones trigonométricas clásicas: seno, coseno o tangente, y ver que
    puntos escoge para comenzar. Para lograr el objetivo, puede consultar sus
    apuntes de cálculo.
    En su informe debe presentar:
    – La función que usó.
    – Los puntos de partida.
    – Las precisiones empleadas.
    – La diferencias observadas en los métodos.
    todo en scilab

    Publica una respuesta
  34. Muchas gracias por la publicación. he empleado el primer algoritmo y me va perfecto:

    3.14159265358979

    14 decimales a la perfeccion.

    Publica una respuesta
  35. ps el primer metodo no conveence mucho ya que la raiz de 2 pues es un numero muy grande con muchos decimales y tendriamos que truncar o redondear ese numero y estariamos afectando el resultado de la aporoximacion de pi no lo creen?

    Publica una respuesta
  36. Realmente para el verdadero calculo como ya hemos de saber de antemano su limite es infinito por tanto el verdadero calculo se hace con una serie infinita;

    pi= 4(1- 1/3 +1/5 -1/7 ….) y asi sucesivamente lo que aumenta de dos en dos es el denominador, por lo tanto en el programa hacemos una sucesion.

    Publica una respuesta

Trackbacks/Pingbacks

  1. meneame.net - Algoritmos para el cálculo de π... En toda la historia se han descubierto/creado muchas maneras para calcular aproximaciones del…
  2. Criptociencia - [...] Algoritmos para el cálculo de Pi | Gaussianos La conjetura de Casas-Alvero, contada por Eduardo Casas-Alvero (1) … de…

Puedes utilizar código LaTeX para insertar fórmulas en los comentarios. Sólo tienes que escribir
[latex]código-latex-que-quieras-insertar[/latex]
o
$latex código-latex-que-quieras-insertar$.

Si tienes alguna duda sobre cómo escribir algún símbolo puede ayudarte la Wikipedia.

Y si los símbolos < y > te dan problemas al escribir en LaTeX te recomiendo que uses los códigos html & lt; y & gt; (sin los espacios) respectivamente.

Envía un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *