J'essaie de résoudre une équation de Poisson 2D par des différences finies. Dans le processus, j'obtiens une matrice clairsemée avec seulement variables dans chaque équation. Par exemple, si les variables étaient U , alors la discrétisation donnerait:
Je sais que je peux résoudre ce système par une méthode itérative, mais l'idée m'est venue à l'esprit que si je commandais les variables de manière appropriée, je pourrais être en mesure d'obtenir une matrice en bandes qui pourrait être résolue par une méthode directe (c.-à-d. Élimination gaussienne w / o pivotant). Est-ce possible? Existe-t-il des stratégies pour le faire pour d'autres systèmes clairsemés peut-être moins structurés?
Réponses:
Il s'agit d'un problème bien étudié dans le domaine des solveurs directs clairsemés. Je recommande fortement de lire l' aperçu de Joseph Liu de la méthode multifrontale afin d'avoir une meilleure idée de la façon dont les réorganisations et les supernodes affectent le temps de remplissage et de solution.
La dissection imbriquée est un moyen extrêmement courant de générer la réorganisation, et consiste essentiellement en un partitionnement récursif de graphes. Metis est la norme de facto pour le partitionnement de graphe, et vous pouvez lire quelques - unes des idées derrière elle ici . Un autre package couramment utilisé est SCOTCH , et Chaco est également important, car ses auteurs ont introduit le partitionnement graphique à plusieurs niveaux , qui est également l'idée fondamentale derrière MeTiS .
George et Liu ont montré dans leur livre classique que les solutions 2D directe rares exigent que travail et O ( n log n ) la mémoire, alors que nécessite 3d clairsemés directe O ( n 2 ) travaux et O ( n 4 / 3 ) mémoire.O(n3/2) O(nlogn) O(n2) O(n4/3)
la source
Cuthill-McKee est la norme de facto pour ce que vous voulez faire. Si vous vouliez jouer avec cette méthode, il existe une implémentation facile à utiliser de l'algorithme (et son inverse) dans la Boost Graph Library (BGL), et la documentation contient des exemples d'utilisation.
la source
En parlant de méthodes multifrontales, Tim Davis , qui travaille sur les méthodes multifrontales pour la factorisation LU ( UMFPACK ), a un certain nombre de routines qui réorganiseront les matrices pour minimiser le remplissage. Vous pouvez les trouver comme ici dans le cadre de SuiteSparse . SuiteSparse utilise MeTiS.
Une autre chose à noter: dans certains problèmes, vous pouvez être intelligent pour classer les variables afin d'obtenir des modèles regroupés ou proches des modèles regroupés, ce qui peut vous éviter la peine (et le temps CPU) d'appeler ces algorithmes. Cependant, cette réorganisation intelligente nécessite un aperçu de votre part et est loin d'être aussi générale que les algorithmes de réorganisation basés sur la théorie des graphes que les gens ont mentionnés dans leurs réponses ici.
la source
Il y a un algorithme appelé ADI (Alternating Direction Implicit) dans les cercles de mathématiques appliquées et Split-operator dans les cercles de physique qui fait essentiellement ce que vous décrivez. C'est une méthode itérative, et elle suit cette procédure de base:
Répétez 1 et 2 jusqu'à ce que l'erreur soit aussi petite que vous le souhaitez.
Je ne connais pas la complexité formelle de cet algorithme, mais je l'ai trouvé converger en moins d'itérations que des choses comme Jacobi et Gauss-Seidel chaque fois que je l'ai utilisé.
la source