Introdução aos Métodos Numéricos Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho
Conteúdo específico Sistemas de Equações Lineares Métodos Iterativos
Conteúdo temático Método de Gauss-Seidel
Gauss-Seidel Método de Gauss-Seidel Partiremos novamente do sistema original usando a decomposição aditiva que apresentamos, ou seja, e reescrevendo como A x= b ( D+M + N x= b ( D+N x= M x+ b
Gauss-Seidel Suporemos que a matriz associada ao sistema está arrumada de tal forma que a matriz D + N tenha inversa Então podemos escrever x= ( D+N 1 M x+( D+N 1 b A matriz ( D+N 1 M é denominada Matriz de Gauss-Seidel
Gauss-Seidel Podemos escrever este método como x i+1 = ( D+ N 1 M x i + ( D+N 1 b mas não o faremos pois há uma maneira mais interessante de escrevê-lo
Gauss-Seidel Podemos escrever este método como x i+1 = ( D+ N 1 M x i + ( D+N 1 b mas não o faremos pois há uma maneira mais interessante de escrevê-lo Retornemos uma pouco
Gauss-Seidel Partiremos novamente do sistema original usando a decomposição aditiva que apresentamos, ou seja, e reescrevendo: A x= b ( D+M + N x= b ( D+N x= M x+ b
Gauss-Seidel Aplicaremos a fórmula iterativa diretamente aqui, ou seja, e daí ( D+N x i+1 = M x i + b D x i+1 = N x i+1 M x i + b
Gauss-Seidel Supondo novamente existir uma ordenação do sistema tal que D tenha inversa, teremos x i+1 = D 1 N x i+1 D 1 M x i +D 1 b que descreve a iteração que define o Gauss-Seidel
Gauss-Seidel Gauss-Seidel dado x 0 x i+1 = D 1 N x i+1 D 1 M x i +D 1 b
Métodos iterativos Compare as fórmulas de Gauss-Jacobi Gauss-Seidel x i+1 = D 1 ( M +N x i + D 1 b x i+1 = D 1 N x i+1 D 1 M x i +D 1 b Observe que a matriz e o vetor operadores são os mesmos mas usados de forma diferente
Métodos iterativos Assim, podemos usar o mesmo algoritmo de construção de montagem mas dividindo a matriz resultante em sua parte triangular estritamente superior e estritamente inferior
Gauss-Seidel Vamos ao pseudocódigo de Gauss-Seidel
Gauss-Seidel Arrumação da matriz para i 1 até n diag a ii para j 1 até n a ij a ij /diag b i b i /diag a ii 0
Gauss-Seidel Laço de repetição do Método de Gauss-Seidel para k 1 até niteracoes para i 1 até n s 0 para j 1 até n s s+a ij x j x i s+b i
Gauss-Seidel Laço de repetição do Método de Gauss-Seidel para k 1 até niteracoes para i 1 até n s 0 para j 1 até n s s+a ij x j x i s+b i Observe que não temos a necessidade de um vetor auxiliar
Gauss-Seidel No cálculo manual usaremos um esquema mais humano É apenas um esquema, nem o melhor, nem o pior
( 8 1 0 1 1 9 1 0 1 2 10 0 0 1 1 12 Partiremos para a construção do método x 13/2 8 3 5
Dividamos todo o sistema pelos valores da diagonal ( 8/8 1/8 0/8 1/8 1/9 9/9 1/9 0/9 ; 1/10 2/10 10/10 0/10 0/12 1/12 1/12 12/12 ((13/2/8 8/9 3/10 5/12
Zere a diagonal da matriz ( 0 1/8 0 1/8 1/9 0 1/9 0 1/10 1/5 0 0 0 1/12 1/12 0 ; 13/16 8/9 3/10 5/12 (
Troque o sinal dos valores da matriz ( 0 1/ 8 0 1/8 1/9 0 1/9 0 1/ 10 1/5 0 0 0 1/12 1/12 0 ; 13/16 8/9 3/10 5/12 (
Método de Gauss-Seidel x i+1 = D 1 N x i+1 D 1 M x i +D 1 b 1/9 0 0 0 x i+1 1/10 1/5 0 0 x 0 1/12 1/12 0 i+1+( 0 1/8 0 1/8 0 0 1/ 9 0 x i +( 13/16 8/ 9 3/10 5/12
Usaremos o mesmo vetor que usamos no exemplo de Gauss- Jacobi, mesmo sabendo que é bem ruim como inicialização 1 x 4 0 3 5
Usaremos o mesmo vetor que usamos no exemplo de Gauss- Jacobi, mesmo sabendo que é bem ruim como inicialização 1 x 4 0 3 5 Para facilitar a compreenção, trabalharemos a passos de tartaruga calculando uma componente por vez
ATENÇÃO! Como é uma versão em passos de tartaruga não é a que se usará em exercícios ou na prova nem é usado num cálculo real É apenas usada para compreender alguns passos do algoritmo
x 0 1 4 3 5 1/9 0 0 0 x 1 x 1/10 1/5 0 0 0 1/12 1/12 0 +( 0 1 1/8 0 1/8 0 0 1/ 9 0 x 0 +( 13/16 8/9 3/10 5/12 Ao multiplicarmos a primeira linha da primeira matriz multiplicarmos a primeira matriz pelo vetor x 1 teremos um valor nulo e a segunda matriz por se faz diretamente x 0
x 0 1 4 3 5 1/9 0 0 0 x 1 x 1/10 1/5 0 0 0 1/12 1/12 0 +( 0 1 1/8 0 1/8 0 0 1/ 9 0 x 0 +( 13/16 8/9 3/10 5/12 Ao multiplicarmos a primeira linha da primeira matriz multiplicarmos a primeira matriz pelo vetor x 1 teremos um valor nulo e a segunda matriz por se faz diretamente x 0 Deixando um pouco mais claro
x 0 1 4 3 5 +( 1/9 0 0 0 x 1 x 1/10 1/5 0 0 1 0 1/12 1/12 0 0 1/8 0 1/8 +( 0 0 1/ 9 0 x 0 [0]+[ 1/8 4+0 ( 3+1/8 5]+13/16 x 1 15/16 13/16 8/ 9 3/10 5/12 0,9375
O primeiro par de colchetes indica o valor resultante do cálculo da primeira linha da primeira matriz pelo vetor x 1
O primeiro par de colchetes indica o valor resultante do cálculo da primeira linha da primeira matriz pelo vetor x 1 Claro que este cálculo sempre dará zero em todas as iterações
O primeiro par de colchetes indica o valor resultante do cálculo da primeira linha da primeira matriz pelo vetor x 1 Claro que este cálculo sempre dará zero em todas as iterações O segundo colchete indica os cálculos para a segunda matriz
O resultado deste cálculo nos dá a primeira componente de que marcaremos em negrito Então podemos escrever x 1
x 0 1 4 3 5 x 1 +( 1/9 0 0 0 x 1 x 1/10 1/5 0 0 1 0 1/12 1/12 0 0 1/8 0 1/8 +( 0 0 1/ 9 0 x 0 [0]+[ 1/8 4+0 ( 3+1/8 5]+13/16 [ 1/ 9 15/ 16]+[ 1/ 9 ( 3+0 5] 8/9 15 / 16 95/144 13/16 8/ 9 3/10 5/12 0,9375 0,6597 22
Métodos iterativos Temos agora a primeira e a segunda componentes de Da mesma forma que escreveremos antes x 1
x 0 1 4 3 5 1/9 0 0 0 x 1 x 1/10 1/5 0 0 0 1/12 1/12 0 +( 0 1 1/8 0 1/8 0 0 1/ 9 0 x 0 +( 13/16 8/ 9 3/10 5/12 x 1 [0]+[ 1/ 8 4 +0 ( 3+1/8 5]+13/16 [ 1/9 15/ 16]+[ 1/9 ( 3+0 5] 8/9 [1/10 15/ 16 1/5 ( 95 / 144]+[0 5] 3/10 15/ 16 95 / 144 107/1440 0,07430 55 0,9375 0,6597 22
x 0 1 4 3 5 1/9 0 0 0 x 1 x 1/10 1/5 0 0 0 1/12 1/12 0 +( 0 1 1/8 0 1/8 0 0 1/ 9 0 x 0 +( 13/16 8/ 9 3/10 5/12 [0]+[ 1/8 4+0 ( 3+1/8 5]+13/16 15/ 16 0,9375 [ 1/9 15/ 16]+[ 1/9 ( 3+0 5] 8/9 x 95 / 144 0,6597 22 1 [1/10 15 / 16 1/5 ( 95/ 144]+[0 5] 3/10 107 / 1440 0,07430 55 [0 15 / 16 1/ 12 ( 95 /144 1/12 ( 107 / 1440]+[0]+5 /12 8257/ 17280 0,477835
Sim, concordo, exagerei nas frações
Repare que você pode compreender este algoritmo como algo da forma se eu tenho (uma componente nova eu uso
Façamos o próximo passo
0 +( 1/ 9 0 0 0 x 2 x 1/10 1/ 5 0 0 2 0 1/12 1/12 0 1/8 0 1/8 0 0 1/ 9 0 x ( 1 + 13/16 8/9 3/10 5/12 22+1/8 0,477835]+13/16 x 2 [0]+[ 1/8 ( 95/144+0 ( 0,07430 0,954694 15/16 x 95/ 144 1 0,07430 22 0,477835
0 +( 1/9 0 0 0 x 2 x 1/10 1/5 0 0 2 0 1/12 1/12 0 1/8 0 1/8 0 0 1/9 0 x ( 1 + 13/16 8/9 3 /10 5/12 22+1/8 0,477835]+13/16 x 2 [0]+[ 1/8 ( 95/144+0 ( 0,07430 [ 1/9 0,954694]+[ 1/ 9 ( 0,074305+0 0,477835] 8/9 0,954694 0,986709 15/16 x 95/ 144 1 0,07430 22 0,477835
15/16 x 95/ 144 1 0,07430 22 0,477835 0 1/9 0 0 0 x 2 x 1/10 1/5 0 0 0 1/12 1/12 +( 0 2 1/8 0 1/8 0 0 1/9 0 x ( 1 + 13/16 8/9 3 /10 5/12 22+1/8 0,477835]+13/16 x 2 [0]+[ 1/8 ( 95/144+0 ( 0,07430 [ 1/9 0,954694]+[ 1/ 9 ( 0,074305+0 0,477835] 8/9 [1/10 0,954694 1/5 ( 0,986709+0 0,477835 3 /10] 0,954694 0,986709 0,007188
15/16 x 95/ 144 1 0,07430 22 0,477835 0 1/9 0 0 0 x 2 x 1/10 1/5 0 0 0 1/12 1/12 +( 0 2 1/8 0 1/8 0 0 1/9 0 x ( 1 + 13/16 8/9 3 /10 5/12 [0]+[ 1/8 ( 95/144+0 ( 0,07430 22+1/8 0,477835]+13/16 0,954694 x [ 1/ 9 0,954694]+[ 1/ 9 ( 0,074305+0 0,477835] 8/9 0,986709 2 [1/10 0,954694 1/5 ( 0,986709+0 0,477835] 3/10 0,007188 [0 0,954694 1/12 ( 0,986709 1/12 ( 0,007188]+[0]+5 /12 0,499491
Avaliemos a evolução dos vetores obtidos ( 0,954694 x 2 x 0,986709 22 1 0,007188 0,499491 ( 0,9375 0,6597 22 0,074305 0,477835 0,017194 0,2152 0,067117 0,021656 x 2 x 1 0,2152 max x 1 max =0,9375 x 2 x 1 max x 1 max 0,2295
Observe que o valor obtido aqui é bem menor que no mesmo passo de aplicação de Gauss-Jacobi
Façamos mais um passo do método de Gauss-Seidel
0 +( 1/9 0 0 0 x 3 x 1/10 1/5 0 0 3 0 1/12 1/12 0 1/8 0 1/8 +( 0 0 1/9 0 x 2 13/16 8/9 3/10 5/12 x 3 [0]+[ 1/8 ( 0,954694+0 ( 0,007188+1/8 0,499491]+13/16 x 2 0,998275 0,954694 0,986709 0,007188 0,499491
0 +( 1/9 0 0 0 x 3 x 1/10 1/5 0 0 3 0 1/12 1/12 0 1/8 0 1/8 +( 0 0 1/9 0 x 2 13/16 8/9 3/10 5/12 x 3 [0]+[ 1/8 ( 0,954694+0 ( 0,007188+1/8 0,499491]+13/16 [ 1/ 9 0,998275]+[ 1/ 9 ( 0,007188+0 0,499491] 8/ 9 x 2 0,998275 0,999009 0,954694 0,986709 0,007188 0,499491
x 2 0,954694 0,986709 0,007188 0,499491 0 1/9 0 0 0 x 3 x 1/10 1/5 0 0 0 1/12 1/12 +( 0 3 1/8 0 1/8 0 0 1/9 0 x 2 +( 13/16 8/9 3/10 5/12 x 3 [0]+[ 1/8 ( 0,954694+0 ( 0,007188+1/8 0,499491]+13/16 [ 1/ 9 0,998275]+[ 1/ 9 ( 0,007188+0 0,499491] 8/ 9 [1/10 0,998275 1/5 ( 0,999009+0 0,499491] 3/10 0,998275 0,999009 0,000370
x 2 0,954694 0,986709 0,007188 0,499491 0 1/9 0 0 0 x 3 x 1/10 1/5 0 0 0 1/12 1/12 +( 0 3 1/8 0 1/8 0 0 1/9 0 x 2 +( 13/16 8/9 3/10 5/12 /16 x 3 [0]+[ 1/8 ( 0,954694+0 ( 0,007188+1/8 0,499491]+13 [ 1/ 9 0,998275]+[ 1/ 9 ( 0,007188+0 0,499491] 8/9 [1/10 0,998275 1/ 5 ( 0,999009+0 0,499491] 3 /10 [0 0,998275 1/ 12 ( 0,999009 1/12 ( 0,000370]+[0]+5/12 0,998275 0,999009 0,000370 0,499948
Avaliemos a evolução dos vetores ( ( 0,998275 0,954694 0,0435 x 3 x 0,999009 0,986709 0,0123 2 x 3 x 2 0,000370 0,007188 0,0068 0,0435 max 0,499948 0,499491 0,000457 x 2 max =0,986709 x 3 x 2 max x 2 max 0,0440
Novamente observe que o valor obtido aqui é bem menor que no mesmo passo de aplicação de Gauss-Jacobi
Vamos a mais uma iteração sem passo de tartaruga
x 3 0,998275 0,999009 0,000370 0,499948 0 1/ 9 0 0 0 x 4 x 1/10 1/5 0 0 0 1/12 1/12 +( 0 4 1/8 0 1/8 0 0 1/ 9 0 x ( 3 + 13 /16 8/ 9 3 /10 5/12 x 4 [0]+[ 1/8 ( 0,999009+0 ( 0,000370+1/8 0,499948]+13/16 [ 1/9 0,999869]+[ 1/ 9 ( 0,000370+0 0,499948] 8 /9 [1/10 0,999869 1/ 5 ( 0,999944+0 0,499948] 3/10 [0 0,999869 1/12 ( 0,999944 1/12 ( 0,000024]+[0]+5 /12 0,999869 0,999944 0,000024 0,4999973
Avaliemos a evolução dos vetores ( 0,999869 0,998275 ( 0,0015 x 4 x 0,999944 0,999009 0,0004 3 x 4 x 3 0,000024 0,000370 0,0003 0,0015 max 0,4999973 0,499948 0,00004 x 3 max 0,999009 x 4 x 3 max x 3 max 0,0015
A solução exata do sistema é e observem a sequência de vetores x 1 1 0 1/2 0,9375 0,954694 0,998275 0,999869 x 0,6597 22 1 ; x 0,986709 2 ; x 0,999009 3 ; x 0,999944 4 0,074305 0,007188 0,000370 0,000024 0,477835 0,499491 0,499948 0,4999973
e os valores da avaliação se aproximam de zero mais rapidamente x 2 x 1 max x 1 max 0,2295 ; x 3 x 2 max x 2 max 0,0440; x 4 x 3 max x 3 max 0,0015
x i+1 Repare que cada componente de cada não pode ser calculada independentemente uma das outras como em Gauss-Jacobi portanto, o algoritmo de Gauss-Seidel não é facilmente paralelizável Isto gera implicações que devem ser levadas em consideração quando da construção de códigos eficientes
Métodos iterativos Em todos os exercícios até agora feito o custo computacional execedeu o custo computacional usando, por exemplo, fatoração LU Porque então usar estes métodos iterativos?
Métodos iterativos Um motivo já foi dito: Estes métodos são, quando convergem, numericamente estáveis Outro motivo: Existem sistemas de interesse (em geral de ordem grande que tem efetivamente custo computacional menor quando usados com métodos iterativos
Mais um exercício sem ser em passo de tartaruga
Gauss-Seidel Outro exemplo Aplique no sistema abaixo o método de Gauss-Seidel até o critério de parada for menor que 0,01 ( 6 2 3 1 4 2 x= ( 4 5 1 2 4 7 Temos a informação que a solução é próxima do vetor ( 0 0 2
Gauss-Seidel Outro exemplo Construindo a matriz e o vetor para Gauss-Seidel ( 6 2 3 1 4 2 ; ( 4 5 1 2 4 7 ( 0 2/6 3/ 6 1/ 4 0 2/ 4 1/ 4 2/4 0 ; ( ( 0 1/3 1/2 1/ 4 0 1/2 ; ( 7/ 4 1/ 4 1/2 0 4/6 5/ 4 2/3 5/4 7/ 4 e montando a fórmula 0 0 0 x i+1 1/4 0 0 x 1/ 4 1/2 0 i+1+( 0 1/3 1/2 0 0 1/2 0 0 0 x i+ ( 2/3 5/4 7/4
Gauss-Seidel Outro exemplo 0 0 0 0 x i+1 1/ 4 0 0 i+1+( 0 1/3 1/2 x 0 0 1/2 1/ 4 1/2 0 0 0 x i+ ( 2/3 5 /4 7/4 Tendo x 0= ( 0 0 2 x 1= ( [0]+[ 1/3 0 1/2 2]+2/3 [1/ 4 ( 1/3]+[1/2 2] 5/4 = ( 1/3 1/3 = ( 0, 33 0, 33 [ 1/ 4 ( 1/3 1/2 ( 1/3]+[0]+7/ 4 2 2
Gauss-Seidel Outro exemplo Qual o significado das primeiras componentes darem iguais e a última repetir o chute?
Gauss-Seidel Outro exemplo Qual o significado das primeiras componentes darem iguais e a última repetir o chute? Nenhum
Gauss-Seidel Outro exemplo 0 0 0 0 x i+1 1/ 4 0 0 i+1+( 0 1/3 1/2 x 0 0 1/2 1/ 4 1/2 0 0 0 x i+ ( 2/3 5 /4 7/4 Tendo x 1= ( 1/3 1/3 2 [0]+[ 1/ 3 ( 1/3 1/ 2 (2]+2/ 3 x 2 [1/ 4 ( 2/9]+[1/2 2] 5/ 4 = ( 2/9 11/36 [ 1/4 ( 2/9 1/2 ( 11/36]+[0]+7/ 4 47/24 = ( 0,22 0,30 55 1,958 33
Gauss-Seidel Outro exemplo Avaliemos a evolução dos vetores x 2 x 1= ( 0, 22 0,30 55 ( 0, 33 0, 33 ( 1,958 33 2 0,11 0,02 77 0,04166 x 2 x 1 max 0,1111 x 1 max =2 x 2 x 1 max x 1 max 0,0555
Gauss-Seidel Outro exemplo Tendo x 2= ( 2/9 11/36 47/24 0 0 0 0 x i+1 1/ 4 0 0 i+1+( 0 1/3 1/2 x 0 0 1/2 1/ 4 1/2 0 0 0 x i+ ( 2/3 5 /4 7/4 [0]+[ 1/3 ( 11/36 1/2 47 /24 ]+2/3 x 3 [1/ 4 ( 91/ 432]+[1/2 47/ 24] 5/ 4 = ( 91/ 432 559/ 1728 [ 1/4 ( 91/432 1/2 ( 559/1728]+[0]+7/ 4 ( 0,210648 0,323495 2263/1152 1,964409
Gauss-Seidel Outro exemplo Avaliemos a evolução dos vetores x 3 x 2= ( 0,210648 0,323495 1,964409 ( 0, 22 0,30 55 1,958 33 ( 0,011574 0,017939 0,006075 x 3 x 2 max 0,0179 x 2 max =1,958333 x 3 x 2 max x 2 max 0,0091
Gauss-Seidel Outro exemplo Já atingimos o solicitado mas vamos a mais um passo só para treinar
Gauss-Seidel Outro exemplo 0 0 0 x x+1 1/ 4 0 0 i+1+( 0 1/3 1/2 x 0 0 1/2 1/4 1/2 0 0 0 0 x i+ ( 2/3 5/ 4 7 /4 Tendo x 3= ( 0,210648 0,323495 1,964409 x 4 [0]+[ 1/3 ( 0,323495 1/2 1,964409]+2/3 [1/ 4 ( 0,207706]+[1/2 1,964409] 5/ 4 ( 0,207706 0,319721 [ 1/ 4 ( 0,207706 1/2 ( 0,319721]+[0]+7/ 4 1,961787
Gauss-Seidel Outro exemplo Avaliemos a evolução dos vetores x 4 x 3= ( 0,207706 0,319721 ( 0,210648 0,323495 ( 1,961787 1,964409 0,002942 0,003774 0,002622 x 4 x 3 max 0,0037 x 3 max =1,964409 x 4 x 3 max x 3 max 0,0018