Annexe B — Exemples détaillés de pivotage

Cette annexe présente deux exemples complets de pivotage : le pivotage complet (lignes et colonnes) et le pivotage partiel (lignes seulement). Ces exemples illustrent l'importance du pivotage pour la stabilité numérique.


Exemple 1 : Pivotage complet

Le pivotage complet consiste à échanger à la fois des lignes et des colonnes pour placer le plus grand élément (en valeur absolue) de la sous-matrice restante en position de pivot.

Système initial

Considérons le système Ax=bAx = b avec :

A=(41−32043637),b=(312)A = \begin{pmatrix} 4 & 1 & -32 \\ 0 & 4 & 3 \\ 6 & 3 & 7 \end{pmatrix}, \quad b = \begin{pmatrix} 3 \\ 1 \\ 2 \end{pmatrix}

Matrice augmentée initiale :

(41−32304316372)\left( \begin{array}{ccc|c} 4 & 1 & -32 & 3 \\ 0 & 4 & 3 & 1 \\ 6 & 3 & 7 & 2 \end{array} \right)

Étape 1 : Recherche du pivot maximal

On cherche l'élément de plus grande valeur absolue dans toute la matrice :

ÉlémentValeur absolue
a13=−32a_{13} = -323232 ← maximum
a31=6a_{31} = 666
a11=4a_{11} = 444

Le maximum est ∣−32∣=32|{-32}| = 32 en position (1,3)(1, 3).

Pour amener cet élément en position (1,1)(1, 1), on effectue :

  • Échange de lignes : R1↔R1R_1 \leftrightarrow R_1 (pas nécessaire, déjà en ligne 1)
  • Échange de colonnes : C1↔C3C_1 \leftrightarrow C_3
⚠️

Attention : ordre des inconnues

L'échange de colonnes modifie l'ordre des inconnues. Il faut garder trace de cet ordre pour reconstruire la solution finale. Initialement : (x1,x2,x3)(x_1, x_2, x_3). Après C1↔C3C_1 \leftrightarrow C_3 : (x3,x2,x1)(x_3, x_2, x_1).

Après l'échange C1↔C3C_1 \leftrightarrow C_3 :

(−3214334017362)\left( \begin{array}{ccc|c} -32 & 1 & 4 & 3 \\ 3 & 4 & 0 & 1 \\ 7 & 3 & 6 & 2 \end{array} \right)

Ordre des inconnues : O=(x3,x2,x1)O = (x_3, x_2, x_1)

Étape 2 : Élimination sous le pivot

Maintenant on élimine les éléments sous le pivot −32-32 :

Multiplicateurs :

m21=a21a11=3−32=−332m_{21} = \frac{a_{21}}{a_{11}} = \frac{3}{-32} = -\frac{3}{32}
m31=a31a11=7−32=−732m_{31} = \frac{a_{31}}{a_{11}} = \frac{7}{-32} = -\frac{7}{32}

Opérations :

  • R2←R2−m21⋅R1=R2+332R1R_2 \leftarrow R_2 - m_{21} \cdot R_1 = R_2 + \frac{3}{32} R_1
  • R3←R3−m31⋅R1=R3+732R1R_3 \leftarrow R_3 - m_{31} \cdot R_1 = R_3 + \frac{7}{32} R_1

Après élimination (première colonne) :

(−3214304,0940,3751,28103,2196,8752,656)\left( \begin{array}{ccc|c} -32 & 1 & 4 & 3 \\ 0 & 4{,}094 & 0{,}375 & 1{,}281 \\ 0 & 3{,}219 & 6{,}875 & 2{,}656 \end{array} \right)

Étape 3 : Deuxième pivot

On cherche le maximum dans la sous-matrice 2×22 \times 2 restante (lignes 2-3, colonnes 2-3) :

ÉlémentValeur absolue
a33=6,875a_{33} = 6{,}8756,8756{,}875 ← maximum
a22=4,094a_{22} = 4{,}0944,0944{,}094

Pour amener 6,8756{,}875 en position (2,2)(2, 2) :

  • Échange de lignes : R2↔R3R_2 \leftrightarrow R_3
  • Échange de colonnes : C2↔C3C_2 \leftrightarrow C_3

Après les échanges :

(−3241306,8753,2192,65600,3754,0941,281)\left( \begin{array}{ccc|c} -32 & 4 & 1 & 3 \\ 0 & 6{,}875 & 3{,}219 & 2{,}656 \\ 0 & 0{,}375 & 4{,}094 & 1{,}281 \end{array} \right)

Ordre des inconnues : O=(x3,x1,x2)O = (x_3, x_1, x_2)

Étape 4 : Dernière élimination

Multiplicateur :

m32=0,3756,875≈0,0545m_{32} = \frac{0{,}375}{6{,}875} \approx 0{,}0545

Opération : R3←R3−m32⋅R2R_3 \leftarrow R_3 - m_{32} \cdot R_2

Matrice triangulaire finale :

(−3241306,8753,2192,656003,9181,136)\left( \begin{array}{ccc|c} -32 & 4 & 1 & 3 \\ 0 & 6{,}875 & 3{,}219 & 2{,}656 \\ 0 & 0 & 3{,}918 & 1{,}136 \end{array} \right)

Étape 5 : Substitution arrière

On résout le système triangulaire :

x2=1,1363,918≈0,290x_2 = \frac{1{,}136}{3{,}918} \approx 0{,}290
x1=2,656−3,219×0,2906,875≈0,250x_1 = \frac{2{,}656 - 3{,}219 \times 0{,}290}{6{,}875} \approx 0{,}250
x3=3−4×0,250−1×0,290−32≈−0,053x_3 = \frac{3 - 4 \times 0{,}250 - 1 \times 0{,}290}{-32} \approx -0{,}053

Rappel : L'ordre des inconnues est (x3,x1,x2)(x_3, x_1, x_2), donc :

  • La première composante calculée est x2x_2
  • La deuxième est x1x_1
  • La troisième est x3x_3

Solution finale (remise dans l'ordre original (x1,x2,x3)(x_1, x_2, x_3)) :

x=(x1x2x3)≈(0,2500,290−0,053)x = \begin{pmatrix} x_1 \\ x_2 \\ x_3 \end{pmatrix} \approx \begin{pmatrix} 0{,}250 \\ 0{,}290 \\ -0{,}053 \end{pmatrix}

Exemple 2 : Impact du pivotage sur la précision

Cet exemple montre comment le pivotage partiel améliore drastiquement la précision des calculs en arithmétique à précision finie.

Contexte

Considérons un système flottant avec base b=10b = 10 et s=4s = 4 chiffres significatifs. À chaque opération, le résultat est arrondi à 4 chiffres.

Système initial

A=(−0,0024,0004,000−2,0002,906−5,3873,000−4,031−3,112),b=(7,998−4,481−4,143)A = \begin{pmatrix} -0{,}002 & 4{,}000 & 4{,}000 \\ -2{,}000 & 2{,}906 & -5{,}387 \\ 3{,}000 & -4{,}031 & -3{,}112 \end{pmatrix}, \quad b = \begin{pmatrix} 7{,}998 \\ -4{,}481 \\ -4{,}143 \end{pmatrix}

La solution exacte est x∗=(1,1,1)Tx^* = (1, 1, 1)^T.

Méthode 1 : Sans pivotage

On utilise directement a11=−0,002a_{11} = -0{,}002 comme premier pivot.

Problème : Ce pivot est très petit ! Les multiplicateurs seront énormes :

m21=−2,000−0,002=1000m_{21} = \frac{-2{,}000}{-0{,}002} = 1000
m31=3,000−0,002=−1500m_{31} = \frac{3{,}000}{-0{,}002} = -1500

Élimination (avec arrondi à 4 chiffres) :

R2←R2−1000⋅R1R_2 \leftarrow R_2 - 1000 \cdot R_1 :

  • a22′=2,906−1000×4,000=2,906−4000=−3997a_{22}' = 2{,}906 - 1000 \times 4{,}000 = 2{,}906 - 4000 = -3997 → arrondi : −3,997×103-3{,}997 \times 10^3
  • a23′=−5,387−1000×4,000=−4005a_{23}' = -5{,}387 - 1000 \times 4{,}000 = -4005 → arrondi : −4,005×103-4{,}005 \times 10^3
  • b2′=−4,481−1000×7,998=−8002b_2' = -4{,}481 - 1000 \times 7{,}998 = -8002 → arrondi : −8,002×103-8{,}002 \times 10^3

Matrice triangulaire (après arrondi) :

(−0,0024,0004,0007,9980−3,997−4,005−8,00200−10,000,000)×103 (lignes 2-3)\left( \begin{array}{ccc|c} -0{,}002 & 4{,}000 & 4{,}000 & 7{,}998 \\ 0 & -3{,}997 & -4{,}005 & -8{,}002 \\ 0 & 0 & -10{,}00 & 0{,}000 \end{array} \right) \times 10^3 \text{ (lignes 2-3)}

Substitution arrière :

x3=0,000−10,00=0,000x_3 = \frac{0{,}000}{-10{,}00} = 0{,}000
x2=−8002−(−4005)×0−3997=−8002−3997≈2,002x_2 = \frac{-8002 - (-4005) \times 0}{-3997} = \frac{-8002}{-3997} \approx 2{,}002
x1=7,998−4×2,002−4×0−0,002=−0,010−0,002=5,000x_1 = \frac{7{,}998 - 4 \times 2{,}002 - 4 \times 0}{-0{,}002} = \frac{-0{,}010}{-0{,}002} = 5{,}000

Solution sans pivotage : x≈(5,000,2,002,0,000)Tx \approx (5{,}000, 2{,}002, 0{,}000)^T

🚨

Résultat catastrophique !

La solution obtenue (5,000,2,002,0,000)(5{,}000, 2{,}002, 0{,}000) est complètement fausse ! La solution exacte est (1,1,1)(1, 1, 1). L'erreur relative sur x1x_1 est de 400% !

Méthode 2 : Avec pivotage partiel

On cherche le plus grand élément (en valeur absolue) dans la première colonne :

LigneÉlémentValeur absolue
1−0,002-0{,}0020,0020{,}002
2−2,000-2{,}0002,0002{,}000
33,0003{,}0003,0003{,}000 ← maximum

Échange : R1↔R3R_1 \leftrightarrow R_3

Après échange :

(3,000−4,031−3,112−4,143−0,0024,0004,0007,998−2,0002,906−5,387−4,481)\left( \begin{array}{ccc|c} 3{,}000 & -4{,}031 & -3{,}112 & -4{,}143 \\ -0{,}002 & 4{,}000 & 4{,}000 & 7{,}998 \\ -2{,}000 & 2{,}906 & -5{,}387 & -4{,}481 \end{array} \right)

Multiplicateurs (maintenant raisonnables) :

m21=−0,0023,000≈−0,0007m_{21} = \frac{-0{,}002}{3{,}000} \approx -0{,}0007
m31=−2,0003,000≈−0,6667m_{31} = \frac{-2{,}000}{3{,}000} \approx -0{,}6667

Élimination (première colonne) :

Après élimination et arrondi à 4 chiffres :

(3,000−4,031−3,112−4,14303,9973,9987,99500,218−7,462−7,243)\left( \begin{array}{ccc|c} 3{,}000 & -4{,}031 & -3{,}112 & -4{,}143 \\ 0 & 3{,}997 & 3{,}998 & 7{,}995 \\ 0 & 0{,}218 & -7{,}462 & -7{,}243 \end{array} \right)

Deuxième pivot : On cherche le max dans la colonne 2 (lignes 2-3) :

  • Ligne 2 : ∣3,997∣=3,997|3{,}997| = 3{,}997 ← maximum
  • Ligne 3 : ∣0,218∣=0,218|0{,}218| = 0{,}218

Pas d'échange nécessaire.

Élimination (deuxième colonne) :

m32=0,2183,997≈0,0545m_{32} = \frac{0{,}218}{3{,}997} \approx 0{,}0545

Matrice triangulaire finale :

(3,000−4,031−3,112−4,14303,9973,9987,99500−7,681−7,681)\left( \begin{array}{ccc|c} 3{,}000 & -4{,}031 & -3{,}112 & -4{,}143 \\ 0 & 3{,}997 & 3{,}998 & 7{,}995 \\ 0 & 0 & -7{,}681 & -7{,}681 \end{array} \right)

Substitution arrière :

x3=−7,681−7,681=1,000x_3 = \frac{-7{,}681}{-7{,}681} = 1{,}000
x2=7,995−3,998×1,0003,997=3,9973,997=1,000x_2 = \frac{7{,}995 - 3{,}998 \times 1{,}000}{3{,}997} = \frac{3{,}997}{3{,}997} = 1{,}000
x1=−4,143−(−4,031)×1,000−(−3,112)×1,0003,000=3,0003,000=1,000x_1 = \frac{-4{,}143 - (-4{,}031) \times 1{,}000 - (-3{,}112) \times 1{,}000}{3{,}000} = \frac{3{,}000}{3{,}000} = 1{,}000

Solution avec pivotage : x=(1,000,1,000,1,000)Tx = (1{,}000, 1{,}000, 1{,}000)^T

✅

Résultat correct !

Avec le pivotage partiel, on obtient la solution exacte (1,1,1)(1, 1, 1) malgré l'arithmétique à 4 chiffres !


Comparaison des résultats

MéthodeSolution obtenueSolution exacteErreur relative max
Sans pivotage(5,000,2,002,0,000)(5{,}000, 2{,}002, 0{,}000)(1,1,1)(1, 1, 1)400%
Avec pivotage partiel(1,000,1,000,1,000)(1{,}000, 1{,}000, 1{,}000)(1,1,1)(1, 1, 1)0%

Pourquoi le pivotage fonctionne-t-il ?

Le problème des petits pivots

Quand le pivot est très petit par rapport aux autres éléments :

  1. Multiplicateurs énormes : mij=aij/akkm_{ij} = a_{ij}/a_{kk} devient très grand
  2. Amplification des erreurs d'arrondi : Multiplier par un grand nombre amplifie les erreurs
  3. Perte de chiffres significatifs : Les petites quantités sont « absorbées » par les grandes

La solution du pivotage

En choisissant le plus grand pivot possible :

  1. Multiplicateurs bornés : ∣mij∣≤1|m_{ij}| \leq 1 avec le pivotage partiel
  2. Erreurs contrôlées : Les erreurs d'arrondi ne sont pas amplifiées
  3. Stabilité numérique : Le conditionnement effectif reste raisonnable
💡

Règle pratique

Pivotage partiel : À chaque étape kk, chercher le maximum ∣aik∣|a_{ik}| pour i≥ki \geq k et échanger les lignes. Coût négligeable, gain en stabilité énorme.

Pivotage complet : Chercher le maximum dans toute la sous-matrice restante. Plus coûteux mais parfois nécessaire pour des matrices très mal conditionnées.


Résumé

Type de pivotageRecherche du pivotCoûtUsage
AucunUtilise akka_{kk} directement00Jamais en pratique
PartielMax dans la colonne kkO(n2)O(n^2)Standard (défaut)
CompletMax dans la sous-matriceO(n3)O(n^3)Matrices très mal conditionnées

À retenir : Le pivotage partiel est toujours utilisé en pratique. Son coût est négligeable par rapport au gain en stabilité numérique. Les bibliothèques comme NumPy (np.linalg.solve) et LAPACK l'utilisent systématiquement.