A série BBP (Bailey-Borwein-Plouffe) é uma fórmula para calcular
diretamente em base hexadecimal (base 16), apresentada na Equaçāo 11.15. Desenvolva um programa que utilize essa série para calcular uma aproximação de
, utilizando um número de iteraçōes fornecido pelo usuário. Em cada iteraçāo, calcule o erro relativo e, ao final, gere um gráfico que mostre a evoluçāo desse erro ao longo das iterações.
Passo 1
O enunciado pede um programa que use a série BBP para aproximar
em base hexadecimal, somando até um número de iterações
dado pelo usuário, e que em cada iteração calcule o erro relativo em relação ao valor real de
. Para isso, vamos precisar de:
- Um laço que percorra
de até . - A expressão do termo geral da série BBP.
- Armazenar a soma parcial para obter a aproximação
. - Calcular o erro relativo usando a constante
da biblioteca math
. - Registrar esses erros numa lista e usar
matplotlib
para gerar o gráfico da evolução do erro.
Passo 2
A série BBP é dada por
Em cada iteração
truncamos a soma em
termos, ou seja,
O cálculo de cada termo é direto: computamos
e multiplicamos pela combinação de frações.
Passo 3
No laço principal:
- Inicializamos
pi_a = 0.0
e uma listaerros = []
. - Para cada
de 0 a :
a. Calculamos o termo
.
b. Atualizamospi_a += t
.
c. Calculamos o erro relativo
usandomath.pi
, e adicionamos esse valor à listaerros
.
Passo 4
Após computar todas as iterações, usamos
matplotlib
para desenhar o gráfico de erros
em função do número de iterações. Ajustamos rótulos dos eixos e, para melhor visualização, podemos usar escala logarítmica no eixo vertical.Resposta
import math
import matplotlib.pyplot as plt
def \(bbp_pi\)(N):
"""Calcula aproximação de pi pela série BBP em N iterações e retorna lista de erros relativos."""
\[pi_a =0.0\]
erros = []
for n in range(N):
coef \(=16\)**(-n)
termo = coef * (
4.0/(8*n \(+1\))
- 2.0/(8*n \(+4\))
- 1.0/(8*n \(+5\))
- 1.0/(8*n \(+6\))
)
\(pi_a +=\) termo
erro = abs(\(pi_a\) - math.pi) / math.pi
erros.append(erro)
return erros
def main():
N = int(input("Número de iterações (N): "))
erros = \(bbp_pi\)(N)
# Gera o gráfico da evolução do erro
plt.figure(figsize=(8, 5))
plt.plot(range(1, N\(+1\)), erros, marker='o', linestyle='-', markersize\(=4\))
plt.yscale('log')
plt.xlabel("Iteração")
plt.ylabel("Erro relativo")
plt.title("Evolução do erro relativo na série BBP para π")
plt.grid(True, which="both", ls="--")
plt.show()
if __name__ \(==\) "__main__":
main()