import numpy as np
import matplotlib.pyplot as plt

def biseccion(f, a, b, tol=1e-3, max_iter=100):    
    puntos = []  # para guardar los puntos medios
    # Verificar si hay raíz en los extremos
    fa = f(a)
    fb = f(b)
    if abs(fa) < tol:
        print(f"La raíz está en el extremo izquierdo: x = {a}")
        return a, puntos
    if abs(fb) < tol:
        print(f"La raíz está en el extremo derecho: x = {b}")
        return b, puntos
    if f(a)*f(b) > 0:
        print("El intervalo no cumple el criterio de bisección")
        return None    
    for i in range(max_iter):        
        c = (a + b)/2
        fc = f(c)
        puntos.append(c)        
        print(f"Iteración {i+1}: c = {c}, f(c) = {fc}")        
        if abs(fc) < tol or (b-a)/2 < tol:
            return c, puntos        
        if f(a)*fc < 0:
            b = c
        else:
            a = c            
    return (a+b)/2, puntos

# Definimos la función np.arctan(x) x*np.sin(x) ## x**3 - x - 2 ## (x-1)**3*(x-2)*(x-3) 
def f(x):
    return np.sin(x) - x/2

# Intervalo inicial
a = 1
b = 2

# Ejecutar el método
raiz, puntos = biseccion(f, a, b)
print("\nRaíz aproximada:", raiz)

# Número mínimo de iteraciones
tol=1e-3
M = int(np.ceil(np.log((b-a)/tol)/np.log(2)))
print("Número mínimo de iteraciones necesarias:", M)

# GRAFICA
x = np.linspace(a, b, 400)
y = f(x)
plt.figure(figsize=(8,5))
plt.axhline(0)  # eje x
plt.plot(x, y)

# puntos del método
for c in puntos:
    plt.scatter(c, f(c), color='red',s=20)

plt.scatter(raiz, f(raiz), color='green', s=20, label="Raíz")
plt.title("Método de la Bisección",fontsize=18)
plt.xlabel("$x$", fontsize=16)
plt.ylabel("$f(x)$",fontsize=16)
# tamaño de los números de los ejes
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.legend()
plt.grid()
plt.show()

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: