À ma connaissance, il existe 4 façons de résoudre un système d'équations linéaires (corrigez-moi s'il y en a plus):
- Si la matrice système est une matrice carrée de rang complet, vous pouvez utiliser la règle de Cramer;
- Calculer l'inverse ou le pseudoinverse de la matrice système;
- Utiliser des méthodes de décomposition matricielle (l'élimination gaussienne ou gaussienne-jordanienne est considérée comme une décomposition LU);
- Utilisez des méthodes itératives, telles que la méthode du gradient conjugué.
En fait, vous ne voulez presque jamais résoudre les équations en utilisant la règle de Cramer ou en calculant l'inverse ou le pseudoinverse, en particulier pour les matrices de grande dimension, donc la première question est de savoir quand utiliser les méthodes de décomposition et les méthodes itératives, respectivement. Je suppose que cela dépend de la taille et des propriétés de la matrice du système.
La deuxième question est, à votre connaissance, quel type de méthodes de décomposition ou méthodes itératives conviennent le mieux à certaines matrices de système en termes de stabilité numérique et d'efficacité.
Par exemple, la méthode du gradient conjugué est utilisée pour résoudre des équations où la matrice est symétrique et définie positive, bien qu'elle puisse également être appliquée à n'importe quelle équation linéaire en convertissant en . Aussi pour une matrice définie positive, vous pouvez utiliser la méthode de décomposition de Cholesky pour rechercher la solution. Mais je ne sais pas quand choisir la méthode CG et quand choisir la décomposition Cholesky. Mon sentiment est que nous ferions mieux d'utiliser la méthode CG pour les grandes matrices.A T A x = A T b
Pour les matrices rectangulaires, nous pouvons utiliser la décomposition QR ou SVD, mais encore une fois, je ne sais pas comment en choisir une.
Pour les autres matrices, je ne sais pas maintenant comment choisir le solveur approprié, telles que les matrices hermitiennes / symétriques, les matrices clairsemées, les matrices de bandes, etc.
la source
Réponses:
Votre question revient un peu à demander quel tournevis choisir en fonction du lecteur (slot, Phillips, Torx, ...): outre qu'il y en a trop , le choix dépend également de si vous voulez juste serrer une vis ou assembler un ensemble complet d'étagères de bibliothèque. Néanmoins, en réponse partielle à votre question, voici quelques-unes des questions que vous devez garder à l'esprit lorsque vous choisissez une méthode pour résoudre le système linéaire . Je me limiterai également aux matrices inversibles; les cas de systèmes sur ou sous-déterminés sont une question différente et devraient vraiment être des questions distinctes.Ax=b
Comme il n'y a pas de déjeuner gratuit, vous devez généralement décider d'un compromis entre les deux. Après cela, vous commencez à regarder la matrice (et votre matériel) pour décider d'une bonne méthode (ou plutôt, la méthode pour laquelle vous pouvez trouver une bonne implémentation). (Notez comment j'ai évité d'écrire "le meilleur" ici ...) Les propriétés les plus pertinentes ici sontA
Dans cet esprit, vous devez ensuite parcourir la (vaste) littérature et évaluer les différentes méthodes que vous trouvez pour votre problème spécifique. Voici quelques remarques générales:
Si vous avez vraiment besoin (près de) de la précision de la machine pour votre solution, ou si votre matrice est petite (disons, jusqu'à lignes), il est difficile de battre les méthodes directes, en particulier pour les systèmes denses (car dans ce cas, chaque multiplication de matrice sera , et si vous avez besoin de beaucoup d'itérations, ce n'est peut-être pas loin du une méthode directe a besoin). De plus, la décomposition LU (avec pivotement) fonctionne pour toute matrice inversible, contrairement à la plupart des méthodes itératives. (Bien sûr, si est symétrique et défini positif, vous utiliseriez Cholesky.)O ( n 2 ) O ( n 3 ) A1000 O(n2) O(n3) A
Cela est également vrai pour les (grandes) matrices creuses si vous ne rencontrez pas de problèmes de mémoire: les matrices creuses en général n'ont pas de décomposition LU clairsemée, et si les facteurs ne rentrent pas dans la mémoire (rapide), ces méthodes deviennent inutilisables.
En outre, les méthodes directes ont été autour depuis longtemps, et très logiciels de haute qualité existe (par exemple, UMFPACK, OREILLONS, SuperLU pour matrices creuses) qui peuvent exploiter automatiquement la structure de bande de .A
Si vous avez besoin de moins de précision ou si vous ne pouvez pas utiliser de méthodes directes, choisissez une méthode de Krylov (par exemple, CG si est défini positif symétrique, GMRES ou BiCGStab sinon) au lieu d'une méthode stationnaire (telle que Jacobi ou Gauss-Seidel): elles sont généralement fonctionnent beaucoup mieux, car leur convergence n'est pas déterminée par le rayon spectral de mais par (la racine carrée) du nombre de conditions et ne dépend pas de la structure de la matrice. Cependant, pour obtenir de très bonnes performances avec une méthode Krylov, vous devez choisir un bon préconditionneur pour votre matrice - et c'est plus un métier qu'une science ...AA A
Si vous devez à plusieurs reprises résoudre des systèmes linéaires avec la même matrice et différents côtés droits, les méthodes directes peuvent toujours être plus rapides que les méthodes itératives car vous n'avez besoin de calculer la décomposition qu'une seule fois. (Cela suppose une solution séquentielle; si vous avez tous les côtés droit en même temps, vous pouvez utiliser les méthodes de blocage de Krylov.)
Bien sûr, ce ne sont que des directives très approximatives: pour l'une des déclarations ci-dessus, il existe probablement une matrice pour laquelle l'inverse est vrai ...
Puisque vous avez demandé des références dans les commentaires, voici quelques manuels et articles de synthèse pour vous aider à démarrer. (Ni l'un ni l'autre - ni l'ensemble - n'est complet; cette question est beaucoup trop large et dépend trop de votre problème particulier.)
la source
L'arbre de décision de la section 4 du chapitre correspondant du manuel de la bibliothèque NAG répond (en partie) à certaines de vos questions.
la source
La documentation de la bibliothèque Eigen a également une belle page de présentation avec beaucoup d'informations sur les différentes décompositions matricielles:
http://eigen.tuxfamily.org/dox/group__TopicLinearAlgebraDecompositions.html
la source