Je résous un problème physique en utilisant un schéma numérique implicite. Cela m'amène à résoudre une équation linéaire avec une matrice tridiagonale. J'ai codé cet algorithme à partir de Wikipedia. Je me demande s'il existe une bibliothèque efficace qui permet de résoudre ce type d'équation de manière optimisée. Une note importante est que la matrice elle-même ne change que lorsque les paramètres du système changent, j'ai donc eu l'occasion de précalculer certaines étapes de l'algorithme pour un bon bonus de performance. J'utilise C ++.
12
Réponses:
Vous devriez probablement commencer par l'implémentation de LAPACK,? Gtsv, par exemple, dgtsv . Si vous voulez une version à mémoire distribuée, vous voudrez peut-être commencer par p? Gtsv de ScaLAPACK.
EDIT: Étant donné que votre matrice ne change pas très souvent, vous pouvez éviter de factoriser de manière redondante la matrice tridiagonale en décomposant la routine LAPACK? Gtsv en l'étape de factorisation,? Gttrf, et l'étape de résolution,? Gttrs. Des routines portant le même nom existent dans ScaLAPACK et servent le même objectif.
la source
Pour les systèmes parallèles distribués : je n'ai pas essayé ScaLAPACK, qui a un solveur tridiagonal parallèle, pour lequel il existe des exemples disponibles en ligne . J'ai essayé avec un certain succès une méthode proposée par David Moulton dans une publication LANL . Coder cela peut être plus que ce que vous voulez faire, mais en utilisant LAPACK, c'est bien en avant.
la source
J'ai trouvé un algorithme récursif intéressant ici à la page 975. Il semble prometteur, je me demande ce que les gens plus expérimentés en disent.
la source