Implemente um programa em Python para encontrar uma raiz da equação
utilizando o método da secante. Considere como aproximações iniciais os valores
e
. O algoritmo deve ser executado até a convergência. A raiz está aproximadamente em
.
Passo 1
O problema pede que a gente ache uma raiz da função
usando o método da secante, com aproximações iniciais
e
, iterando até convergência. Esse conteúdo cai em métodos numéricos para solução de equações não lineares.
Passo 2
Primeiro, definimos a própria função em Python para poder avaliá-la facilmente:
def f(x):
return x**5 - 4*x**\(2+20\)
Passo 3
O método da secante gera uma sequência de aproximações
pela fórmula
A ideia é usar os dois últimos pontos para formar uma reta secante que aproxima a curva de
.
Passo 4
Agora implementamos o loop em Python. Vamos controlar a convergência por
, com
, e um número máximo de iterações para evitar loops infinitos:
def secante(f, x0, x1, tol\(=1\)e-6, \(max_iter =100\)):
for i in range(1, \(max_iter +1\)):
f\(0=\) f(x0)
f\(1=\) f(x1)
# evita divisão por zero
if f\(1==\) f0:
raise ZeroDivisionError("f(x1) e f(x0) são iguais, secante falhou.")
# fórmula da secante
x\(2=\) x1 - f1*(x1 - x0)/(f1 - f0)
# critério de convergência
if abs(x2 - x1) < tol:
return x2, i
# atualiza aproximações
x0, x\(1=\) x1, x2
raise RuntimeError("Não convergiu em {} iterações".format(\(max_iter\)))
# valores iniciais
x\(0=\) -1.0
x\(1=\) -0.5
# executa o método
raiz, iteracoes = secante(f, x0, x1)
print(f"Raiz aproximada: {raiz:.6f} após {iteracoes} iterações")
Resposta
def f(x):
return x**5 - 4*x**\(2+20\)
def secante(f, x0, x1, tol\(=1\)e-6, \(max_iter =100\)):
for i in range(1, \(max_iter +1\)):
f\(0=\) f(x0)
f\(1=\) f(x1)
if f\(1==\) f0:
raise ZeroDivisionError("f(x1) e f(x0) são iguais, secante falhou.")
x\(2=\) x1 - f1*(x1 - x0)/(f1 - f0)
if abs(x2 - x1) < tol:
return x2, i
x0, x\(1=\) x1, x2
raise RuntimeError("Não convergiu em {} iterações".format(\(max_iter\)))
x\(0=\) -1.0
x\(1=\) -0.5
raiz, iteracoes = secante(f, x0, x1)
print(f"Raiz aproximada: {raiz:.6f} após {iteracoes} iterações")