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=(4132043637),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 :

(4132304316372)\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} = -323232maximum
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 : R1R1R_1 \leftrightarrow R_1 (pas nécessaire, déjà en ligne 1)
  • Échange de colonnes : C1C3C_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 C1C3C_1 \leftrightarrow C_3 : (x3,x2,x1)(x_3, x_2, x_1).

Après l'échange C1C3C_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=332=332m_{21} = \frac{a_{21}}{a_{11}} = \frac{3}{-32} = -\frac{3}{32}
m31=a31a11=732=732m_{31} = \frac{a_{31}}{a_{11}} = \frac{7}{-32} = -\frac{7}{32}

Opérations :

  • R2R2m21R1=R2+332R1R_2 \leftarrow R_2 - m_{21} \cdot R_1 = R_2 + \frac{3}{32} R_1
  • R3R3m31R1=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{,}875maximum
a22=4,094a_{22} = 4{,}0944,0944{,}094

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

  • Échange de lignes : R2R3R_2 \leftrightarrow R_3
  • Échange de colonnes : C2C3C_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,8750,0545m_{32} = \frac{0{,}375}{6{,}875} \approx 0{,}0545

Opération : R3R3m32R2R_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,9180,290x_2 = \frac{1{,}136}{3{,}918} \approx 0{,}290
x1=2,6563,219×0,2906,8750,250x_1 = \frac{2{,}656 - 3{,}219 \times 0{,}290}{6{,}875} \approx 0{,}250
x3=34×0,2501×0,290320,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,2900,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,0002,0002,9065,3873,0004,0313,112),b=(7,9984,4814,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,0000,002=1000m_{21} = \frac{-2{,}000}{-0{,}002} = 1000
m31=3,0000,002=1500m_{31} = \frac{3{,}000}{-0{,}002} = -1500

Élimination (avec arrondi à 4 chiffres) :

R2R21000R1R_2 \leftarrow R_2 - 1000 \cdot R_1 :

  • a22=2,9061000×4,000=2,9064000=3997a_{22}' = 2{,}906 - 1000 \times 4{,}000 = 2{,}906 - 4000 = -3997 → arrondi : 3,997×103-3{,}997 \times 10^3
  • a23=5,3871000×4,000=4005a_{23}' = -5{,}387 - 1000 \times 4{,}000 = -4005 → arrondi : 4,005×103-4{,}005 \times 10^3
  • b2=4,4811000×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,99803,9974,0058,0020010,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,00010,00=0,000x_3 = \frac{0{,}000}{-10{,}00} = 0{,}000
x2=8002(4005)×03997=800239972,002x_2 = \frac{-8002 - (-4005) \times 0}{-3997} = \frac{-8002}{-3997} \approx 2{,}002
x1=7,9984×2,0024×00,002=0,0100,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
10,002-0{,}0020,0020{,}002
22,000-2{,}0002,0002{,}000
33,0003{,}0003,0003{,}000maximum

Échange : R1R3R_1 \leftrightarrow R_3

Après échange :

(3,0004,0313,1124,1430,0024,0004,0007,9982,0002,9065,3874,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,0000,0007m_{21} = \frac{-0{,}002}{3{,}000} \approx -0{,}0007
m31=2,0003,0000,6667m_{31} = \frac{-2{,}000}{3{,}000} \approx -0{,}6667

Élimination (première colonne) :

Après élimination et arrondi à 4 chiffres :

(3,0004,0313,1124,14303,9973,9987,99500,2187,4627,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,9970,0545m_{32} = \frac{0{,}218}{3{,}997} \approx 0{,}0545

Matrice triangulaire finale :

(3,0004,0313,1124,14303,9973,9987,995007,6817,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,6817,681=1,000x_3 = \frac{-7{,}681}{-7{,}681} = 1{,}000
x2=7,9953,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 : mij1|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 iki \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.