Uma forma de aproximar o valor de
(pi) é por meio da série de Leibniz:
Essa série converge lentamente, mas permite aproximar
usando apenas operações aritméticas simples.
a) Implemente uma função chamada aproxima_pi(tolerancia) que calcule o valor aproximado de
usando a série acima. A repetição deve continuar enquanto a diferença entre duas aproximações consecutivas for maior que a tolerância informada.
b) A função deve retornar o valor aproximado de
e o número de termos utilizados.
a) Implemente uma função chamada aproxima_pi(tolerancia) que calcule o valor aproximado de
b) A função deve retornar o valor aproximado de
Passo 1
O enunciado pede duas coisas claras:
- Implementar uma função chamada
aproxima_pi(tolerancia)que calcule uma aproximação deusando a série de Leibniz - A repetição (iteração) deve continuar enquanto a diferença entre duas aproximações consecutivas for maior que a tolerância informada. A função deve retornar a aproximação de
e o número de termos utilizados.
Entradas e saídas esperadas:
- Entrada: um número real
(deve ser positivo). - Saída: uma tupla com (aproximação de
, número de termos usados).
Passo 2
Vamos entender a série e o termo geral. A série de Leibniz é uma série alternada com termo geral
O
-ésimo somatório parcial (somando os primeiros
termos, com
termos) é
A aproximação de
usando esses
termos é
Passo 3
Qual é a diferença entre duas aproximações consecutivas
e
? Se
, então
Em módulo,
O enunciado pede para repetir enquanto a diferença entre aproximações consecutivas for maior que a tolerância, ou seja, parar quando
Usando a fórmula acima, essa condição equivale a testar
(mas implementaremos diretamente comparando
e
).
Passo 4
Propriedades úteis (para entender por que o critério é razoável):
- A série é alternada e seus termos têm módulo decrescente para
grande; pelo teste da série alternada, o resto (erro) após termos satisfaz Isso dá uma cota simples do erro verdadeiro em função de . - O critério pedido (diferença entre aproximações consecutivas
tolerância) é natural para séries alternadas e é fácil de implementar. Ele também tem relação direta com a cota acima, porque a diferença entre duas aproximações consecutivas é proporcional ao termo adicionado.
Passo 5
Plano passo a passo do algoritmo (como implementá-lo na prova/numa prova prática):
- Verificar se
. Se não for, sinalizar erro (não faz sentido tolerância não positiva). - Inicializar:
- soma parcial
(primeiro termo ), -
(número de termos usados até agora), -
, - sinal =
(para o próximo termo), - denominador =
(o próximo denominador ímpar).
- soma parcial
- Repetir:
- calcular
, - calcular
, - incrementar
, - verificar se
. Se sim, parar; caso contrário, atualizar , inverter o sinal ( ), e aumentar .
- calcular
- Ao parar, retornar
.
Observação: a comparação usa a diferença entre aproximações consecutivas exatamente como o enunciado pede.
Passo 6
Dicas práticas para a prova:
- Se quiser antecipar aproximadamente quantos termos serão necessários para uma dada
, use a fórmula aproximada da diferença: Por exemplo, para , isso dá da ordem de (ou seja, converge muito devagar). - Sempre trate
com cuidado: valores muito pequenos farão o laço demorar muito.
Passo 7
Agora, segue a implementação final em Python da função pedida. Ela segue exatamente o plano do passo anterior e retorna a aproximação de
e o número de termos usados.
Resposta
def aproxima_pi(tolerancia):
"""
Aproxima pi usando a série de Leibniz até que a diferença entre
duas aproximações consecutivas seja <= tolerancia.
Retorna uma tupla (pi_aproximado, n_termos).
"""
if tolerancia <= 0:
raise ValueError("tolerancia deve ser um número positivo")
S = 1.0 # soma parcial dos termos a_k = (-1)^k / (2k+1)
n = 1 # número de termos usados até agora
pi_prev = 4.0 * S
sinal = -1.0
denominador = 3.0
while True:
S += sinal / denominador
pi_cur = 4.0 * S
n += 1
if abs(pi_cur - pi_prev) <= tolerancia:
return pi_cur, n
pi_prev = pi_cur
sinal = -sinal
denominador += 2.0