Aller au contenu

Synthèse

LINMA1170Synthèse

La synthèse est organisée par grands thèmes plutôt que par CM. La structure reste volontairement flexible : les chapitres pourront être ajoutés, fusionnés, déplacés ou retirés à mesure que le cours 2026–2027 se précise.

Le problème de départ est la résolution d’un système

Ax=b.Ax=b.

L’élimination de Gauss transforme progressivement AA en une matrice triangulaire supérieure UU en annulant les coefficients sous les pivots. Les opérations sur les lignes peuvent être représentées par des matrices élémentaires.

À l’étape kk, une transformation de Gauss s’écrit

Gk=I−wkekT,G_k=I-w_ke_k^T,

où wkw_k contient les multiplicateurs utilisés pour éliminer les coefficients sous le pivot.

L’idée importante n’est pas seulement de trianguler AA : les transformations successives expliquent directement la factorisation LU.

Si tous les pivots nécessaires sont non nuls,

Gn−1⋯G2G1A=U.G_{n-1}\cdots G_2G_1A=U.

En inversant les transformations,

A=F1F2⋯Fn−1U=LU,Fk=Gk−1.A=F_1F_2\cdots F_{n-1}U=LU, \qquad F_k=G_k^{-1}.

LL est triangulaire inférieure à diagonale unité et contient les multiplicateurs de l’élimination ; UU est triangulaire supérieure.

En pratique, la factorisation peut être stockée in-place : la partie strictement inférieure de la matrice contient les coefficients de LL, tandis que la diagonale et la partie supérieure contiennent UU. La diagonale unité de LL n’est pas stockée.

Une matrice inversible peut avoir un pivot nul pendant l’élimination. L’inversibilité de AA ne suffit donc pas à garantir que LU sans permutation fonctionne.

Le pivotage partiel choisit à l’étape kk

p=arg⁡max⁡i=k,…,n∣aik∣p=\arg\max_{i=k,\ldots,n}|a_{ik}|

puis échange les lignes kk et pp.

On obtient alors

PA=LU.PA=LU.

Le pivotage partiel garantit également que les multiplicateurs satisfont

∣ℓik∣≤1.|\ell_{ik}|\le 1.

Cette propriété limite la croissance provoquée par l’élimination et joue un rôle central dans sa stabilité numérique.

Méthode — construire LULU avec Gauss et pivotage partiel

Section intitulée « Méthode — construire LULULU avec Gauss et pivotage partiel »

À chaque colonne kk, on applique toujours la même procédure :

  1. Choisir le pivot dans la colonne kk :
p=arg⁡max⁡i=k,…,n∣aik∣.p=\arg\max_{i=k,\ldots,n}|a_{ik}|.

Si p≠kp\neq k, échanger les lignes kk et pp. Les échanges successifs sont enregistrés dans PP.

  1. Calculer un multiplicateur pour chaque ligne sous le pivot :
ℓik=aikakk,i>k.\ell_{ik}=\frac{a_{ik}}{a_{kk}},\qquad i>k.
  1. Éliminer le coefficient sous le pivot :
Ri←Ri−ℓikRk.R_i\leftarrow R_i-\ell_{ik}R_k.
  1. Ne pas jeter les multiplicateurs. Une fois la colonne kk éliminée, ranger chaque ℓik\ell_{ik} à la position (i,k)(i,k) de LL. On fait cela colonne après colonne. La diagonale de LL vaut 11 :
L=(10⋯0ℓ211⋮ℓ31ℓ32⋱0⋮⋮⋱1).L= \begin{pmatrix} 1&0&\cdots&0\\ \ell_{21}&1&&\vdots\\ \ell_{31}&\ell_{32}&\ddots&0\\ \vdots&\vdots&\ddots&1 \end{pmatrix}.

La matrice obtenue après les éliminations est UU.

Avec pivotage, le résultat est

PA=LU.PA=LU.

Le point essentiel est donc : LU = élimination de Gauss + conservation des multiplicateurs. En stockage in-place, on ne construit même pas deux matrices séparées : les ℓik\ell_{ik} remplacent les coefficients éliminés sous la diagonale, tandis que la diagonale et la partie supérieure contiennent UU.

Lors d’un échange de lignes à une étape ultérieure, les multiplicateurs déjà stockés dans les colonnes précédentes doivent suivre les lignes échangées.

Le code du cours traduit directement la méthode précédente : recherche du pivot, échange des lignes, calcul de ℓik\ell_{ik}, puis élimination.

#include <math.h>
int LU_DecompositionPartialPivoting(FullMatrix *A) {
if (A == NULL || A->m != A->n || A->n <= 0)
return -1;
const int n = A->n;
for (int k = 0; k < n - 1; ++k) {
int p = k;
double maxPivot = fabs(FM(A, k, k));
for (int i = k + 1; i < n; ++i) {
const double candidate = fabs(FM(A, i, k));
if (candidate > maxPivot) {
maxPivot = candidate;
p = i;
}
}
if (maxPivot == 0.0) return -1;
swapRows(A, k, p);
const double akk = FM(A, k, k);
for (int i = k + 1; i < n; ++i) {
FM(A, i, k) /= akk; // stocke l_ik
for (int j = k + 1; j < n; ++j)
FM(A, i, j) -= FM(A, i, k) * FM(A, k, j);
}
}
return FM(A, n - 1, n - 1) == 0.0 ? -1 : 0;
}

Une fois A=LUA=LU connue, résoudre

Ax=bAx=b

revient à effectuer deux résolutions triangulaires :

Ly=b,Ux=y.Ly=b, \qquad Ux=y.

La première utilise une substitution avant et la seconde une substitution arrière.

Avec pivotage, PA=LUPA=LU, donc le second membre doit lui aussi être permuté :

Ly=Pb,Ux=y.Ly=Pb,\qquad Ux=y.

Pour une matrice dense n×nn\times n, la factorisation LU demande

Nflop=n(n−1)(4n+1)6=23n3+O(n2).N_{\mathrm{flop}} =\frac{n(n-1)(4n+1)}{6} =\frac23n^3+O(n^2).

Chaque résolution triangulaire coûte O(n2)O(n^2). Ainsi, si plusieurs systèmes possèdent la même matrice AA mais des seconds membres différents, on factorise AA une seule fois puis on réutilise LL et UU.

2. Arithmétique flottante, conditionnement et stabilité

Section intitulée « 2. Arithmétique flottante, conditionnement et stabilité »

En IEEE 754 binary64 (double), un nombre normalisé possède 53 bits de précision significative. L’espacement immédiatement au-dessus de 1 vaut

ε=2−52≈2.22×10−16,\varepsilon=2^{-52}\approx2.22\times10^{-16},

tandis que l’unit roundoff pour l’arrondi au plus proche est

u=2−53≈1.11×10−16.u=2^{-53}\approx1.11\times10^{-16}.

Pour une opération élémentaire et en l’absence d’overflow ou d’underflow,

fl⁡(a∘b)=(a∘b)(1+δ),∣δ∣≤u.\operatorname{fl}(a\circ b)=(a\circ b)(1+\delta), \qquad |\delta|\le u.

Une élimination correcte en arithmétique exacte peut donc se comporter différemment en machine. En particulier, un pivot très petit peut produire un multiplicateur énorme et amplifier les effets des arrondis.

Pour Ax=bAx=b, en gardant bb fixe et en perturbant AA de ΔA\Delta A, l’analyse au premier ordre donne

Δx≈−A−1ΔA x.\Delta x\approx-A^{-1}\Delta A\,x.

D’où

∥Δx∥∥x∥≲κ(A)∥ΔA∥∥A∥,\frac{\|\Delta x\|}{\|x\|} \lesssim \kappa(A) \frac{\|\Delta A\|}{\|A\|},

avec

κ(A)=∥A∥ ∥A−1∥.\boxed{\kappa(A)=\|A\|\,\|A^{-1}\|}.

Attention :

AA−1=I,AA^{-1}=I,

mais le nombre de condition utilise le produit des normes

∥A∥ ∥A−1∥,\|A\|\,\|A^{-1}\|,

et non la norme du produit ∥AA−1∥\|AA^{-1}\|. En général,

∥AA−1∥≤∥A∥ ∥A−1∥,\|AA^{-1}\|\le \|A\|\,\|A^{-1}\|,

donc, pour les normes matricielles usuelles, κ(A)≥1\kappa(A)\ge 1.

Le conditionnement est une propriété du problème : un grand κ(A)\kappa(A) signifie qu’une petite perturbation des données peut provoquer une grande variation de la solution.

En arithmétique flottante, les facteurs calculés par LU vérifient

L^U^=PA+ΔA.\widehat L\widehat U=PA+\Delta A.

Le backward error mesure donc la perturbation ΔA\Delta A nécessaire pour interpréter le résultat calculé comme la solution exacte d’un problème voisin.

L’erreur forward mesure directement l’écart entre la solution calculée x^\widehat x et la solution exacte xx.

Schématiquement,

forward error≈conditionnement×backward error.\text{forward error} \approx \text{conditionnement} \times \text{backward error}.

Ainsi, un algorithme peut être numériquement stable tout en donnant une solution peu précise si le problème lui-même est mal conditionné.

Sans pivotage, un petit pivot peut créer des multiplicateurs très grands et conduire à une forte perte de précision.

Avec pivotage partiel, ∣ℓik∣≤1|\ell_{ik}|\le1. La croissance des coefficients de UU est mesurée par le growth factor

ρ=∥U^∥max⁡∥A∥max⁡.\rho=\frac{\|\widehat U\|_{\max}}{\|A\|_{\max}}.

Le backward error dépend notamment de ce facteur. Le cours donne la borne de Wilkinson

ρ≤2n−1,\rho\le2^{n-1},

qui peut être atteinte dans le pire cas. Cette borne est pessimiste mais montre que le pivotage partiel ne donne pas une garantie absolue contre toute croissance.