A fórmula de Ramanujan para $\pi$

Prof. Doherty Andrade — www.metodosnumericos.com.br

Srinivāsa Aiyangār Rāmānujan (22 de dezembro de 1887 – 26 de abril de 1920), foi um matemático indiano.

Mesmo sem formação acadêmica ele fez grandes contribuições
em diversas áreas da matemática, teoria dos números, séries infinitas, frações contínuas,
entre outros, incluindo problemas considerados insolúveis.

Assista ao filme “O homem que viu o infinito” que conta sua história.

 

300px-Srinivasa_Ramanujan_-_OPC_-_1.jpg

A fórmula de Ramanujan para 𝜋 é uma série numérica maravilhosa para expressar 𝜋 e que converge muito rapidamente:
 
$$
\frac{1}{\pi} = \frac{2 \sqrt{2}}{99^2} \sum_{k = 0}^{\infty} \frac{(4k)!}{k!^4} \cdot \frac{1103 + 26390k}{396^{4k}}
$$
 

Para encontrar uma aproximação para $\pi$ usamos um número finito de termos da série, a seguir usando os três primeiros termos da série para obter uma boa aproximação para $\pi$:

$$
\pi \approx \frac{99^2}{2 \sqrt{2}} \frac{1}{\left( 1103 + 4! \frac{1103 + 26390}{396^{4}} + \frac{8!}{2^4} \frac{1103 + 26390(2)}{396^{8}} \right)}
$$

 

A soma parcial com apenas 3 termos já fornece uma boa aproximação para $\pi$. Veja o comando em Python:

In [1]:
99**2 / (2 * 2**0.5) / (1103 + 4*3*2 * (26390 + 1103) / 396**4+ 8*7*6*5*4*3*2 / 2**4 * (26390*2 + 1103) / 396**8)
Out[1]:
3.141592653589793
 

Podemos melhorar um pouco mais escrevendo um script para calcular somas parciais tomando um número $n$ qualquer de termos.
Para isso, vamos precisar de numpy.

In [2]:
import numpy as np
from numpy import sqrt
import math
In [3]:
n = 10
(99**2)/(2*sqrt(2))*(1/(sum([math.factorial(4*k)*(1103+26390*k)/(math.factorial(k)**4*396**(4*k)) for k in range(0,n+1)])))
Out[3]:
3.141592653589793
 

Vamos definir uma função que retorna a $n$-ésima soma parcial da série de Ramanujan. Para usar a função basta escrever ramanujan(n), onde $n$ é o número de termos a serem considerados na série.

Vamos fixar os resultados em 50 dígitos decimais.

In [4]:
from decimal import *
getcontext().prec = 50
In [5]:
def ramanujan(n):
    return (99**2)/(2*sqrt(2))*(1/(sum([math.factorial(4*k)*(1103+26390*k)/(math.factorial(k)**4*396**(4*k))
    for k in range(0,n+1)])))
In [6]:
Decimal(ramanujan(20))
Out[6]:
Decimal('3.141592653589793115997963468544185161590576171875')
In [ ]:
 

 

Tags :

Compartilhe:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *