Adloun

Python (école d'ingénieur) · Chapitre 12 · Exercice

Comparaison des performances

Résolution de systèmes linéaires

Énoncé

Comparer les temps d'exécution de différentes méthodes pour résoudre en fonction de .

Corrigé

import numpy as np
import time
import matplotlib.pyplot as plt
from scipy.linalg import solve

# Implémentation personnalisée de Gauss avec pivot
def gauss_elimination(A, b):
    A = A.astype(float).copy()
    b = b.astype(float).copy()
    n = A.shape[0]

    for j in range(n - 1):
        i_max = j
        for i in range(j + 1, n):
            if abs(A[i, j]) > abs(A[i_max, j]):
                i_max = i
        if i_max != j:
            A[[j, i_max]] = A[[i_max, j]]
            b[[j, i_max]] = b[[i_max, j]]

        for i in range(j + 1, n):
            factor = A[i, j] / A[j, j]
            A[i, j:] -= factor * A[j, j:]
            b[i] -= factor * b[j]

    x = np.zeros(n)
    for i in range(n - 1, -1, -1):
        x[i] = (b[i] - np.dot(A[i, i+1:], x[i+1:])) / A[i, i]
    return x

# Comparaison des performances
n_vals = [10, 20, 40, 60, 80, 100, 150, 200]
temps_gauss = []
temps_scipy = []

for n in n_vals:
    A = np.random.randn(n, n)
    x_exact = np.random.randn(n)
    b = A @ x_exact

    # Gauss personnalisé
    start = time.time()
    x_gauss = gauss_elimination(A, b)
    temps_gauss.append(time.time() - start)

    # SciPy (implémentation optimisée en LAPACK)
    start = time.time()
    x_scipy = solve(A, b)
    temps_scipy.append(time.time() - start)

# Tracé
plt.figure(figsize=(10, 6))
plt.loglog(n_vals, temps_gauss, 'bo-', linewidth=2, label='Gauss personnalisé')
plt.loglog(n_vals, temps_scipy, 'rs-', linewidth=2, label='SciPy (LAPACK)')
plt.loglog(n_vals, 1e-6 * np.array(n_vals)**3, 'k--', alpha=0.5, label='O(n^3) théorique')

plt.xlabel('Dimension n', fontsize=12)
plt.ylabel("Temps d'exécution (s)", fontsize=12)
plt.title("Performance des méthodes de résolution de systèmes linéaires", fontsize=14)
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

Illustration Temps d'exécution de la résolution de systèmes linéaires pour différentes dimensions .

Résultat dans la console :

Temps d'exécution (s) :
n      Gauss        SciPy        Rapport
---------------------------------------------
 10    2.4500e-05   1.5300e-05    1.60
 20    9.8300e-05   2.4200e-05    4.06
 40    5.1200e-04   5.9900e-05    8.55
 60    1.4500e-03   1.1200e-04   12.95
 80    3.1400e-03   1.8900e-04   16.61
100    6.2400e-03   2.9700e-04   21.01
150    2.1200e-02   7.4900e-04   28.30
200    5.1300e-02   1.4300e-03   35.87

SciPy (qui utilise LAPACK/BLAS) est beaucoup plus rapide que l'implémentation Python pure.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →