Vous êtes sur la page 1sur 5

31 janvier 2018 Génie mathématique (Ma 25) — Corrigé

Exercice 1 On considère le système linéaire




 2x + 4y − z = −1
−4x − 5y + 5z = 2

 2x + 13y + z = 6
1. Présenter ce système sous la forme AX = B.
Réponse. On reconnait un sytème AX = B en posant les matrices suivantes :
   
2 4 −1 −1
A = −4 −5 5  et B= 2 
   
2 13 1 6
 
x
Le vecteur inconnu X étant X = y 
 
z
2. En utilisant la méthode du pivot de Gauss, résoudre le système AX = B. (On précise que le calcul
amène à une solution constituée d’entiers relatifs).
Réponse Introduisons la matrice augmentée du système
 
2 4 −1 −1
à = −4 −5 5 2
 
2 13 1 6

−4
1reétape On considère le premier pivot, qui vaut 2. On introduit les coefficients g21 = 2 = −2 et
g31 = 22 = 1.
On obtient la matrice transformée Ã(2) en opérant sur Ã(1) = Ã les opérations L2 ← L2 + 2L1 et
L3 ← L3 − L1 . Ce qui donne :
 
2 4 −1 −1
Ã(2) = 0 3 3 0
 
0 9 2 7
9
2eétape Le deuxième pivot est 3. On calcule g32 = = 3.
3
On obtient la matrice transformée Ã(3) en opérant sur Ã(2) l’opération L3 ← L3 − 3L2 . Ce qui
donne :
 
2 4 −1 −1
Ã(2) = 0 3 3 0
 
0 0 −7 7
Après la réduction a une matrice triangulaire, on résoud le système par remontée :
La dernière équation −7z = 7 donne z = −1.
La deuxième équation 3y + 3z = 0 donne y = 1.
La première équation 2x + 4y − z = −1 revient à 2x = −1 − 4 − 1 = −6 et donc x = −3.
La solution du système est donc
x = −3, y = 1, z = −1
 
−3
ou X =  1 
 
−1
Exercice 2
1. Qu’appelle-t-on la décomposition de Cholesky d’une matrice carrée A ? A quelle condition sur A
cette décomposition de Cholesky existe-t-elle ?
Réponse La décomposition de Cholesky de A est l’écriture A = LL> , avec L une matrice trian-
gulaire inférieure dont les coefficients diagonaux sont strictement positifs.
Une telle décomposition existe si et seulement si la matrice A est symétrique définie positive.
2. Soit la matrice  
4 −4 2 −6
−4 13 1 9 
A=
 
 2 1 18 −10

−6 9 −10 15
Déterminer la décomposition de Cholesky de A.
Réponse
Appliquons les formules pour calculer la décomposition de Cholesky :


l1,1 = a1,1 = 2
a2,1
l2,1 = = −2
l1,1
a3,1
l3,1 = =1
l1,1
a4,1
l4,1 = = −3
l1,1
q
2 =3
l2,2 = a2,2 − l2,1
a3,2 − l3,1 l2,1
l3,2 = =1
l2,2
a4,2 − l4,1 l2,1
l4,2 = =1
l2,2
q
2 + l2 ) = 4
l3,3 = a3,3 − (l3,1 3,2
a4,3 − (l4,1 l3,1 + l4,2 l3,2 )
l4,3 = = −2
l3,3
q
l4,4 = 2 + l2 + l2 ) = 1
a4,4 − (l4,1 4,2 4,3

D’où
 
2 0 0 0
−2 3 0 0
L=
 
 1 1 4 0

−3 1 −2 1
 
2
16
3. En utilisant la décomposition de Cholesky de A, résoudre le système AX = B, avec B =  .
 
7
1
Réponse
Résoudre AX = B revient à résoudre LLT X = B. Pour cela posons Y = L> X.
On commence par résoudre LY = B, le système triangulaire :


 2y1 =2

 −2y + 3y
1 2 = 16

 y 1 + y 2 + 4y 3 =7


−3y1 + y2 − 2y3 + y4 =1
On résoud par descente : y1 = 1, y2 = 6, y3 = 0 et enfin y4 = −2.
Pour obtenir x, il suffit de résoudre L> x = y, c’est-à-dire le système triangulaire :


 2x1 − 2x2 + x3 − 3x4 =1

 3x + x + x
2 3 4 =6

 4x3 − 2x4 =0


x4 = −2

que l’on résoud par remontée : x4 = −2, x3 = −1, x2 = 3 et x1 = 1.


 
1
 3 
X= 
 
−1
−2

Exercice 3 Soit A la matrice de taille n donnée par


 
2 1 1 ··· 1
1 2 1 · · · 1
 
1 1 2 ··· 1
 
A=
 .. .. .. . . .. 

. . . . .

1 1 1 ··· 2
(Tous les coefficients diagonaux de A sont égaux à 2, les autres coefficients égaux à 1).
Déterminer la décomposition LU de A.
1
Réponse : Le premier pivot vaut 2. Les coefficients gi1 = pour i ≥ 2. La matrice transformée après
2
1
les opérations Li ← Li − L1 est :
2
 
2 1 1 ··· 1
0 3 1 1
 2 2 ··· 2
A(2) 0 12 3
2 ···
1

= 2
 .. .. .. . . .. 
 
. . . . .
0 21 1
2 ··· 3
2
3 1
Le deuxième pivot vaut . Les coefficients gi2 = pour i ≥ 3. La matrice transformée après les opérations
2 3
1
Li ← Li − L2 est :
3
1 ···
 
2 1 1 1
0 3 1 1 1
 2 2 2 ··· 2
4 1 1
0 0 3 ···

3 3
A(3) = 1 4 1
3 ···
0 0 3 3

 .. .. .. .. . . .. 

. . . . . .
1 1 4
0 0 3 3 ··· 3

Et ainsi de suite. Pour la matrice A(k) , le bloc de matrice comprenant les lignes de k à n et les colonnes de
k à n est d’une forme similaire : tous ses termes diagonaux sont égaux à k+1 k et les termes non diagonaux
1
à .
k
1
Les coefficients gik pour i > k sont égaux à gik = . Les opérations sur les lignes donnent des
k+1
nouveaux termes diagonaux sur les lignes transformées qui seront k+1 1 1 k+2
k − k+1 k = k+1 . Les autres termes
des lignes transformées à partir de la colonne k + 1 comprise seront : k1 − k+11 1 1
k = k+1 .
On retrouve bien la même forme.
En fin de calculs, on trouve
1 ···
 
2 1 1 1
0 3 1 1 1
2 ···

 2 2 2 
4 1 1
0 0 3 ···
 
3 3 
U = 5 1
4 ···
0 0 0

4

 .. .. .. .. . . .. 
 
. . . . . . 
n+1
0 0 0 0 ··· n
i+1 1
(Autrement dit, sur la diagonale uii = et au dessus de la diagonale uij = pour j > i).
i i
Quand à L, elle est obtenue en reprenant les valeurs des gij .

···
 
1 0 0 0 0
1 1 0 0 ··· 0
2 
1 1
2 3 1 0 ··· 0 
L=
 12 1 1
1 ··· 0

3 4
 .. .. .. .. .. .. 
 
. . . . . .
1 1 1 1
2 3 4 5 ··· 1
1
(autrement dit, on a lij = pour j < i).
j+1
En déduire la valeur du déterminant de A.
On a A = LU donc det A = det L det U .
34 n+1
Or det L = 1 et det U = 2 ··· = n + 1.
23 n
Donc det A = n + 1.

Exercice 4 On souhaiterait écrire une fonction Python permettant de calculer le déterminant d’une
matrice carrée A. On utilisera pour cela l’algorithme du pivot de Gauss. Les opérations sur les lignes de
la forme Lj ← Lj − gLi ne modifiant pas le déterminant d’une matrice, le déterminant de A est égal au
déterminant de la matrice triangulaire obtenue après application de la réduction de Gauss.
1. Ecrire une telle fonction (qu’on appelera determinant en s’inspirant du code (donné ci-dessous)
du calcul de la réduction de Gauss d’une matrice A.
def ReductionGauss ( A ):
n , m = A . shape
A = np . copy ( A )
for i in range (n -1):
if A [i , i ] == 0. :
print ( ’ Un ␣ pivot ␣ est ␣ nul , ␣ impossible ␣ de ␣ poursuivre ␣ le ␣ calcul ... ’)
return A
for j in range ( i +1 , n ) :
g = A [j , i ] / A [i , i ]
A [j ,:] = A [j ,:] -g * A [i ,:]
return A

Réponse : Comme les modifications des lignes de A incluses dans la fonction ReductionGauss
ne modifient pas le déterminant et comme à la fin de la boucle la matrice A est triangulaire, il
suffit de calculer le produit des termes diagonaux de A en fin d’exécution. On peut proposer le
code suivant :
def determinant ( A ):
n , m = A . shape
A = np . copy ( A )
for i in range (n -1):
if A [i , i ] == 0. :
print ( ’ Un ␣ pivot ␣ est ␣ nul , ␣ impossible ␣ de ␣ poursuivre ␣ le ␣ calcul ... ’)
return ’ ’
for j in range ( i +1 , n ) :
g = A [j , i ] / A [i , i ]
A [j ,:] = A [j ,:] -g * A [i ,:]
D =1.
for i in range ( n ) :
D = D * A [i , i ]
return D
2. La fonction écrite permettrait-elle le calcul du déterminant de n’importe quelle matrice ? Pourquoi ?
Donner des exemples. Proposer une (ou plusieurs) améliorations de l’algorithme.
Réponse : La fonction posera problème si l’un des pivots est nul, comme par exemple pour la
matrice !
0 2
A=
1 3
ou pour la matrice  
1 1 1
B = 2 2 3 
 
4 −1 7
(pour A, le premier pivot est nul, pour B c’est le deuxième qui l’est).
On a donc avantage à programmer un échange de lignes et/ou de colonnes pour éviter la situation
d’un pivot nul (on choisira comme pour la variante de la méthode de Gauss le pivot le plus grand
possible en valeur absolue). Dans le cas où aucun échange possible n’aboutirait à un pivot non
nul, c’est que le déterminant de la matrice est nul (car cela revient calculer le déterminant d’une
matrice avec une colonne nulle). Par ailleurs, ne pas oublier qu’un échange de lignes modifie la
valeur du déterminant : il est multiplié par −1.
Cela donne lieu au code suivant (ici, avec juste un échange de lignes).
def determinant ( A ):
n , m = A . shape
A = np . copy ( A )
D =1.
for i in range (n -1):
PM = -1.
for s in range (i , n ):
VA = abs ( A [s , i ])
if VA > PM :
PM = VA
pos = s
if PM ==0. :
return 0.
if pos > i :
D=-D
Tempo = np . copy ( A [ pos ,:])
A [ pos ,:]= A [i ,:]
A [i ,:]= Tempo
for j in range ( i +1 , n ) :
g = A [j , i ] / A [i , i ]
A [j ,:] = A [j ,:] -g * A [i ,:]
for i in range ( n ) :
D = D * A [i , i ]
return D

Vous aimerez peut-être aussi