{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# El día Pi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Esta notebook fue creada originalmente como un blog post por [Raúl E. López Briega](http://relopezbriega.com.ar/) en [Mi blog sobre Python](http://relopezbriega.github.io). El contenido esta bajo la licencia BSD.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"día" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hoy, 14 de Marzo se celebra el *[día de Pi](http://es.wikipedia.org/wiki/D%C3%ADa_de_%CF%80)*($\\pi$), esta celebración fue una ocurrencia del físico Larry Shaw, quien eligió esta fecha por su semejanza con el valor de dos dígitos de Pi. (en el formato de fecha de Estados Unidos, el 14 de Marzo se escribe 3/14). Particularmente este año, se dará el fenómeno de que será el *[día de Pi](http://es.wikipedia.org/wiki/D%C3%ADa_de_%CF%80)* más preciso del siglo, ya que a las 9:26:53 se formaría el número *[Pi](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* con 9 dígitos de precisión! (3/14/15 9:26:53). En honor a su día, voy a dedicar este artículo al número *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ¿Qué es el número $\\pi$?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El número *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* es uno de los más famosos de la matemática. Mide la relación que existe entre la longitud de una [circunferencia](http://es.wikipedia.org/wiki/Circunferencia) y su [diámetro](http://es.wikipedia.org/wiki/Di%C3%A1metro). No importa cual sea el tamaño de la [circunferencia](http://es.wikipedia.org/wiki/Circunferencia), esta relación siempre va a ser la misma y va a estar representada por *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)*. Este tipo de propiedades, que se mantienen sin cambios cuando otros atributos varían son llamadas *constantes*. *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* es una de las *constantes* utilizadas con mayor frecuencia en matemática, física e ingeniería." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"día" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Historia del número $\\pi$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La primera referencia que se conoce de *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* data aproximadamente del año 1650 ac en el [Papiro de Ahmes](http://es.wikipedia.org/wiki/Papiro_de_Ahmes), documento que contiene problemas matemáticos básicos, fracciones, cálculo de áreas, volúmenes, progresiones, repartos proporcionales, reglas de tres, ecuaciones lineales y trigonometría básica. El valor que se asigna a *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* en ese documento es el de 28/34 aproximadamente 3,1605.\n", "\n", "Una de las primeras aproximaciones fue la realizada por [Arquímedes](http://es.wikipedia.org/wiki/Arqu%C3%ADmedes) en el año 250 adC quien calculo que el valor estaba comprendido entre 3 10/71 y 3 1/7 (3,1408 y 3,1452) y utilizo para sus estudios el valor 211875/67441 aproximadamente 3,14163.\n", "\n", "El matemático [Leonhard Euler](http://es.wikipedia.org/wiki/Leonhard_Euler) adoptó el conocido símbolo *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* en 1737 en su obra *Introducción al cálculo infinitesimal* e instantáneamente se convirtió en una notación estándar hasta hoy en día." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ¿Qué hace especial al número $\\pi$?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lo que convierte a *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* en un número interesante, es que se trata de un [número irracional](http://es.wikipedia.org/wiki/N%C3%BAmero_irracional), es decir, que el mismo no puede ser expresado como una [fraccion](http://es.wikipedia.org/wiki/Fracci%C3%B3n) de dos [números enteros](http://es.wikipedia.org/wiki/Enteros). Asimismo, también es un [número trascendental](http://es.wikipedia.org/wiki/N%C3%BAmero_trascendente), ya que no es raíz de ninguna [ecuación algebraica](http://es.wikipedia.org/wiki/Polinomio) con coeficientes enteros, lo que quiere decir que tampoco puede ser expresado algebraicamente." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Calculando el valor de $\\pi$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si bien el número *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* puede ser observado con facilidad, su cálculo es uno de los problemas más difíciles de la matemática y ha mantenido a los matemáticos ocupados por años. Actualmente se conocen hasta 10 billones de decimales del número *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)*, es decir, 10.000.000.000.000. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### La aproximación de Arquímedes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uno de los métodos más conocidos para la aproximación del número *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* es la aproximación de [Arquímedes](http://es.wikipedia.org/wiki/Arqu%C3%ADmedes); la cual consiste en circunscribir e inscribir polígonos regulares de n-lados en circunferencias y calcular el perímetro de dichos polígonos. [Arquímedes](http://es.wikipedia.org/wiki/Arqu%C3%ADmedes) empezó con hexágonos circunscritos e inscritos, y fue doblando el número de lados hasta llegar a polígonos de 96 lados." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"día" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### La serie de Leibniz" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Otro método bastante popular para el cálculo de *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)*, es la utilización de las series infinitas de [Gregory-Leibniz](http://es.wikipedia.org/wiki/Serie_de_Leibniz).\n", "Este método consiste en ir realizando operaciones matematicas sobre series infinitas de números hasta que la serie [converge](http://es.wikipedia.org/wiki/Serie_convergente) en el número *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)*. Aunque no es muy eficiente, se acerca cada vez más al valor de Pi en cada repetición, produciendo con precisión hasta cinco mil decimales de Pi con 500000 repeticiones. Su formula es muy simple." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\\pi=(4/1) - (4/3) + (4/5) - (4/7) + (4/9) - (4/11) + (4/13) - (4/15) ...$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculando $\\pi$ con Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como este blog lo tengo dedicado a [Python](http://python.org/), obviamente no podía concluir este artículo sin incluir distintas formas de calcular *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* utilizando [Python](http://python.org/); el cual bien es sabido que se adapta más que bien para las matemáticas!. \n", "\n", "Como *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* es una *constante* con un gran número de sus dígitos ya conocidos, los principales módulos Matemáticos de [Python](http://python.org/) ya incluyen su valor en una variable. Así por ejemplo, podemos ver el valor de *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)* importando los módulos math o sympy." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3.141592653589793" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Pi utilizando el módulo math\n", "import math\n", "math.pi" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.1415926535897932384626433832795\n" ] } ], "source": [ "# Pi utiizando sympy, dps nos permite variar el número de dígitos de Pi\n", "from sympy.mpmath import mp\n", "mp.dps = 33 # número de dígitos\n", "print(mp.pi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si queremos calcular alguna aproximación al valor de *[$\\pi$](http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80)*, podríamos implementar por ejemplo la aproximación de Arquímedes de la siguiente manera." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Implementacion de aproximación de Arquímedes\n", "from decimal import Decimal, getcontext\n", "\n", "def pi_archimedes(digitos):\n", " \"\"\"\n", " Calcula pi utilizando el método de aproximacion de Arquímedes\n", " en n iteraciones.\n", " \"\"\"\n", " def pi_archimedes_iter(n):\n", " \"\"\"funcion auxiliar utilizada en cada iteracion\"\"\"\n", " polygon_edge_length_squared = Decimal(2)\n", " polygon_sides = 2\n", " for i in range(n):\n", " polygon_edge_length_squared = 2 - 2 * (1 - polygon_edge_length_squared / 4).sqrt()\n", " polygon_sides *= 2\n", " return polygon_sides * polygon_edge_length_squared.sqrt()\n", " \n", " #itera dependiendo de la cantidad de digitos\n", " old_result = None\n", " for n in range(10*digitos):\n", " # Calcular con doble precision\n", " getcontext().prec = 2*digitos\n", " result = pi_archimedes_iter(n)\n", " # Devolver resultados en precision simple.\n", " getcontext().prec = digitos\n", " result = +result # redondeo del resultado.\n", " if result == old_result:\n", " return result\n", " old_result = result" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.14159265358979323846264338327950\n" ] } ], "source": [ "# Aproximacion de Arquímedes con 33 dígitos\n", "print(pi_archimedes(33))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por último, también podríamos implementar las series infinitas de [Gregory-Leibniz](http://es.wikipedia.org/wiki/Serie_de_Leibniz), lo cual es realmente bastante sencillo." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def pi_leibniz(precision):\n", " \"\"\"Calcula Pi utilizando las series infinitas de Gregory-Leibniz\"\"\"\n", " pi = 0\n", " modificador = 1\n", " for i in range(1, precision, 2):\n", " pi += ((4 / i) * modificador)\n", " modificador *= -1\n", " \n", " return pi" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.1415924535897797\n" ] } ], "source": [ "# Pi con una precision de 10000000 repeticiones.\n", "print(pi_leibniz(10000000))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como se puede observar, el método de las series infinitas de Leibniz, si bien es de fácil implementación, no es muy preciso además de ser sumamente ineficiente.\n", "\n", "Con esto concluyo y a festejar el día de $\\pi$!!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Saludos!\n", "\n", "*Este post fue escrito utilizando IPython notebook. Pueden descargar este [notebook](https://github.com/relopezbriega/relopezbriega.github.io/blob/master/downloads/PiDay.ipynb) o ver su version estática en [nbviewer](http://nbviewer.ipython.org/github/relopezbriega/relopezbriega.github.io/blob/master/downloads/PiDay.ipynb).*" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3+" } }, "nbformat": 4, "nbformat_minor": 0 }