web-dev-qa-db-fra.com

Le moyen le plus efficace de résoudre un système d'équations linéaires

J'ai une (n x n) matrice symétrique A et un (n x 1) vecteur B. Fondamentalement, j'ai juste besoin de résoudre Ax = b pour x. Le problème est que A va potentiellement être énorme. Je recherche donc l'algorithme le plus efficace pour résoudre des équations linéaires en C++. J'ai regardé la bibliothèque Eigen. Apparemment, il a une méthode SVD, mais on m'a dit que c'était lent. La résolution de x = inverse (A) * b semble également être sous-optimale. UBLAS est-il plus rapide? Existe-t-il des méthodes plus efficaces? Merci.

Edit: la matrice A est définie positive et non clairsemée.

23
aesir

La meilleure façon de résoudre un système d'équations linéaires de la forme Ax = b consiste à effectuer les opérations suivantes.

  • décomposer A au format A = M1 * M2 (où M1 et M2 sont triangulaires)
  • Résoudre M1 * y = b pour y en utilisant la substitution arrière
  • Résoudre M2 * x = y pour x en utilisant la substitution arrière

Pour les matrices carrées , l'étape 1 utiliserait LU Decomposition .

Pour les matrices non carrées , l'étape 1 utiliserait QR Decomposition .

Si la matrice A est définie positive et non clairsemée , vous utiliseriez Décomposition Cholesky pour la première étape.

Si vous voulez utiliser eigen, vous devrez d'abord le décomposer puis résoudre triangulaire le.

Si cela est encore lent, heureusement, il existe de nombreuses bibliothèques d'algèbre linéaire qui peuvent aider à améliorer les performances. La routine que vous devriez rechercher est dpotrs. Certaines bibliothèques qui l'ont implémenté sont les suivantes:

Si vous utilisez eigen dans le projet global, vous pouvez interfacer la routine LAPACK dont vous avez besoin comme décrit ici .

43
Pavan Yalamanchili