Estou procurando uma solução explícita rápida (ouso dizer ideal?) Para o problema real linear 3x3, , .
Matrix é geral, mas próximo à matriz de identidade com um número de condição próximo a 1. Como são na verdade medições de sensores com cerca de 5 dígitos de precisão, não me importo de perder vários dígitos devido a números. problemas.
Obviamente, não é difícil encontrar uma solução explícita com base em vários métodos, mas se há algo que se mostrou ideal em termos de contagem de FLOPS, isso seria ideal (afinal, todo o problema provavelmente caberá nos registros FP).
(Sim, essa rotina é chamada com frequência . Eu já me livrei das frutas baixas e isso é o próximo na minha lista de perfis ...)
linear-solver
reference-request
Damien
fonte
fonte
Respostas:
Você não pode vencer uma fórmula explícita. Você pode anotar as fórmulas da solução em um pedaço de papel. Deixe o compilador otimizar as coisas para você. Qualquer outro método quase inevitavelmente terá instruções ou loops (por exemplo, para métodos iterativos) que tornarão seu código mais lento do que qualquer código de linha reta.x=A−1b
if
for
fonte
Como a matriz está tão próxima da identidade, as seguintes séries Neumann convergirão muito rapidamente:
Dependendo da precisão necessária, pode até ser bom o suficiente para truncar após 2 termos:
Isso pode ser um pouco mais rápido que uma fórmula direta (como sugerido na resposta de Wolfgang Bangerth), embora com muito menos precisão.
Você pode obter mais precisão com três termos:
mas se você escrever a fórmula entrada por entrada para , estará analisando uma quantidade comparável de operações de ponto flutuante como a fórmula inversa direta da matriz 3x3 (não é necessário faça uma divisão, o que ajuda um pouco).(3I−3A+A2)b
fonte
Os FLOPS contam com base nas sugestões acima:
LU, sem articulação:
Eliminação Gaussiana com substituição traseira, sem articulação:
Regra de Cramer via expansão de cofator
Inverso explícito e multiplique:
Prova de conceitos do MATLAB:
Regra de Cramer via expansão de cofator :
LU (sem rotação) e substituição traseira:
Inverso explícito e multiplicado:
Eliminação gaussiana:
Nota: sinta-se à vontade para adicionar seus próprios métodos e contagens a esta postagem.
fonte
Provavelmente a regra de Cramer. Se você pode evitar a rotação, talvez a fatoração da LU; é uma matriz 3x3, então seria fácil desenrolar os loops manualmente. Qualquer outra coisa provavelmente envolverá ramificação, e duvido que um método de subespaço de Krylov convergisse com frequência suficiente em 1 ou 2 iterações para que valesse a pena.
fonte