import numpy as np
import math as mt
def bisection(func, a, b, tolerance=1e-7, max_iterations=100):
"""
Encuentra una raíz de la función 'func' en el intervalo [a, b] usando el método de bisección.
Parametros:
tolerance (float, opcional): La tolerancia para la raíz encontrada. Defaults to 1e-7.
max_iterations (int, opcional): El número máximo de iteraciones. Defaults to 100.
Retorna:
Una aproximación de la raíz si se encuentra dentro de la tolerancia
y el número máximo de iteraciones, de lo contrario devuelve None.
"""
if np.sign(func(a)) == np.sign(func(b)):
raise ValueError("La función debe tener signos opuestos en los extremos del intervalo.")
itr = 0
for i in range(max_iterations):
c = (a + b) / 2
itr = i + 1
if np.abs(func(c)) < tolerance:
return c, itr
elif np.sign(func(c)) == np.sign(func(a)):
a = c
else:
b = c
print(f"Advertencia: Número máximo de iteraciones alcanzado sin la tolerancia deseada. Última aproximación: {c}")
return c, itr
# Ejemplo de uso: encontrar una raíz de la función f(x) = x^2 - 4
def f(x):
return x**3 - 2*x - 5
# Definimos el intervalo inicial donde sabemos que hay una raíz (por ejemplo, entre 1 y 3)
intervalo_a = 1
intervalo_b = 3
# Llamamos a la función bisection
raiz, itr = bisection(f, intervalo_a, intervalo_b)
if raiz is not None:
print(f"Se encontró una raíz aproximada en: {itr} iteraciones")
print(f"El valor de la función en la raíz es: {raiz:.6f}")