import numpy as np
from scipy.linalg import hilbert
import matplotlib.pyplot as plt
def tri_inf(matrice, vecteur):
n = len(vecteur)
x = np.zeros(n)
for i in range(n):
x[i] = (vecteur[i] - np.dot(matrice[i][:i], x[:i])) / matrice[i][i]
return x
def tri_sup(matrice, vecteur):
n = len(vecteur)
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = (vecteur[i] - np.dot(matrice[i][i+1:], x[i+1:])) / matrice[i][i]
return x
Soit
$$ A=\begin{pmatrix} \epsilon &1\\1&10 \end{pmatrix}. $$cond de linalg.
lude linalg. Que constatez-vous?
tri_inf et tri_sup. Comparer avec la vraie solution $x_{true} = \frac{1}{10\epsilon -1} \begin{pmatrix} 18 \\ 2\epsilon -2\end{pmatrix}$ pour $\epsilon = 10^{-2},10^{-3},10^{-4},10^{-5}$. On tracera les erreurs sur un même graphique.
# Fonctrion create_matrix
def create_matrix(n):
A = 2 * np.eye(n) - np.eye(n, k=1) - np.eye(n, k=-1)
return A
# 1. Implémentation de l'algorithme AP=LU
#2. Vérification
import numpy as np
from scipy.linalg import lu
# 3. Implémentation de la recherche de solution Ax=b à partir de la décomposition LU
# 4. Fonction Inverse
On souhaite comparer la précision de deux méthodes d'inversion matricielle :
inverse_lu, basée sur la décomposition LUnumpy.linalg.inv, l'inversion classique fournie par NumPyPour cela, on génère des matrices aléatoires à l’aide de la fonction create_matrix
pour différentes tailles :
n ∈ {5, 10, 20, 100}
Pour chaque matrice A, on calcule une approximation de son inverse notée Â⁻¹ à l’aide des deux méthodes, puis on calcule l’erreur relative définie par :
|| A Â⁻¹ - Iₙ || / || A ||
où || · || désigne la norme de Frobenius.
# 1. Calcul de l'erreur
# 2. Calcul du temps
import time