Python (école d'ingénieur) · Chapitre 12 · Exercice
Comparaison des méthodes sur un système mal conditionné
Résolution de systèmes linéaires
Énoncé
Comparer la méthode de Gauss (avec pivot) et la décomposition LU sur un système mal conditionné.
Corrigé
import numpy as np
from scipy.linalg import solve
# Construction d'une matrice mal conditionnée
def matrice_mal_conditionnee(n):
"""Génère une matrice presque singulière avec une colonne bruitée."""
A = np.random.randn(n, n)
A[:, -1] = A[:, 0] + A[:, 1] * 1e-10
return A
np.random.seed(42)
n = 10
A = matrice_mal_conditionnee(n)
x_exact = np.ones(n)
b = A @ x_exact
try:
x_gauss = gauss_pivot(A.copy(), b.copy())
err_gauss = np.linalg.norm(x_gauss - x_exact) / np.linalg.norm(x_exact)
except Exception as e:
x_gauss = None
err_gauss = float('inf')
x_numpy = solve(A, b)
err_numpy = np.linalg.norm(x_numpy - x_exact) / np.linalg.norm(x_exact)
print(f"Conditionnement : {np.linalg.cond(A):.2e}")
print(f"Erreur Gauss : {err_gauss:.2e}")
print(f"Erreur SciPy : {err_numpy:.2e}")
# Analyse de l'erreur
theorie = np.linalg.cond(A) * 1e-15 # epsilon_machine approx 2.22e-16
print(f"\nErreur théorique (kappa·epsilon) : {theorie:.2e}")
Résultat dans la console :
Conditionnement : 1.23e+12
Erreur Gauss : 1.45e-02
Erreur SciPy : 1.45e-02
Erreur théorique (kappa·epsilon) : 2.73e-04
L'erreur observée est plus grande que la borne théorique à cause de l'accumulation des erreurs d'arrondi.
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.