Atualmente, estou trabalhando na solução de sistemas simétricos muito grandes (mas não positivos definidos), gerados por alguns algoritmos. Essas matrizes têm uma boa esparsidade de bloco que pode ser usada para solução paralela. Mas não consigo decidir se devo usar uma abordagem direta (como Multi-frontal) ou iterativa (GMRES ou MINRES). Todos os meus estudos mostram que os solucionadores iterativos (mesmo com uma convergência bastante rápida de 7 iterações internas) não conseguem vencer o operador '\' direto no MATLAB. Mas, em teoria, os métodos diretos devem ser mais caros. Como isso está acontecendo? Existe algum documento ou papel atualizado para esse caso? Posso usar a escarsidade de bloco em sistemas paralelos usando métodos diretos com a mesma eficiência que os resolvedores iterativos flexíveis como GMRES?
fonte
Respostas:
O solucionador direto esparso do MUMPS pode lidar com sistemas indefinidos simétricos e está disponível gratuitamente ( http://graal.ens-lyon.fr/MUMPS/ ). Ian Duff foi um dos autores do MUMPS e MA57, portanto os algoritmos têm muitas semelhanças.
O MUMPS foi projetado para computadores paralelos com memória distribuída, mas também funciona bem em máquinas de processador único. Se você o vincular a uma biblioteca BLAS com vários segmentos, poderá obter velocidades razoáveis na memória compartilhada, em processadores com vários núcleos.
Você não disse quão grande é "muito grande", mas o MUMPS também possui um recurso fora do núcleo para lidar com problemas em que a matriz fatorada não se encaixa na memória disponível.
fonte
O problema geral do qual os solucionadores diretos estão sofrendo é o fenômeno de preenchimento, o que significa que o inverso de uma matriz esparsa pode ser denso. Isso leva a enormes requisitos de memória se a estrutura da matriz não for "adequada".
Existem tentativas para contornar esses problemas, e a
lu
função padrão do MATLAB emprega alguns deles. Consulte http://www.mathworks.de/de/help/matlab/ref/lu.html para obter uma visão geral das permutações, escala diagonal e outras. O mesmo vale, é claro, para pacotes mais avançados como o MUMPS ( http://graal.ens-lyon.fr/MUMPS/ ).Em geral, porém, se o seu problema for grande o suficiente, você atingirá esse limite de memória e precisará usar métodos iterativos (Krylov).
Se o seu problema for simétrico e indefinido, MINRES pode ser a escolha óbvia. Observe, no entanto, que GMRES e MINRES fazem a mesma coisa na aritmética exata se o problema é simétrico, mas o GMRES tende a sofrer menos com a perda de ortogonalidade. Portanto, algumas pessoas consideram o GMRES como "a melhor implementação do MINRES".
De qualquer forma, você provavelmente lucra com o pré-condicionamento do seu sistema. Se você não deseja gastar tempo adaptando um pré-condicionador, o pré-condicionador incompleto de fatoração da LU (ILU) já pode levá-lo a algum lugar.
fonte
Qualquer solucionador iterativo pode vencer métodos diretos apenas se o problema for suficientemente grande (grande, depende de vários fatores, como armazenamento necessário, eficiência da implementação). E também qualquer método krylov (por exemplo, GMRES) é bom apenas se você usar um pré-condicionamento apropriado (na prática). Se você não estiver usando nenhum pré-condicionamento, os métodos krylov não serão úteis em geral. Eu também trabalho com matrizes esparsas de bloco (estas vêm de aplicativos PDE) e observei que o solucionador de krylov pré-condicionado (sobreposição de schwarz aditivo) (GMRES ou BiCG-Stab reiniciado) juntamente com uma correção de grade grossa (ou um multigrid) são escaláveis para esses tipo de matrizes.
fonte
O operador Matlab '\' é altamente eficiente devido à programação de alto nível. Você pode ver algumas das idéias e como elas usaram todos os atalhos possíveis no livro de Timothy Davis.
No matlab, você pode usar o gmres, que é bem desenvolvido e estável. Provavelmente os minres, que teoricamente deveriam ser ideais para o seu caso, podem não ser tão confiáveis (pelo menos, segundo minha experiência). Você deve obter eficiência igual ou superior a partir de matlab gmres se
Para sistemas ainda maiores, use uma ferramenta como o PETSc.
fonte
Se sua matriz tem dimensão em dezenas de milhares ou menos, use um método direto, embora não haja muitos métodos diretos disponíveis gratuitamente para sistemas simétricos indefinidos (na verdade, nenhum que eu saiba seja de código aberto). Existe o MA57 do HSL, mas é gratuito apenas para uso acadêmico. Você certamente pode ignorar a simetria e usar o UMFPACK .
Por volta das dezenas de centenas de dimensões, o uso de memória de um método direto começa a exceder o que razoavelmente um computador desktop pode suportar; portanto, a menos que você tenha uma máquina de memória compartilhada robusta, precisará passar para métodos iterativos. Para problemas indefinidos, você pode especializar BiCG (gradiente biconjugado) para sistemas simétricos, embora a quebra seja possível. Existe um MINRES-QLP lançado recentemente para sistemas simétricos, que fornece mais estabilidade numérica.
Os dois métodos requerem implementações bastante diferentes, pois para métodos diretos você realmente precisa formar a matriz, enquanto na abordagem iterativa, geralmente não forma a matriz explicitamente.
Existem várias razões pelas quais uma abordagem pode ser mais rápida que a outra, especialmente em função da dimensão da matriz. Para sistemas altamente condicionados, os métodos iterativos podem estagnar bastante. Para matrizes não tão esparsas, os métodos diretos acabam criando muito preenchimento, o que atrasa bastante as coisas. Além disso, os métodos diretos no Matlab são altamente otimizados (ele usa o UMFPACK ou o MA57 internamente), enquanto os métodos iterativos geralmente são codificados diretamente no Matlab, e há menos oportunidades para explorar o BLAS de nível 3, já que os gargalos são a aplicação de matvecs e produtos de ponto.
fonte