Autor Tema: Día de pi

0 Usuarios y 1 Visitante están viendo este tema.

14 Marzo, 2025, 12:45 pm
Leído 3551 veces

mathysarah

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 4
  • País: ve
  • Karma: +0/-0
¡Felíz día de pi! Me gustaría abrir este foro para hacer esta dinámica: hay que aportar al foro un método para calcular pi, y no puedes repetir los que ya han sido aportados, el método debe venir con una explicación (no necesariamente detallada) de su deducción, además de ello puedes mencionar tu método favorito para calcular este maravilloso número.

Disfruten! :)

14 Marzo, 2025, 03:18 pm
Respuesta #1

DaniM

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 221
  • País: cz
  • Karma: +0/-0
Esto no es exactamente un cálculo puro, sino más bien un conteo usando números aleatorios. Se trata de imaginar que tenemos una diana y empezamos a lanzarle muchos dardos. A partir del número de aciertos podemos aproximarnos al valor de \( \pi \). La idea es que a partir de un cuadrado de lado \( 1 \) y una circumferencia inscrita en el mismo, dicha circumferencia tendrá un área igual a \( \frac{\pi}{4} \). El área del cuadrado unitario es la suma del área \( A_{int} \) del círculo y el área \( A_{ext} \) de la región exterior. De esta forma \( 1 = A_{ext} + A_{int} \Rightarrow{} A_{ext} = 1 - \frac{\pi}{4} \Rightarrow{} \pi = 4(1 - A_{ext}) \), por lo que sabiendo \( A_{ext} \) podemos saber \( \pi \).

En la siguiente figura \( A_{ext} \) se corresponde con la región pintada de color verde:



Para medir este área simulamos que vamos lanzando dardos. Como en teoría cada dardo tiene la misma probabilidad de caer en un punto u otro (supongamos que el lanzador ha salido de copas y se ha puesto fino), cuantos más dardos lancemos más probabilidad tendremos de acertar en el área verde, así que empezamos a tirar dardos como si no hubiera un mañana con el objetivo de rellenar cuantos más puntos podamos del cuadrado.

Aquí está el código de Python:

Código: [Seleccionar]
import random

def esta_p_fuera_del_circulo (p):
    esta_fuera = True

    if (p[0] ** 2) + (p[1] ** 2) < 0.25:
        esta_fuera = False

    return esta_fuera

def tirar_dardos_a_la_diana (num_tiros):
    dardos_fuera_de_diana = 0

    for _ in range (0, num_tiros):
        p_impacto = (random.random() - 0.5, random.random() - 0.5)
        if esta_p_fuera_del_circulo (p_impacto):
            dardos_fuera_de_diana += 1
   
    return dardos_fuera_de_diana

def calcular_pi (num_tiros):
    dardos_fuera_de_diana = tirar_dardos_a_la_diana (num_tiros)
    return 4 * (1 - (dardos_fuera_de_diana / num_tiros))

print (calcular_pi (10))
print (calcular_pi (50))
print (calcular_pi (500))
print (calcular_pi (2000))
print (calcular_pi (1000000))
print (calcular_pi (100000000))

Aquí los resultados para \( 10 \), \( 50 \), \( 500 \), \( 2000 \), un millón y cien millones de lanzamientos, respectivamente:

Código: [Seleccionar]
3.2
3.04
3.096
3.194
3.144528
3.14154024

Hay algoritmos mucho más eficientes, pero como este era muy intuitivo me ha parecido el más divertido.

14 Marzo, 2025, 11:49 pm
Respuesta #2

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola, DaniM , Correcto, tu calculo se acercará a Pi,  cuanto mas lanzamientos hagas y cuanto mas precisión tengas en los dos números aleatorios mejor.


El tema es que los números aleatorios son pseudo-aleatorios y una desviación de la densidad de esos números te dará un Pi levemente diferente, en el caso de lograr aleatorios equiprobables mas aproximado a Pi estarás, pero aun así los bordes de la circunferencia son números reales y no habrá nunca precisión suficiente en el computador para que logres calcular un Pi exacto( si ese fuese el objetivo), es decir esta no es una herramienta para calcular muchas cifras significativas de Pi, pues para lograr muy buena precisión deberías evaluar un numero tendiendo a infinito de lanzamientos con precisión tendiendo a infinita en cada número aleatorio creado. 




Un método basado en la física ...


Saludos  \(\mathbb {R}^3\)

15 Marzo, 2025, 08:19 am
Respuesta #3

Masacroso

  • “Lo que oigo, lo olvido; lo que veo, lo recuerdo; lo que hago, lo aprendo” (antiguo proverbio chino)
  • Moderador Global
  • Mensajes: 5,485
  • País: es
  • Karma: +0/-0
Mi método favorito es el de la aguja de Buffon, que es practicable en cualquier lado y bastante fiable. No requiere demasiadas idealizaciones, aunque es lento. El método de la aguja de Buffon consiste en tirar algo parecido a un segmento (una aguja, un palillo de los dientes, una cerilla, etc...) en una región plana marcada por líneas paralelas tal que la distancia entre las líneas sea al menos tan larga como la longitud del palito que tiremos.

Al ir tirando aleatoriamente el palito vamos contando el total de tiradas que hacemos y el número de tiradas en las que el palito cruza algunas de las líneas, y sacamos la proporción

\( \displaystyle{
\frac{\text{ tiradas cruzadas }}{\text{ tiradas totales }}
} \)

Debido a la ley de los grandes números tal proporción converge a \( \frac{2\ell }{t\pi } \), siendo \( \ell  \) la longitud del palito y \( t \) la distancia entre líneas. Aquí los detalles teóricos del método:

https://es.wikipedia.org/wiki/Aguja_de_Buffon