2013-07-30 5 views
1

J'utilise la bibliothèque Armadillo C++ pour résoudre des systèmes linéaires de moyennes/grandes dimensions (1000-5000 équations).Armadillo décomposition de C++ LU

Depuis que je dois résoudre différents systèmes linéaires

AX = b

dans laquelle A est toujours les mêmes et B des changements, je voudrais LU factoriser A une seule fois et réutiliser la factorisation LU avec différents b. Malheureusement, je ne sais pas comment effectuer ce genre d'opérations à Armadillo.

Ce que je ne faisais que la factorisation LU de la matrice A:

Mais maintenant, je voudrais utiliser les matrices P, L et U pour résoudre plusieurs systèmes linéaires avec différents vecteurs b.

Pourriez-vous m'aider s'il vous plaît?

+0

Peut-être pourriez-vous nous dire ce que vous avez déjà essayé? Peut-être pouvez-vous éditer votre question pour inclure un [SSCCE] (http://sscce.org/) de votre tentative? –

+0

Merci Joachim, j'ai ajouté ce que j'ai essayé ... –

Répondre

2

Depuis A = P.t()*L*U (où l'égalité est approximative en raison d'erreurs d'arrondi), la résolution de x en P.t()*L*U*x = b exige permutant les lignes de B et effectuer la substitution avant et en arrière:

x = solve(trimatu(U), solve(trimatl(L), P*b)); 

En raison de l'absence d'un vrai résolveur triangulaire dans tatouage, et un moyen rapide d'effectuer permutation de ligne, cette procédure ne sera pas très efficace, en ce qui concerne un appel direct aux sous-routines de calcul LAPACK pertinentes.

Le conseil général est d'éviter la décomposition LU explicite dans les bibliothèques de niveau supérieur, comme le tatou.

  1. si tous les différents b « en même temps, sont connus s, de les stocker sous forme de colonnes dans une matrice rectangulaire B et X = solve(A,B);
  2. si les différents b » s sont connus une à la fois, précalculer puis AINV = A.i(); et x = AINV*b; sera plus efficace si le nombre de différents rhs les vecteurs sont assez gros. Voir ce answer à un similaire question.