Estou resolvendo um problema físico usando esquema numérico implícito. Isso me leva a resolver uma equação linear com matriz tridiagonal. Eu codifiquei esse algoritmo da Wikipedia. Gostaria de saber se existe uma biblioteca eficiente que permita resolver esse tipo de equação de maneira otimizada. Uma observação importante é que a própria matriz muda apenas quando os parâmetros do sistema estão sendo alterados, por isso tive a oportunidade de pré-calcular algumas etapas do algoritmo para obter um bom bônus de desempenho. Eu estou usando C ++.
12
Respostas:
Você provavelmente deveria começar com a implementação do LAPACK,? Gtsv, por exemplo, dgtsv . Se você deseja uma versão com memória distribuída, pode começar com o p? Gtsv do ScaLAPACK.
EDIT: Como sua matriz não muda com muita frequência, você pode evitar fatorar redundantemente a matriz tridiagonal dividindo a rotina LAPACK? Gtsv na etapa de fatoração,? Gttrf, e o estágio de resolução,? Gttrs. Rotinas nomeadas da mesma forma existem no ScaLAPACK que atendem ao mesmo propósito.
fonte
Para sistemas paralelos distribuídos : eu não experimentei o ScaLAPACK, que possui um solucionador tridiagonal paralelo, para o qual existem exemplos disponíveis online . Tentei com algum sucesso um método proposto por David Moulton em uma publicação da LANL . Codificar isso pode ser mais do que você deseja fazer, mas usando o LAPACK, é um passo em frente.
fonte
Encontrei um algoritmo recursivo interessante aqui na página 975. Parece promissor, eu me pergunto o que as pessoas mais experientes dizem sobre isso.
fonte