Métodos Iterativo em
Álgebra Linear
Prof. Jairo Ramalho
E-mail: [email protected]
Método de Jacobi
Dado um sistema linear, como por exemplo:
10x1 – x2 + 2x3
= 6
–x1 + 11x2 – x3 + 3x4 = 25
2x1 – x2 + 10x3 – x4 = -11
3x2 – x3 + 8x4 = 15
No método de Jacobi, isolamos a variável xk na k-ésima equação
(contanto que seu coeficiente seja diferente de zero):
x1 =
(1/10)x2 – (1/5)x3 +
3/5
x2 = (1/11)x1 +
(1/11)x3 – (3/11)x4 + 25/11
x3 = –(1/5)x1 +(1/10)x2
+ (1/10)x4 – 11/10
x4=
– (3/8)x2 + (1/8)x3 +
15/8
E obtemos o sistema iterativo:
0  x1k   3 / 5 
1 / 10  1 / 5
 x1k 1   0
 k 1  

 k  
1 / 11  3 / 11 x2   25 / 11 
0
 x2   1 / 11


 x k 1     1 / 5 1 / 10
k  


10
/
11

10
/
1
0
x
 3  

 3  


k  

 x k 1   0
8
/
15
0
8
/
1
8
/
3

x

 4  
 4  
Fazemos então um “chute” inicial para a solução, como, por exemplo,
x0 = (0,0,0,0)T, e calculamos o vetor solução x1 através de:
 x11   0
1 / 10  1 / 5
0  0   3 / 5 
 1 
  

0
1 / 11  3 / 11 0   25 / 11 
 x2   1 / 11

 x1     1 / 5 1 / 10



0
1 / 10 0
 11/ 10
3
  
  






 x1   0

3
/
8
1
/
8
0
0
15
/
8






 4
Obtido x1 = (0,6; 2,273; -1,1; 1,875)T, calculamos x2 via:
 x12   0
1 / 10  1 / 5
0  0,6   3 / 5 
 2 

 

0
1 / 11  3 / 11 2,273  25 / 11 
 x2   1 / 11

 2     1 / 5 1 / 10




0
1
/
10

1
,
1

11
/
10
x
 3 

 






 x2   0

3
/
8
1
/
8
0
1
,
875
15
/
8






 4
Continuando o procedimento, vamos obter:
x3 = (0,933; 2,053; -1,049; 1,131)T
...
x9 = (0,999; 2,000; -1,000; 1,000)T
x10 = (1,000; 2,000; -1,000; 1,000)T
E, em dez passos, o método converge para a solução exata.
Em termos matriciais, saímos do sistema Ax = b
10x1 – x2 + 2x3
= 6
–x1 + 11x2 – x3 + 3x4 = 25
2x1 – x2 + 10x3 – x4 = -11
3x2 – x3 + 8x4 = 15
 10  1 2 0  x1   6 

  

  1 11  1 3  x2   25 
 2  1 10  1 x     11

 3  

 0 3  1 8  x   15 

 4  

Para o sistema x = Tx + c
x1 =
(1/10)x2 – (1/5)x3 +
3/5
x2 = (1/11)x1 +
(1/11)x3 – (3/11)x4 + 25/11
x3 = –(1/5)x1 +(1/10)x2
+ (1/10)x4 – 11/10
x4=
– (3/8)x2 + (1/8)x3 +
15/8
1 / 10  1 / 5
0  x1   3 / 5 
 x1   0
  
  

0
1 / 11  3 / 11 x2   25 / 11 
 x2   1 / 11

 x     1 / 5 1 / 10



0
1 / 10 x3
 11/ 10
3
  
  



x   0


 3 / 8 1/ 8
0  x4   15 / 8 
 4 
Em termos matriciais, saímos do sistema Ax = b
10x1 – x2 + 2x3
= 6
–x1 + 11x2 – x3 + 3x4 = 25
2x1 – x2 + 10x3 – x4 = -11
3x2 – x3 + 8x4 = 15
 10  1 2 0  x1   6 

  

  1 11  1 3  x2   25 
 2  1 10  1 x     11

 3  

 0 3  1 8  x   15 

 4  

Para o sistema x = Tx + c
x1 =
(1/10)x2 – (1/5)x3 +
3/5
x2 = (1/11)x1 +
(1/11)x3 – (3/11)x4 + 25/11
x3 = –(1/5)x1 +(1/10)x2
+ (1/10)x4 – 11/10
x4=
– (3/8)x2 + (1/8)x3 +
15/8
Ou, em termos de fórmulas (para aii ≠ 0) :
n
aij x j
bi
xi   (
)  , i  1,2,...,n
aii
aii
j 1
j i
n: número de equações
Método de Jacobi
Mais ainda, colocando iterativamente:
n
bi   aij x kj
k 1
xi

j 1
j i
aii
, i  1,2,...,n
Onde xi0 é uma aproximação inicial dada.
Algoritmo: Método de Jacobi
Dados de Entrada. Matriz: A, vetores: b, x0, número de equações: n,
tolerância: tol, número máximo de iterações: Nmax.
cont = 1
Enquanto cont ≤ Nmax Faça
Para i = 1 até n, passo 1, Faça
soma = 0
Para j=1 até i-1, passo 1, Faça
soma = soma + A( i, j )*x0( j )
Para j=i+1 até n, passo 1, Faça
soma = soma + A( i, j )*x0( j )
x( i ) = [ b( i ) – soma ] / A( i, i )
Se || x – x0 || < tol
Retornar x
Sair
Senão
x0 = x
cont = cont + 1
Algoritmo: Método de Jacobi
Observações.
1) Antes de começar o algoritmo, é preciso checar se os aii (elementos da
diagonal) são diferentes de zero. Se isso ocorrer e a matriz A for nãosingular, basta fazer troca de linhas.
2) Se possível, o ideal é fazer troca de linhas de modo a colocar nas
diagonais os maiores valores possíveis (reduzindo erros de
arredondamento).
Método de Gauss-Seidel
Observando o método de Jacobi
x1k+1 =
(1/10)x2k – (1/5)x3k +
3/5
x2k+1 = (1/11)x1k +
(1/11)x3k – (3/11)x4k + 25/11
x3k+1 = –(1/5)x1k +(1/10)x2k
+ (1/10)x4k – 11/10
x4k+1=
– (3/8)x2k + (1/8)x3k +
15/8
Se este é convergente, então, uma possível melhoria na sua eficiência
computacional pode ser obtida notando-se que as componentes de
xk+1 que já foram calculadas podem ser aproximações melhores do
que seus valores no passo k.
Essa é a idéia do Método de Gauss-Seidel. Isto é: acelerar a
convergência calculando xik+1 usando os valores x1k+1, x2k+1,..., xi-1k+1
que já foram calculados, ao invés de seus valores no passo anterior.
Método de Gauss-Seidel
Exemplo:
Contrastando os dois métodos, no método de Jacobi fazemos:
x1k+1 =
(1/10)x2k – (1/5)x3k +
3/5
x2k+1 = (1/11)x1k +
(1/11)x3k – (3/11)x4k + 25/11
x3k+1 = –(1/5)x1k +(1/10)x2k
+ (1/10)x4k – 11/10
x4k+1=
– (3/8)x2k + (1/8)x3k +
15/8
Enquanto no método de Gauss-Seidel, fazemos
x1k+1 =
(1/10)x2k – (1/5)x3k +
3/5
x2k+1 = (1/11)x1k+1 +
(1/11)x3k – (3/11)x4k + 25/11
x3k+1 = –(1/5)x1k+1 +(1/10)x2k+1
+ (1/10)x4k – 11/10
x4k+1=
– (3/8)x2k+1 + (1/8)x3k+1 +
15/8
x1k+1 =
(1/10)x2k – (1/5)x3k +
3/5
x2k+1 = (1/11)x1k+1 +
(1/11)x3k – (3/11)x4k + 25/11
x3k+1 = –(1/5)x1k+1 +(1/10)x2k+1
+ (1/10)x4k – 11/10
x4k+1=
– (3/8)x2k+1 + (1/8)x3k+1 +
15/8
Considerando novamente o “chute inicial” x0 = (0,0,0,0)T, obtemos
os seguintes resultados:
x11 = (1/10)*0 – (1/5)*0 + 3/5 = 0,6
x21 = (1/11)*0,6 + (1/11)*0 – (3/11)*0 + 25/11 = 2,327
x31 = –(1/5)*0,6 +(1/10)*2,327 + (1/10)*0 – 11/10 = -0,987
x41 = – (3/8)*2,327 + (1/8)*(-0,987) + 15/8 = 0,8789
Continuando o mesmo procedimento, vamos obter:
x2 = (1,030; 2,037; -1,014; 0,984)T
....
x5 = (1,000; 2,000; -1,000; 1,000)T
Observe que, como visto na aula anterior, nesse exemplo, o método
de Jacobi precisou de praticamente o dobro de iterações para chegar
no mesmo resultado.
Método de Gauss-Seidel
Assim como fizemos para o método de Jacobi, em termos de
fórmulas, podemos escrever o método de Gauss-Seidel da seguinte
forma:
i 1
k 1
xi

bi   aij x kj 1 
j 1
aii
n
k
a
x
 ij j
j i 1
, i  1,2,...,n
Onde xi0 é uma aproximação inicial dada.
Algoritmo: Método de Gauss-Seidel
Dados de Entrada. Matriz: A, vetores: b, x0, número de equações: n,
tolerância: tol, número máximo de iterações: Nmax.
cont = 1;
Enquanto cont ≤ Nmax Faça
Para i = 1 até n, passo 1, Faça
soma = 0
Para j=1 até i-1, passo 1, Faça
soma = soma + A( i, j )*x( j )
Para j=i+1 até n, passo 1, Faça
soma = soma + A( i, j )*x0( j )
x( i ) = [ b( i ) – soma ] / A( i, i )
Se || x – x0 || < tol
Retornar x
Sair
Senão
Obs.: Algoritmo idêntico ao de
x0 = x
Jacobi, exceto nos trechos marcados
em verde.
cont = cont + 1
x = x0;
Métodos de Relaxação
Uma terceira classe de métodos são os chamados métodos de
relaxação, descritos pela fórmula:
i 1
k 1
xi
 (1  w) x i  w
k
bi   aij x j 
k 1
j 1
aii
n
a x
j i 1
ij
k
j
, i  1,2,...,n
Observe que se w = 1, temos o método de Gauss-Seidel. Assim, o
parâmetro w funciona como uma ponderação que pode auxiliar a
acelerar a convergência. Estes métodos utilizam 0 < w < 2.
Matrizes Esparsas
Métodos iterativos são convenientes para resolver sistemas envolvendo
matrizes grandes e esparsas. O motivo disso é que as várias
multiplicações envolvidas em métodos como o de Jacobi e GaussSeidel não precisam ser feitas pois são multiplicações por zero.
Veja o caso, por exemplo, do sistema Ax=b abaixo. Dos 25 elementos
da matriz A, apenas 12 são diferentes de zero.
 2  1 0 0 0  x1   1 

   
 1 3  1 0 0  x2   2 
 0 0 5  1 0  x    3 

 3   
 0 0 2 8  1 x4   4 
 0 0 0 1 9  x   5 

 5   
Além disso, podemos economizar memória do computador se
deixarmos de armazenar os zeros da matriz.
Isto pode ser feito usando uma matriz auxiliar que armazene
apenas os valores não nulos e suas respectivas posições. Isto é,
podemos substituir a matriz A abaixo pela matriz M.
 2 1 0 0 0 


 1 3 1 0 0 
A   0 0 5 1 0 


 0 0 2 8  1
0 0 0 1 9 


Onde M é 12x3, sendo 12 o número de
elementos não nulos (NENN) de A.
Repare que dada uma linha k de M, isto é (mk1,
mk2, mk3), temos que mk3 é o elemento
amk1,mk2. Por exemplo, na linha
4 de M, (2,2,3), o elemento 3 é o elemento a2,2.
1

1
2

2
2

3
M 
3
4

4
4

5
5

1
2
1
2
3
3
4
3
4
5
4
5
2

 1
1

3
 1
5

 1
2

8
 1

1
9 
 2 1 0 0 0 


 1 3 1 0 0 
A   0 0 5 1 0 


 0 0 2 8  1
0 0 0 1 9 


Observe que, nesse caso, a matriz M tem mais
elementos que a matriz A porque esta é uma
matriz “pequena”.
Imagine, por exemplo, uma matriz A100x100,
esparsa, com apenas 30 elementos não nulos.
Nesse caso, a matriz M teria apenas 90 elementos,
enquanto a matriz A teria 10.000.
1

1
2

2
2

3
M 
3
4

4
4

5
5

1
2
1
2
3
3
4
3
4
5
4
5
2

 1
1

3
 1
5

 1
2

8
 1

1
9 
Algoritmo do Método de Gauss-Seidel
para Matrizes Esparsas
Supondo que a matriz A seja substituída pela matriz M, o algoritmo
do método de Gauss-Seidel muda para o seguinte.
Dados de Entrada. Número de Equações: n, número máximo de
iterações: Nmax, número de elementos não-nulos: NENN,
tolerância: tol, Matriz: A na forma M, vetores: b e x0.
...
continua
...
i 1
n
x = x0;
k 1
k
b

a
x

a
x


i
ij
ij
Para cont = 1 até Nmax, Passo 1, Faça
j 1
j i 1
k 1
x

k=1
aii
Para i = 1 até n, passo 1, Faça
soma = 0
Enquanto M(k,1)=i e M(k,2)≤ i-1 Faça
soma = soma + M(k,3)*x( M(k,2) )
k=k+1
aii=M(k,3)
k=k+1
Enquanto k<NENN e M(k,1)=i e M(k,2) ≤ n Faça
soma = soma + M( k, 3 )*x0( M(k,2) )
k=k+1
x( i ) = [ b( i ) – soma ] / aii
Se || x – x0 || < tol
Retornar x e Sair
Senão
x0 = x
j
i
j
Projeto 2.
Prezados alunos.
Como combinado em sala de aula, o objetivo desse segundo projeto
é resolver os sistemas lineares do projeto 1 (com n=100 e n=1000)
utilizando métodos iterativos para comparar com a solução por
eliminação de Gauss.
Assim, adaptem os métodos de Jacobi, Gauss-Seidel e Relaxação
(com w variando entre 1.8, 1.9 e 1.95) ao algoritmo para matrizes
esparsas e verifiquem os tempos que estes métodos levam para
solucionar os sistemas lineares (comparar com o tempo do método
da eliminação de Gauss). Adotem nos métodos uma tolerância
(precisão) de 10-5.
Download

x - minerva.ufpel.edu.br