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)
# Vérification si la matrice est bien triangulaire inférieure
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
.
lu
de 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.
Coder la fonction qui renvoie la décomposition $PA = LU$ d'une matrice $A$. Attention, bien faire attention à prendre le coefficient avec la plus grande valeur absolue à chaque étape. On pourra s'aider des fonctions np.abs
et np.argmax
. Comparer avec le résultat obtenu avec la fonction lu
.