TP10 : Autour du déterminant

M. Fouquet

Calcul du déterminant d'une matrice par la méthode des mineurs

Nous allons nous intéresser à la méthode de calcul du déterminant d'une matrice utilisant les mineurs de la matrice.

On rappelle le résultat du cours : Soit A=(a_i,j) une matrice nxn dans R. On note A_ij son mineur d'ordre (i,j) (ie. la matrice formée à partir de A en lui ôtant sa i-ème ligne et sa j-ème colonne). Alors det(A) = Sigma^n _i=1 (-1)^(i+j) a_ij det(A_ij)=Sigma^n _j=1 (-1)^(i+j)  a_ij det(A_ij).

Nous allons pour nous simplifier le travail travailler avec des matrices dont les coefficients sont des entiers entre 0 et 10. Nous pouvons créer de telles matrices à l'aide de la procédure suivante.

> with(linalg):

> aleabis:=proc() evalf(rand()mod 10); end;

aleabis := proc () evalf(`mod`(rand(), 10)) end proc

> A := randmatrix(7,7,entries=aleabis);

A := matrix([[1., 0., 7., 3., 6., 8., 5.], [8., 1., 9., 5., 3., 7., 0.], [4., 5., 6., 1., 7., 9., 6.], [8., 6., 9., 3., 1., 4., 6.], [3., 2., 1., 3., 0., 1., 8.], [3., 0., 4., 5., 1., 5., 4.], [9., 0....

1. Donner une procédure Mineur qui à partir d'une matrice A et de deux indices i et j nous donne le mineur de A d'ordre (i,j) (en vous servant de ce qui a été fait à la dernière séance).

> M:= randmatrix(4,4,entries=aleabis);

M := matrix([[1., 6., 9., 1.], [6., 5., 3., 4.], [3., 9., 6., 0.], [6., 0., 5., 5.]])

> Mineur(M, 2, 3);

matrix([[1., 6., 1.], [3., 9., 0.], [6., 0., 5.]])

2. Donner une procédure NbZeroLigne qui à partir d'une matrice A et d'un indice i nous donne le nombre de coefficients nuls de la ligne i de la matrice A.

> NbZeroLigne(M, 4);

1

> NbZeroLigne(M, 2);

0

3. Donner une procédure NbZeroColonne qui à partir d'une matrice A et d'un indice j nous donne le nombre de coefficients nuls de la colonne j de la matrice A.

> NbZeroColonne(M, 2);

1

4. Donner une procédure LigneZero qui à partir d'une matrice A détermine l'indice de la ligne de A qui a le plus de coefficients nuls et le nombre de coefficients nuls de cette ligne. En utilisant cette procédure, donner une procédure ColonneZero qui à partir d'une matrice A donne la colonne de A qui a le plus de coefficients nuls et le nombre de coefficients nuls de cette ligne.

> LigneZero(M);

3, 1

> ColonneZero(M);

2, 1

5. Donner une procédure DetParMineur récursive qui détermine le déterminant d'une matrice A par la méthode des mineurs. Cette procédure choisira la ligne ou la colonne ayant le plus de coefficients nuls. On rappelle que le déterminant d'une matrice 1x1 est égal au coefficient de la matrice.

> N:=randmatrix(2,2, entries = aleabis);

N := matrix([[6., 6.], [6., 2.]])

> DetParMineur(N);

-24.

> DetParMineur(M);

-513.

On peut vérifier le calcul par la procédure préprogrammée.

> det(M);

-513.

> det(N);

-24.

> J := randmatrix(5,5, entries = aleabis);

J := matrix([[7., 1., 4., 5., 6.], [7., 5., 6., 0., 2.], [0., 8., 5., 4., 9.], [0., 9., 4., 6., 7.], [6., 0., 8., 0., 3.]])

> DetParMineur(J);

-8057.

> det(J);

-8057.

Formules de Cramer

On rappelle le résultat du cours :

Soient A une matrice nxn à coefficients dans un corps K inversible et B un vecteur colonne de taille n. Alors l'équation AX=B admet une unique solution.

Si on note X=(x_i) 1<=i <= n alors on a x_i det(A)= det(B_i) où B_i est obtenue à partir de A en remplaçant sa i ème colonne par B.

1. Donner une procédure NewMatrice qui à partir d'une matrice A, un vecteur B et un indice i renvoie la matrice B_i.

> A := randmatrix(5, 5, entries = aleabis);

A := matrix([[4., 0., 7., 6., 2.], [6., 9., 9., 1., 6.], [2., 3., 3., 7., 3.], [6., 4., 1., 9., 8.], [2., 7., 4., 1., 2.]])

> B := randvector(5, entries = aleabis);

B := vector([5., 4., 3., 2., 8.])

> NewMatrice(A, B, 3);

matrix([[4., 0., 5., 6., 2.], [6., 9., 4., 1., 6.], [2., 3., 3., 7., 3.], [6., 4., 2., 9., 8.], [2., 7., 8., 1., 2.]])

2. Donner une procédure Cramer qui à partir d'une matrice A et d'un vecteur B nous renvoie le vecteur X solution de AX = B.

> X:=Cramer(A, B);

X := vector([3.990740741, 1.777777778, -1.065843621, .9320987654, -4.547325103])

> multiply(A,X);

vector([4.999999994, 4.00000001, 3.00000001, 2.00000001, 8.000000014])