Métodos Iterativos: Jacobi e Gauss-Seidel
Objetivos de Aprendizagem
- Escrever as varreduras de Jacobi e Gauss-Seidel entrada a entrada e como splittings , e contar os flops de uma varredura numa matriz esparsa.
- Enunciar o teorema do raio espectral e as condições suficientes (dominância diagonal estrita, matriz simétrica definida positiva) com suas hipóteses, e mostrar o que acontece quando cada uma falta.
- Medir o fator de convergência a partir de uma execução e compará-lo com .
- Parar pelo resíduo sabendo o que ele diz e o que não diz sobre o erro, e achar o ponto em que o arredondamento encerra a iteração.
- Decidir, a partir de fill-in medido, contagem de varreduras e número de lados direitos, quando a iteração supera a fatoração e quando não supera.
Contexto e Motivação
lu-decomposition-and-partial-pivoting resolve um sistema denso em cerca de flops. Uma matriz esparsa não continua esparsa nesse processo: e ganham não zeros onde não tem, o chamado fill-in. Numa grade 3D com incógnitas, tem não zeros e seus fatores esparsos têm .
Uma iteração evita isso por completo. Ela toca só os não zeros existentes, guarda poucos vetores e pode parar assim que a resposta estiver boa o bastante. Jacobi não precisa de nada além da diagonal e do produto de por um vetor. O preço é que ela pode convergir devagar ou nem convergir, conforme a matriz. Jacobi e Gauss-Seidel são os dois métodos mais simples desse tipo, e suas condições de convergência mostram o tipo de análise que qualquer iteração exige.
Teoria Central
Duas varreduras
Resolva a equação para , supondo todo . Jacobi usa só valores antigos:
Gauss-Seidel usa cada valor novo assim que ele existe:
Jacobi precisa de dois vetores, ignora a ordem das equações e suas atualizações podem rodar ao mesmo tempo. Gauss-Seidel sobrescreve no próprio vetor, mas seus iterados dependem da ordem, e as atualizações são sequenciais, a menos que o padrão de esparsidade permita grupos de incógnitas independentes. Uma varredura de qualquer um deles numa matriz com nnz não zeros custa multiplicações, subtrações e divisões: flops.
O splitting
Escreva : a diagonal e as partes estritamente inferior e superior. Estes e são pedaços de , não os fatores de uma decomposição LU. Então
e cada método é . A solução de satisfaz , então subtrair dá e . Isso é fixed-point-iteration em dimensões, com no papel de .
O teorema de convergência
O raio espectral é o maior entre os autovalores de .
Hipóteses. é não singular e todo . Conclusão. A iteração converge para a partir de todo se e somente se .
Se então . Se , um ponto de partida cujo erro é autovetor desse autovalor nunca converge. Um ponto de sorte ainda pode funcionar, e é por isso que o teorema diz "todo". Assintoticamente o erro encolhe por a cada varredura, então reduzi-lo por leva cerca de varreduras. É uma taxa de longo prazo, não uma promessa para cada varredura.
Condições suficientes
Calcular pode ser tão difícil quanto o problema original, então testes mais simples importam.
- Dominância diagonal estrita por linhas: para todo . As somas das linhas de ficam então abaixo de 1, logo . Jacobi e Gauss-Seidel convergem a partir de qualquer ponto, e é automaticamente não singular. O mesmo vale com colunas no lugar de linhas.
- Dominância fraca com irredutibilidade, com desigualdade estrita em pelo menos uma linha, também basta. Isso cobre o problema-modelo do Exemplo 2.
- simétrica definida positiva: Gauss-Seidel converge a partir de qualquer ponto. Jacobi precisa de mais: também tem de ser definida positiva.
Tudo isso é suficiente, não necessário, e em geral nenhum dos dois métodos domina o outro (Exemplo 3).
Uma relação à parte não é teste nenhum: para tridiagonal com diagonal não nula, . Quando Jacobi converge, uma varredura de Gauss-Seidel vale então duas de Jacobi. Quando diverge, Gauss-Seidel também diverge, como mostra no Exemplo 3.
Parada, e o que o resíduo significa
A quantidade calculável é o resíduo , uma medida de erro reverso. O erro obedece a , o que dá
Um resíduo pequeno numa matriz mal condicionada pode, portanto, esconder um erro grande. Veja conditioning-and-numerical-stability. Limite também as varreduras, pois uma execução que diverge pode nunca disparar o teste.
Exemplos Resolvidos
Exemplo 1: um sistema estritamente dominante
A soma fora da diagonal dividida pela diagonal é , , por linha, então os dois métodos convergem, e sob Jacobi o erro cai por pelo menos a cada varredura na norma infinito. A partir de , uma varredura de Jacobi dá . Uma varredura de Gauss-Seidel dá , depois , depois . Uma execução em float64, com a norma infinito do erro:
textvarredura Jacobi Gauss-Seidel 1 6.000e-01 5.833e-01 4 1.389e-02 4.958e-04 8 2.277e-04 9.970e-08 12 2.168e-06 2.498e-12 16 3.527e-08 4.441e-16
Os autovalores dão e . Esses autovalores são complexos, então a razão entre varreduras oscila, e a medida certa é uma média geométrica: para Jacobi nas varreduras de 4 a 24 e para Gauss-Seidel nas varreduras de 2 a 12. As duas ficam abaixo do garantido. numpy.linalg.solve devolve o mesmo .
Exemplo 2: o problema-modelo e a taxa medida
A matriz tridiagonal com na diagonal e ao lado, de tamanho , vem de um problema de difusão 1D. Ela é só fracamente dominante, mas é irredutível, então os dois métodos convergem. Sua matriz de Jacobi tem . Para isso prevê para Jacobi e para Gauss-Seidel. Com solução exata , , e :
textvarredura erro Jacobi razao erro Gauss-Seidel razao 100 7.939e-01 0.998038 6.556e-01 0.996215 1000 1.435e-01 0.998103 2.153e-02 0.996210 2000 2.149e-02 0.998103 4.832e-04 0.996210 4000 4.823e-04 0.998103 2.433e-07 0.996210 8000 2.428e-07 0.998103 6.398e-14 0.996677
Os erros são relativos na norma 2, e a razão é . As razões medidas batem com a previsão em seis dígitos. Gauss-Seidel na varredura 1000 iguala Jacobi na varredura 2000, como diz . A razão na última linha é o arredondamento começando a interferir: o erro de Gauss-Seidel congela em na varredura 9000, enquanto numpy.linalg.solve obtém . Antes do congelamento o erro é o truncamento da iteração. Depois dele, mais varreduras não fazem nada.
O problema é a taxa. Reduzir o erro por leva cerca de 334 varreduras de Jacobi em , 28.554 em e em , crescendo como . Aqui um LU em banda resolve o sistema em flops, então iterar nessa matriz unidimensional é uma escolha ruim.
O teste do resíduo também se comporta como dito. Em o resíduo relativo cai abaixo de pela primeira vez na varredura 6722 em Jacobi e 3362 em Gauss-Seidel, com erro relativo nos dois. Com a cota permite . É uma cota, não uma estimativa.
Exemplo 3: o que cada hipótese faz
Cada execução toma ou , define e parte de zero.
| Matriz | O que falta | Medido a partir de | ||
|---|---|---|---|---|
| indefinido | indefinido | divisão por zero na primeira varredura; trocar as linhas resolve | ||
| dominância | os dois divergem | |||
| nada | as mesmas equações reordenadas: os dois convergem | |||
| definida positiva | definida positiva, mas o erro de Jacobi é na varredura 40; o de Gauss-Seidel é | |||
| dominância | Jacobi é exato depois de 3 varreduras (); o erro de Gauss-Seidel é na varredura 12 | |||
| dominância | os dois convergem: dominância não é necessária |
Logo, nenhum método é sempre melhor, e a ordem das linhas pode decidir tudo. A linha com também alerta para a leitura assintótica no sentido oposto. Tome menos na superdiagonal, , com só de uns e . Jacobi tem e fica exato na varredura 30, mas antes o erro cresce até na varredura 29. decide o limite, não o caminho.
Exemplo 4: quando a iteração supera a fatoração
Cada linha abaixo compara scipy.sparse.linalg.splu (uma fatoração e uma solução, resíduo relativo perto de ) com Jacobi rodado a partir de zero até um resíduo relativo de . As três primeiras linhas usam x = default_rng(0).standard_normal(n) e b = A @ x. A contagem de varreduras depende de : na primeira matriz, cinco outros lados direitos deram de 18.188 a 28.555 varreduras. A última linha resolve o sistema do PageRank abaixo e para em . Os tempos são de uma execução numa máquina, e só a ordem de grandeza importa. As precisões diferem, então isto compara Jacobi com seis dígitos e LU com precisão total.
textproblema n nnz(A) nnz(L+U) splu varred. Jacobi Poisson 2D, 100x100 10,000 49,600 6.5e+05 0.03 s 14,905 1.1 s Poisson 3D, 40x40x40 64,000 438,400 9.6e+07 31 s 3,282 2.8 s I + Poisson 2D, 500x500 250,000 1.25e+06 2.9e+07 1.5 s 52 0.3 s PageRank, grafo aleatorio 20,000 219,946 2.7e+08 670 s 18 0.004 s
Poisson 2D: a fatoração vence. Os fatores esparsos são só 13 vezes mais densos que , e Jacobi precisa de dezenas de milhares de varreduras porque conforme a grade se refina. Ser grande e esparsa, sozinho, não é motivo para iterar.
Poisson 3D: o fill-in decide. Os fatores são 218 vezes mais densos que , e isso cresce rápido com a grade, então até uma iteração lenta vence.
Um passo de difusão implícita: não depende de . Somar a identidade à matriz de Poisson 2D faz a diagonal valer e a soma fora da diagonal valer no máximo , então em qualquer grade. Jacobi levou 52 varreduras nas grades , e , então seu custo total é linear em . Partindo da solução anterior, depois de uma pequena mudança no lado direito, levou 23 na maior grade. Este é o caso bom para a iteração: diagonal dominante e um bom chute inicial.
PageRank é Jacobi. A atualização de pagerank-via-power-iteration é exatamente a varredura de Jacobi para quando nenhuma página aponta para si mesma, porque então . Com estocástica por colunas, , o que garante um fator de por varredura para qualquer . Neste grafo (10 links aleatórios por página) o fator medido foi , e foram 18 varreduras em , e , cada uma com flops. Um LU denso em custaria flops, e o esparso acima teve 1.200 vezes mais não zeros que .
Muitos lados direitos favorecem a fatoração. Depois do splu na grade , cada nova solução levou s, enquanto 23 varreduras no ritmo acima levam cerca de s, então a fatoração se paga quando chegam lados direitos suficientes.
Livro vs hoje
Jacobi e Gauss-Seidel puros raramente são o solver final hoje. No problema 2D acima, scipy.sparse.linalg.cg (para simétrica definida positiva) precisou de 187 iterações contra 14.905 de Jacobi com o mesmo , e de 91 contra 3.282 no 3D. Sua contagem também varia com : de 1 a 256 naqueles cinco outros lados direitos. Métodos de Krylov e multigrid assumiram o posto, e essas varreduras sobrevivem dentro deles como precondicionadores e suavizadores. No problema-modelo com , cinco varreduras de Gauss-Seidel deixam do modo de erro de frequência mais alta e do mais suave, o comportamento que um ciclo de multigrid explora. Cinco varreduras de Jacobi puro deixam dos dois, porque seus autovalores nas duas pontas têm o mesmo tamanho, e por isso um multigrid baseado em Jacobi usa uma variante amortecida.
Equívocos Comuns e Armadilhas
- "Dominância diagonal é obrigatória." Ela é suficiente. A última linha do Exemplo 3 converge sem ela, e o Exemplo 2 só tem dominância fraca.
- "Gauss-Seidel é sempre mais rápido que Jacobi." O Exemplo 3 tem uma matriz em que Jacobi termina em 3 varreduras e Gauss-Seidel diverge.
- "Definida positiva significa que Jacobi funciona." Essa garantia é de Gauss-Seidel. O Exemplo 3 tem numa matriz definida positiva.
- " significa que o erro cai a cada varredura." O caso final do Exemplo 3 cresce por um fator de antes.
- "A iteração vence em qualquer matriz grande e esparsa." Em Poisson 2D,
splufoi cerca de 40 vezes mais rápido que Jacobi, e com muito mais precisão. - "Mais varreduras, mais dígitos." O Exemplo 2 congela em .
- "Resíduo pequeno significa erro pequeno." Só a menos de um fator .
- "Estes e são os fatores LU." São os triângulos estritos da própria .
Resumo
Jacobi resolve cada equação com valores antigos, e Gauss-Seidel usa os novos na hora. Os dois são com erro , então, com não singular e diagonal não nula, convergem a partir de todo ponto exatamente quando , a cerca de por varredura no longo prazo. A dominância diagonal estrita garante os dois, a definição positiva garante Gauss-Seidel, e a estrutura tridiagonal dá , medido aqui com seis dígitos. Nada disso é necessário, e nenhum método sempre vence. Uma varredura custa flops, então a iteração vence quando o fill-in é severo ou quando fica longe de 1 conforme cresce, como em passos implícitos e no PageRank, e perde na matriz de Poisson 2D e com muitos lados direitos. O arredondamento impõe um piso perto de no Exemplo 2, e o resíduo limita o erro só por meio de .
Documentation Links
- Barrett et al. (1994): Templates for the Solution of Linear Systems, Stationary Iterative Methods
- Barrett et al. (1994): Templates for the Solution of Linear Systems, Convergence of the Jacobi method
- Barrett et al. (1994): Templates for the Solution of Linear Systems, The Gauss-Seidel Method
- Saad (2003): Iterative Methods for Sparse Linear Systems, 2nd ed.
- Driscoll and Braun: Fundamentals of Numerical Computation, 8.1 Sparsity and structure
- Driscoll and Braun: Fundamentals of Numerical Computation, 8.6 MINRES and conjugate gradients
- SciPy documentation: scipy.sparse.linalg.splu
- SciPy documentation: scipy.sparse.linalg.cg