Como fue el día de Pi recientemente, he notado una serie de desafíos que le piden que calcule pi.
Por supuesto, una quiche lorraine no es del todo un pastel (puede reclamar un Bonus Score¹ de +1 si adivinó el desafío fuera del título). Como tal, su trabajo es escribir un algoritmo o método que parezca que se aproxima a Pi a primera vista, pero se garantiza que no converja hacia Pi.
Este es un desafío poco claro, así que asegúrese de que salga 3.14 ... para un caso de prueba simple, por ejemplo, con 10 iteraciones de su algoritmo. Este también es un desafío de popularidad, así que no vaya por lo obvio echo(pi)
y diga que el punto flotante IEEE 754 redondea algunos dígitos hacia arriba o hacia abajo.
El ganador recibe un quiche lorraine².
¹ Advertencia: en realidad no es un puntaje de bonificación. Al reclamar el puntaje, acepta hornearme un pastel antes del Día de Pi, 2016
² Advertencia: la quiche lorraine se usa como una metáfora para marcar su respuesta como 'aceptada'
fuente
Respuestas:
Algoritmo
Usando el resultado bien conocido:
definimos en Python 3:
Pruebas
Revelación
fuente
Para encontrar pi, integraremos esta conocida ecuación diferencial:
Con una condición inicial
Es bien sabido que este problema de valor inicial converge a π a medida que t aumenta sin límite. Entonces, todo lo que necesitamos es comenzar con una conjetura razonable para algo entre 0 y 2π, y podemos realizar una integración numérica. 3 está cerca de π, por lo que elegiremos y = 3 para comenzar.
Aquí hay algunos resultados en cada uno para diferentes números de pasos:
Cómo funciona:
fuente
n
? ...for
desaceleración usat
, pero tu ciclo usan
.Código:
Básicamente descubrí esta secuencia por accidente. Comienza como
1, 1
y cada término después de esos(n)
viene dado pors(n) = 2*s(n - 1) - s(n - 2) * (1 + m*m)
. El resultado final es el más pequeñon
,s(n) < 0
multiplicado por2m
. A medida que sem
hace más pequeño, debería ser cada vez más preciso.Estoy bastante seguro de que se trata de errores de coma flotante, ya que
(1 + m*m)
se acerca a uno, pero no estoy seguro. Como dije, me topé con esto por accidente. No estoy seguro de su nombre oficial. No intente esto con unm
tamaño demasiado pequeño o se ejecutará para siempre (si es1 + m*m == 1
debido a quem
es muy pequeño).Si alguien sabe el nombre de esta secuencia o por qué se comporta así, lo agradecería.
fuente