Quelqu'un peut-il me dire quel est le meilleur algorithme pour trouver la valeur du déterminant d'une matrice de taille N x N
?
Ici est une discussion approfondie.
Il y a beaucoup d'algorithmes.
Une simple consiste à prendre la décomposition LU
. Puis, depuis
det M = det LU = det L * det U
et L
et U
sont tous deux triangulaires, le déterminant étant un produit des éléments diagonaux de L
et U
. C'est O(n^3)
. Il existe des algorithmes plus efficaces.
Le moyen le plus simple (et pas mal, vraiment) de trouver le déterminant d’une matrice nxn consiste à réduire le nombre de lignes. En gardant à l’esprit quelques règles simples sur les déterminants, nous pouvons résoudre le problème de la manière suivante:
det (A) = α * det (R), oùRest la forme d'échelon de ligne de la matrice d'origineA, et α est un coefficient.
Il est très facile de trouver le déterminant d’une matrice sous forme d’échelon de ligne; vous venez de trouver le produit de la diagonale. Résoudre le déterminant de la matrice d'origineArevient alors à calculer α lorsque vous trouvez la forme d'échelon de ligneR.
Voir ce link pour une définition simple
Remarque: Toutes les définitions ne requièrent pas des 1 pour les entrées principales et ne sont pas nécessaires pour cet algorithme.
Échange de lignes, ajout de multiples d'une autre ligne, etc.
SiBest une matrice obtenue en multipliant une ligne deApar une constante non nulle ß, alors
det (B) = ß * det (A)
SiBest une matrice obtenue en échangeant deux lignes deA, alors
det (B) = -det (A)
SiBest une matrice obtenue en ajoutant un multiple d'une ligne à une autre dansA, alors
det (B) = det (A)
Notez que vous pouvez trouver le déterminant, dans la plupart des cas, uniquement avec la règle 3 (lorsque la diagonale de A n’a pas de zéros, je crois), et dans tous les cas avec uniquement les règles 2 et 3. La règle 1 est utile pour les humains qui font des mathématiques avec papier, en essayant d'éviter les fractions.
(Je fais des démarches inutiles pour démontrer plus clairement chaque règle)
| 2 3 3 1 |
A=| 0 4 3 -3 |
| 2 -1 -1 -3 |
| 0 -4 -3 2 |
R2 <-> R3, -α -> α (Rule 2)
| 2 3 3 1 |
-| 2 -1 -1 -3 |
| 0 4 3 -3 |
| 0 -4 -3 2 |
R2 - R1 -> R2 (Rule 3)
| 2 3 3 1 |
-| 0 -4 -4 -4 |
| 0 4 3 -3 |
| 0 -4 -3 2 |
R2/(-4) -> R2, -4α -> α (Rule 1)
| 2 3 3 1 |
4| 0 1 1 1 |
| 0 4 3 -3 |
| 0 -4 -3 2 |
R3 - 4R2 -> R3, R4 + 4R2 -> R4 (Rule 3, applied twice)
| 2 3 3 1 |
4| 0 1 1 1 |
| 0 0 -1 -7 |
| 0 0 1 6 |
R4 + R3 -> R3
| 2 3 3 1 |
4| 0 1 1 1 | = 4 ( 2 * 1 * -1 * -1 ) = 8
| 0 0 -1 -7 |
| 0 0 0 -1 |
Si vous avez fait une recherche initiale, vous avez probablement constaté qu'avec N> = 4, le calcul d'un déterminant de matrice devient assez complexe. En ce qui concerne les algorithmes, je vous indiquerais article Wikipedia sur les déterminants de matrice , plus précisément la section "Mise en oeuvre algorithmique".
De ma propre expérience, vous pouvez facilement trouver un algorithme de décomposition LU ou QR dans des bibliothèques de matrices existantes telles que Alglib . L'algorithme lui-même n'est cependant pas très simple.
Je ne connais pas trop la factorisation LU, mais je sais que pour obtenir L ou U, il faut que la matrice initiale soit triangulaire (triangulaire supérieur pour U ou triangulaire inférieur pour L). Cependant, une fois que vous obtenez la matrice sous forme triangulaire pour une matrice nxn A et en supposant que la seule opération utilisée par votre code est Rb - k * Ra, vous pouvez simplement résoudre det (A) = Π T (i, i) à partir de i = 0 vers n (ie det (A) = T (0,0) x T (1,1) x ... x T (n, n)) pour la matrice triangulaire T. Vérifiez ce lien pour voir de quoi je parle sur. http://matrix.reshish.com/determinant.php