Vous êtes sur la page 1sur 2

TP de Maple : Pivot de Gauss

c François Fayard, protégé par la GNU Free Documentation License


source disponible sur http://www.velvia.org

Le but de ce TP est d’implémenter l’algorithme du pivot de Gauss. Dans une première qui en entrée prend une matrice A ∈ Mq,p (R) et en sortie retourne la séquence B,r où
partie, on utilisera cet algorithme pour calculer le rang d’une matrice. La seconde partie est B est la matrice équivalente à A de la forme
consacrée à la résolution des systèmes linéaires de Cramer, c’est-à-dire à la résolution des
b1,1 ? ?
 
équations du type AX = Y où A ∈ GLn (R) et Y ∈ Mn,1 (R).
 
 0 
 
 
1 Calcul du rang par pivot de Gauss 
 b r,r ? ? 

 

0 0 0
 avec ∀k ∈ J1, rK bk,k 6= 0
1. Écrire une procédure

 
 
 
pivot_cherche:=proc(A::matrix,k::integer)  
0 0 0 0
qui en entrée accepte une matrice A ∈ Mq,p (R) et un entier k ∈ N∗ et en sortie
retourne : obtenue par l’algorithme du pivot de Gauss, et r le rang de A.
– la liste [0,0] lorsque : ∀i ∈ Jk, qK ∀j ∈ Jk, pK ai,j = 0
– la liste [i,j] où (i, j) ∈ Jk, qK × Jk, pK est le premier couple d’entier trouvé tel que
ai,j 6= 0 sinon. 2 Résolution d’un système de Cramer
2. Écrire une procédure Dans cette partie, on cherche à résoudre l’équation AX = Y où A ∈ GLn (R) et
Y ∈ Mn,1 (R) par la méthode du pivot de Gauss.
pivot_elim:=proc(A::matrix,k::integer)
qui en entrée prend une matrice A ∈ Mq,p (R) de la forme 2.1 Algorithme du pivot de Gauss
 a1,1 a1,p  1. Écrire une procédure

 0
 
 pivot_cherche_ga:=proc(A::matrix,k::integer)
qui en entrée prend une matrice A ∈ GLn (R) de la forme
 

 0 ak,k 

   a1,1



 a1,n 
 
 0
   
  
 
0 0 aq,k aq,p 
 0 ak,k 

 
 
avec ak,k 6= 0. Le procédure effectuera un pivot de Gauss en utilisant pour pivot le 



nombre ak,k et retournera la matrice équivalente ainsi obtenue. 



3. Écrire une procédure 0 0 an,k an,n

gauss_elim=proc(A::matrix) et un entier k ∈ J1, nK et retourne i, plus petit entier de Jk, nK tel que ai,k 6= 0.
2. Écrire une procédure (b) Pour éviter ce genre de problème, on modifie l’algorithme de recherche d’un pivot
pivot_elim_ga:=proc(A::matrix,Y::matrix,k::integer) de la manière suivante : au lieu de se contenter de chercher un pivot non nul dans la
colonne k, on cherche le pivot de cette colonne ayant la plus grande valeur absolue.
qui en entrée prend une matrice A ∈ GLn (R) de la forme Écrire les procédures :
 a1,1 a1,n  pivot_cherche_pp:=proc(A::matrix,k::integer)
gauss_solve_pp:=proc(A::matrix,Y::matrix)
 0
 

mettant en oeuvre cet algorithme.
 

 0 ak,k 




 2. Conditionnement d’un système linéaire
 



 (a) En utilisant gauss_solve_ga, résoudre les systèmes linéaires :
 
an,k an,n 10a + 7b + 8c + 7d = 32

0 0 
7a + 5b + 6c + 5d = 23

une matrice Y ∈ Mn,1 (R) et un entier k ∈ J1, nK et retourne la liste [B,Z] où BX = Z
 8a + 6b + 10c + 9d = 33

est le système équivalent au système AX = Y obtenu après une étape du pivot de 7a + 5b + 9c + 10d = 31
Gauss.
3. Écrire une procédure puis le système linéaire perturbé, où les seconds membres ont été
« très légèrement » modifiés :
triang_solve_ga:=proc(A::matrix,Y::integer)
10a + 7b + 8c + 7d = 32 + 1/10

qui en entrée prend une matrice A ∈ GLn (R) triangulaire supérieure et une matrice 
7a + 5b + 6c + 5d = 23 − 1/10

Y ∈ Mn,1 (R) et qui retourne l’unique solution X de l’équation AX = Y .
8a + 6b + 10c + 9d = 33 + 1/10
4. Écrire une procédure


7a + 5b + 9c + 10d = 31 − 1/10
gauss_solve_ga:=proc(A::matrix,Y::matrix)
Que remarquez vous ?
qui en entrée prend une matrice A ∈ GLn (R) et un vecteur Y ∈ Mn,1 (R) et retourne
l’unique solution X du système AX = Y . (b) Définir la matrice de Hilbert A de taille 10 × 10 : par :

1
2.2 Résolution numérique ∀i, j ∈ J1, 10K ai,j =
i+j
1. Méthode du pivot partiel
(a) En utilisant gauss_solve_ga, résoudre le système linéaire et la matrice Y ∈ Mn,1 (R) :

∀i ∈ J1, 10K yi = 1

1, 0 · 10−20 x + 1, 0 · y = 1, 0
1, 0 · x + 1, 0 · y = 2, 0
puis résoudre le système AX = Y en utilisant successivement :
puis le système linéaire équivalent
 gauss_solve_ga(A,Y)
1, 0 · x + 1, 0 · y = 2, 0 gauss_solve_ga(map(evalf,A),map(evalf,Y))
1, 0 · 10−20 x + 1, 0 · y = 1, 0 gauss_solve_pp(map(evalf,A),map(evalf,Y))
Que remarquez-vous ? Quelle est la bonne solution ? Expliquez ce qui s’est passé. Répétez les deux derniers calculs en augmentant la variable Digits.

Vous aimerez peut-être aussi