import matplotlib.pyplot as plt
import numpy as np

def trapezoidal_method(f, a, b, n):
    h = (b - a) / n  # Largeur des sous-intervalles
    integral = 0.5 * (f(a) + f(b))  # Initialisation avec les valeurs aux bornes

    # Liste pour stocker les points x et y pour le tracé
    x_points = [a]
    y_points = [f(a)]

    # Somme des valeurs de la fonction aux points intérieurs
    for i in range(1, n):
        x_i = a + i * h
        y_i = f(x_i)
        integral += y_i
        x_points.append(x_i)
        y_points.append(y_i)

    x_points.append(b)
    y_points.append(f(b))

    integral *= h  # Multiplication par la largeur des sous-intervalles

    # Tracé des trapèzes
    plt.figure(figsize=(10, 6))
    x = np.linspace(a, b, 400)
    y = f(x)
    plt.plot(x, y, label=r'$f(x) = x^2$')

    # Liste des couleurs
    colors = ['red', 'green', 'blue', 'purple']

    for i in range(n):
        x_vals = [x_points[i], x_points[i], x_points[i+1], x_points[i+1]]
        y_vals = [0, y_points[i], y_points[i+1], 0]
        color = colors[i % len(colors)]  # Sélection de la couleur
        plt.fill(x_vals, y_vals, color, edgecolor=color, alpha=0.2)

    plt.scatter(x_points, y_points, color='black', zorder=5)
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.title('Méthode des Trapèzes')
    plt.legend()
    plt.grid(True)
    plt.show()

    return integral

# Exemple d'utilisation
if __name__ == "__main__":
    # Définition de la fonction à intégrer
    def f(x):
        return x**2

    # Paramètres de l'intégration
    a = 0
    b = 2
    n = 10

    # Calcul de l'intégrale
    result = trapezoidal_method(f, a, b, n)
    print(f"L'approximation de l'intégrale de f(x) sur [{a}, {b}] avec {n} sous-intervalles est : {result}")
