Adloun

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

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 →