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()
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
- 7 autres exercices corrigés dans ce chapitre, et 7 à chercher avec le tuteur
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.