web-dev-qa-db-fra.com

Quel est le meilleur algorithme pour trouver un déterminant d'une matrice?

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?

25
perilbrain

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.

27
dfrankow

Réduction de rangée

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.

Que souhaitez-vous savoir

Quelle est la forme de l'échelon de la ligne?

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.

Vous pouvez trouver R en utilisant des opérations de lignes élémentaires

Échange de lignes, ajout de multiples d'une autre ligne, etc.

Vous dérivez α à partir des propriétés des opérations sur les lignes pour les déterminants

  1. SiBest une matrice obtenue en multipliant une ligne deApar une constante non nulle ß, alors

    det (B) = ß * det (A)

    • En d'autres termes, vous pouvez essentiellement «factoriser» une constante à partir d'une ligne en la tirant simplement devant le déterminant.
  2. SiBest une matrice obtenue en échangeant deux lignes deA, alors

    det (B) = -det (A)

    • Si vous échangez des lignes, retournez le signe.
  3. SiBest une matrice obtenue en ajoutant un multiple d'une ligne à une autre dansA, alors

    det (B) = det (A)

    • Le déterminant ne change pas.

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.

Exemple

(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 |

9
Shelby Oldfield

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.

7
Philibert Perusse

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

0
efwf