A série de Ramanujan para \frac{1}{\pi}, apresentada na Equação 11.19 , possui convergência extremamente rápida. Escreva um programa em Python que solicite ao usuário o número de termos a serem utilizados para calcular \pi, computando o erro absoluto em cada iteração e exibindo esses erros em um gráfico.
\frac{1}{\pi}=\frac{2 \sqrt{2}}{9801} \sum_{n=0}^{\infty} \frac{(4 n)!}{(n!)^{4}} \frac{1103+26390 n}{396^{4 n}}

Passo 1

O enunciado pede para escrever um programa em Python que aproxime \pi usando a série de Ramanujan
\frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum_{n=0}^{\infty} \frac{(4n)!}{(n!)^4}\,\frac{1103 + 26390\,n}{396^{4n}}
e, a cada iteração n, calcule o valor parcial de \pi, o erro absoluto em relação a \pi (usando math.pi) e, ao final, exiba um gráfico desses erros.

Passo 2

Para aproximar \pi com N termos, vamos manter uma soma acumulada
S = \sum_{k=0}^{N-1} a_k
onde
a_k = \frac{(4k)!}{(k!)^4}\,\frac{1103 + 26390\,k}{396^{4k}}
Depois a aproximação é
\pi_{\text{aprox}} = \frac{1}{\frac{2\sqrt{2}}{9801} \,S}.

Passo 3

No código Python, vamos usar math.factorial para os fatoriais, math.sqrt para \sqrt{2} e iterar de k = 0 até k = N-1. A cada passo calculamos term = (factorial(4*k)/(factorial(k)**4))*(1103+26390*k)/396**(4*k) e atualizamos S += term.

Passo 4

Depois de atualizar a soma S em cada iteração, calculamos
\(pi_aprox =1.0\) / ((2*math.sqrt(2)/9801) * S)
erro = abs(\(pi_aprox\) - math.pi)
e armazenamos erro numa lista. Quando terminar o laço, usamos matplotlib para traçar erro versus índice de iteração, marcando eixos e título para exibir a convergência.

Resposta

import math
import matplotlib.pyplot as plt

def \(aproximar_pi_ramanujan\)(N):
 coef \(=2\) * math.sqrt(2) / 9801
 S \(=0.0\)
 erros = []
 for k in range(N):
 num = math.factorial(4*k)
 den = (math.factorial(k) ** 4) * (396 ** (4*k))
 term = num * (\(1103+26390\)*k) / den
 S \(+=\) term
 \(pi_aprox =1.0\) / (coef * S)
 erro = abs(\(pi_aprox\) - math.pi)
 erros.append(erro)
 return erros

def main():
 N = int(input("Digite o número de termos N para aproximar π: "))
 erros = \(aproximar_pi_ramanujan\)(N)
 plt.figure(figsize=(8,5))
 plt.plot(range(1, N\(+1\)), erros, marker='o', linestyle='-')
 plt.xlabel("Número de termos")
 plt.ylabel("Erro absoluto")
 plt.title("Convergência da série de Ramanujan para π")
 plt.yscale('log') # escala log para visualizar melhor a queda do erro
 plt.grid(True, which="both", ls="--", lw\(=0.5\))
 plt.show()

if __name__ \(==\) "__main__":
 main()

Exercícios relacionados