Próbuję rozwiązać równanie Poissona 2D na podstawie różnic skończonych. W tym procesie otrzymuję rzadką macierz z tylko zmiennymi w każdym równaniu. Na przykład, jeśli zmienne byłyby , dyskretyzacja dałaby:
Wiem, że mogę rozwiązać ten system za pomocą metody iteracyjnej, ale przyszło mi do głowy, że jeśli odpowiednio uporządkuję zmienne, być może uda mi się uzyskać macierz pasmową, którą można rozwiązać metodą bezpośrednią (tj. Eliminacja Gaussa w / o pivoting). czy to możliwe? Czy istnieją jakieś strategie pozwalające to zrobić w przypadku innych, być może mniej ustrukturyzowanych rzadkich systemów?
Odpowiedzi:
Jest to dobrze zbadany problem w dziedzinie solverów rzadkich. Gorąco polecam zapoznanie się z omówieniem metody wielopłaszczyznowej przez Josepha Liu , aby lepiej zrozumieć, w jaki sposób zmiany kolejności i supernody wpływają na czas wypełniania i rozwiązania.
Zagnieżdżone rozwarstwienie jest niezwykle powszechnym sposobem generowania zmiany kolejności i zasadniczo polega na rekurencyjnym dzieleniu grafów. MeTiS jest de facto standardem do partycjonowania grafów i możesz przeczytać o niektórych pomysłach tutaj . Innym często używanym pakietem jest SCOTCH , a Chaco jest również ważne, ponieważ jego autorzy wprowadzili wielopoziomowe partycjonowanie grafów , co jest również podstawową ideą MeTiS .
George i Liu wykazały ich klasycznym książki że 2d rozwiązania rzadki direct wymagają jedynie pracy i pamięci, natomiast 3d rzadki direct wymaga praca i pamięć .O ( n log n ) O ( n 2 ) O ( n 4 / 3 )O(n3/2) O(nlogn) O(n2) O(n4/3)
źródło
Cuthill-McKee to de facto standard tego, co chcesz robić. Jeśli chcesz bawić się tą metodą, istnieje łatwa w użyciu implementacja algorytmu (i jego odwrotności) w bibliotece grafów Boost (BGL), a dokumentacja zawiera przykłady, jak go używać.
źródło
Mówiąc o metodach wielopłaszczyznowych, Tim Davis , który pracuje nad wielopłaszczyznowymi metodami faktoryzacji LU ( UMFPACK ), ma szereg procedur, które będą zmieniać kolejność matryc w celu zminimalizowania wypełnienia. Można je znaleźć tutaj, jako część SuiteSparse . SuiteSparse korzysta z MeTiS.
Jeszcze jedna rzecz do zapamiętania: w niektórych problemach możesz być sprytny w porządkowaniu zmiennych, aby uzyskać pasmowe lub zbliżone do pasmowych wzorce, które mogą zaoszczędzić ci kłopotów (i czasu procesora) wywołania tych algorytmów. Jednak ta sprytna zmiana kolejności wymaga wglądu z twojej strony i nie jest tak ogólna, jak algorytmy zmiany kolejności oparte na teorii grafów, o których wspominali ludzie w swoich odpowiedziach tutaj.
źródło
W zastosowanych kręgach matematycznych jest algorytm o nazwie ADI (Alternative Direction Implicit) i operator Split w kręgach fizyki, który robi właściwie to, co opisujesz. Jest to metoda iteracyjna i postępuje zgodnie z tą podstawową procedurą:
Powtarzaj 1 i 2, aż błąd będzie tak mały, jak chcesz.
Nie znam formalnej złożoności tego algorytmu, ale zauważyłem, że za każdym razem, gdy go używam, zbiega się w mniejszej liczbie iteracji niż rzeczy takie jak Jacobi i Gauss-Seidel.
źródło