Estou tentando resolver uma equação de Poisson 2D por diferenças finitas. No processo, obtenho uma matriz esparsa com apenas variáveis em cada equação. Por exemplo, se as variáveis fossem U , a discretização produziria:
Eu sei que posso resolver esse sistema por um método iterativo, mas ocorreu-me que, se eu ordenasse as variáveis adequadamente, seria possível obter uma matriz em faixas que poderia ser resolvida por um método direto (por exemplo, eliminação gaussiana w / o pivotante). Isso é possível? Existem estratégias para fazer isso em outros sistemas esparsos, talvez menos estruturados?
Respostas:
Esse é um problema bem estudado no campo dos solucionadores diretos esparsos. Eu recomendo a leitura da visão geral de Joseph Liu do método multifrontal para ter uma idéia melhor de como os novos pedidos e supernós afetam o tempo de preenchimento e solução.
A dissecção aninhada é uma maneira extremamente comum de gerar a reordenação e consiste essencialmente em particionamento de gráfico recursivo. O MeTiS é o padrão de fato para particionamento de gráficos, e você pode ler sobre algumas das idéias por trás dele aqui . Outro pacote comumente usado é o SCOTCH , e o Chaco também é importante, pois seus autores introduziram o particionamento de gráficos em vários níveis , que também é a idéia fundamental por trás do MeTiS .
George e Liu mostrou em seu clássico livro que as soluções esparsas-direta 2d requerem apenas trabalho e O ( n log n ) de memória, enquanto 3d esparsa-direta requer O ( n 2 ) trabalho e O ( n 4 / 3 ) memória.O(n3/2) O(nlogn) O(n2) O(n4/3)
fonte
Cuthill-McKee é o padrão de fato para o que você deseja fazer. Se você quiser jogar com esse método, há uma implementação fácil de usar do algoritmo (e seu reverso) na Boost Graph Library (BGL), e a documentação contém exemplos de como usá-lo.
fonte
Falando em métodos multifrontais, Tim Davis , que trabalha em métodos multifrontais para fatoração de LU ( UMFPACK ), possui várias rotinas que reorganizam matrizes para minimizar o preenchimento. Você pode encontrá-los aqui como parte do SuiteSparse . O SuiteSparse usa o MeTiS.
Outra coisa a ser observada: em alguns problemas, você pode ser inteligente ao ordenar variáveis, para obter padrões unidos ou quase unidos, o que pode poupar o problema (e o tempo de CPU) de chamar esses algoritmos. No entanto, essa reordenação inteligente requer insights de sua parte e não é nem de longe tão geral quanto os algoritmos de reordenação baseados na teoria dos grafos que as pessoas mencionaram em suas respostas aqui.
fonte
Existe um algoritmo chamado ADI (Alternating Direction Implicit) nos círculos matemáticos aplicados e o operador Split nos círculos da física que faz basicamente o que você descreve. É um método iterativo e segue este procedimento básico:
Repita 1 e 2 até que o erro seja tão pequeno quanto você deseja.
Não conheço a complexidade formal desse algoritmo, mas descobri que ele converge em menos iterações do que coisas como Jacobi e Gauss-Seidel toda vez que o uso.
fonte