Sua pergunta é como perguntar qual chave de fenda escolher, dependendo da unidade (slot, Phillips, Torx, ...): Além de haver muitas , a escolha também depende se você deseja apenas apertar um parafuso ou montar um conjunto inteiro de prateleiras da biblioteca. No entanto, em resposta parcial à sua pergunta, aqui estão alguns dos problemas que você deve ter em mente ao escolher um método para resolver o sistema linear . Também vou me restringir a matrizes invertíveis; os casos de sistemas super ou subdeterminados são uma questão diferente e devem realmente ser perguntas separadas.Ax=b
Como você observou corretamente, as opções 1 e 2 estão corretas: calcular e aplicar a matriz inversa é uma ideia tremendamente ruim, pois é muito mais cara e geralmente numericamente menos estável do que a aplicação de um dos outros algoritmos. Isso deixa você com a escolha entre métodos diretos e iterativos. A primeira coisa a considerar não é a matriz , mas o que você espera da solução numérica ˜ x :Ax~
- Quão preciso ele precisa ser? Does tem que resolver o sistema até precisão da máquina, ou você está satisfeito com ~ x satisfazendo (digamos) ‖ ~ x - x * ‖ < 10 - 3 , onde x * é a solução exata?x~x~∥x~−x∗∥<10−3x∗
- Quão rápido você precisa? A única métrica relevante aqui é a hora do relógio na sua máquina - um método que escala perfeitamente em um cluster enorme pode não ser a melhor opção se você não tiver uma dessas, mas você tem uma daquelas novas e brilhantes placas de Tesla.
Como não existe almoço grátis, você geralmente precisa decidir sobre uma troca entre os dois. Depois disso, você começa a examinar a matriz (e seu hardware) para decidir sobre um bom método (ou melhor, o método para o qual você pode encontrar uma boa implementação). (Observe como evitei escrever "melhor" aqui ...) As propriedades mais relevantes aqui sãoA
- A estrutura : é simétrica? É denso ou escasso? Unido?A
- Os autovalores : todos eles são positivos (isto é, é positivo)? Eles estão agrupados? Alguns deles têm magnitude muito pequena ou muito grande?A
Com isso em mente, você deve vasculhar a (enorme) literatura e avaliar os diferentes métodos encontrados para o seu problema específico. Aqui estão algumas observações gerais:
Se você realmente precisa (quase) da precisão da máquina para sua solução, ou se sua matriz é pequena (por exemplo, até linhas), é difícil vencer métodos diretos, especialmente para sistemas densos (pois, neste caso, toda multiplicação de matrizes será O ( n 2 ) e, se você precisar de muitas iterações, isso pode não estar muito longe do O ( n 3 ) que um método direto precisa). Além disso, a decomposição da LU (com pivô) funciona para qualquer matriz invertível, em oposição à maioria dos métodos iterativos. (Obviamente, se A for simétrico e positivo, você usaria Cholesky.)1000O(n2)O(n3)A
Isso também é válido para matrizes esparsas (grandes) se você não tiver problemas de memória: as matrizes esparsas em geral não têm uma decomposição de LU esparsa e, se os fatores não se encaixam na memória (rápida), esses métodos se tornam inutilizáveis.
Além disso, os métodos directos têm sido em torno de um longo período de tempo, e existe software de muito alta qualidade (por exemplo, UMFPACK, papeira, SuperLU para matrizes esparsas) que automaticamente pode explorar a estrutura de banda de .A
Se você precisar de menos precisão ou não puder usar métodos diretos, escolha um método de Krylov (por exemplo, CG se for simétrico positivo definido, GMRES ou BiCGStab, se não) em vez de um método estacionário (como Jacobi ou Gauss-Seidel): estes geralmente funcionam muito melhor, pois sua convergência não é determinada pelo raio espectral de A, mas pela (raiz quadrada) do número da condição e não depende da estrutura da matriz. No entanto, para obter um desempenho realmente bom com um método de Krylov, você precisa escolher um bom pré-condicionador para sua matriz - e isso é mais um ofício do que uma ciência ...AA
Se você precisar repetidamente resolver sistemas lineares com a mesma matriz e diferentes lados do lado direito, os métodos diretos ainda poderão ser mais rápidos que os métodos iterativos, pois você só precisará calcular a decomposição uma vez. (Isso pressupõe uma solução seqüencial; se você tiver todos os lados do lado direito ao mesmo tempo, poderá usar os métodos de Krylov do bloco).
Obviamente, estas são apenas diretrizes muito aproximadas: Para qualquer uma das declarações acima, provavelmente existe uma matriz para a qual o inverso é verdadeiro ...
Como você solicitou referências nos comentários, aqui estão alguns livros e documentos de revisão para você começar. (Nenhum desses - nem o conjunto - é abrangente; essa questão é muito ampla e depende muito do seu problema específico.)