MS211 - Cálculo Numérico
Aula 8 – Convergência dos Métodos de Jacobi e Gauss-Seidel, Introdução ao MATLAB e GNU Octave.
Introdução
Na aula anterior, apresentamos os métodos iterativos de Jacobi e Gauss-Seidel para a solução de um sistema linear
Ax = b,
em queA ∈ Rn×n é uma matriz não-singular (e supostamente
esparsa).
Na aula de hoje comentaremos sobre a implementação desses métodos MATLAB ou GNU Octave.
Na aula de hoje também discutiremos a convergência desses métodos.
Método de Jacobi
O método de Jacobi pode ser implementado no MATLAB ou GNU Octaveusando o seguinte algoritmo:
Entrada: Matriz A ∈ Rn×n; vetorb ∈ Rn; aproximação inicialx0.
Dados: Número máximo de interações kmax e tolerância τ > 0.
Inicialize: k = 0 e defina Dr = τ +1.
Defina:D = diag(a11,a22, . . . ,ann)eM = A − D.
enquanto k ≤ kmax e Dr > τ faça
Atualize: k = k + 1.
Resolva: Dx = b − Mx0 (ou seja,x = D\(b − Mx0)).
Calcule: Dr = kx − x0k∞ kxk∞ . Atualize:x0=x. fim
Simplificadamente, no MATLAB ou no GNU Octave, criamos um arquivo MetodoJacobi.m contendo:
function [x,Dr]=MetodoJacobi(A,b,x0,kmax,tau); D = diag(diag(A)); M = A-D; k = 1; Dr(k) = tau+1; while (k<=kmax)&(Dr(k)>tau) k = k+1; x = D\(b-M*x0); Dr(k) = norm(x-x0,inf)/norm(x,inf); x0 = x; end
Uma implementação mais rica em detalhes pode ser obtida pelo link:MetodoJacobi.m
Para executar o método de Jacobi, digite no prompt: » x=MetodoJacobi(A,b,x0,kmax,it)
Por exemplo, digite no prompt: >> A=[2 1;3 4]; b=[1;-1]; >> x0=[0;0]; kmax=100; tau=1.e-4; >> [x,Dr]=MetodoJacobi(A,b,x0,kmax,tau); >> x x = 0.99993 -0.99989 >> semilogy(Dr);
>> xlabel(’Iteracoes’); ylabel(’Diferença Relativa’); >> title(’Metodo de Jacobi’);
10-4 10-3 10-2 10-1 100 2 4 6 8 10 12 14 16 18 Diferenca Relativa Iteracoes Metodo de Jacobi
Método de Gauss-Seidel
Entrada: Matriz A ∈ Rn×n; vetorb ∈ Rn; chute inicialx 0.
Dados: Número máximo de interações kmax e tolerância τ > 0.
Inicialize: k = 0 e Dr = τ +1. Defina:L = a11 0 . . . 0 a21 a22 . . . 0 .. . ... . .. ... an1 an2 . . . ann eU = 0 a12 . . . a1n 0 0 . . . a2n .. . ... . .. ... 0 0 . . . 0 .
enquanto k ≤ kmax e Dr > τ faça
Atualize: k = k + 1.
Resolva: Lx = b − Ux0 (ou seja,x = L\(b − Ux0)). Calcule: Dr = kx − x0k∞ kxk∞ . Atualize:x0=x. fim
Simplificadamente, no MATLAB ou no GNU Octave, criamos um arquivo MetodoGaussSeidel.m contendo:
function [x,Dr]=MetodoGaussSeidel(A,b,x0,kmax,tau); L = tril(A); U = A-L; k = 1; Dr(k) = tau+1; while (k<=kmax)&(Dr(k)>tau) k = k+1; x = L\(b-U*x0); Dr(k) = norm(x-x0,inf)/norm(x,inf); x0 = x; end
Uma implementação mais rica em detalhes pode ser obtida pelo link:MetodoGaussSeidel.m
Para executar o método de Gauss-Seidel, digite no prompt: » x=MetodoGaussSeidel(A,b,x0,kmax,it)
Por exemplo, digite no prompt: >> A=[2 1;3 4]; b=[1;-1]; >> x0=[0;0]; kmax=100; tau=1.e-4; >> [x,Dr]=MetodoGaussSeidel(A,b,x0,kmax,tau); >> x x = 0.99997 -0.99998 >> semilogy(Dr);
>> xlabel(’Iteracoes’); ylabel(’Diferença Relativa’); >> title(’Metodo de Gauss-Seidel’);
10-4 10-3 10-2 10-1 100 2 4 6 8 10 Diferenca Relativa Iteracoes Metodo de Gauss-Seidel
Observações sobre GNU Octave e MATLAB
O nome MATLAB é derivado do termoMATrix LABoratory.
Essencialmente, tudo é matriz para o MATLAB e GNU Octave! Nesse sentido, prefira sempre operações com matrizes e tente formular seus algoritmos utilizando álgebra matricial.
Vamos ilustrar essa sentença considerando o método de Gauss-Seidel.
Especificamente, vamos comparar o tempo de execução do código no arquivoMetodoGaussSeidel.m, que está baseado numa formulação matricial, com uma outra implementação do método de Gauss-Seidel sem utilizar a formulação matricial.
Método de Gauss-Seidel
Na aula anterior, apresentamos o método de Gauss-Seidel da seguinte forma:
Dada uma aproximação inicialx(0)para a solução do sistema
Ax = b, o método de Gauss-Seidel define {x(k )}
k ≥0através da
seguinte relação de recorrência para k = 0, 1, . . .: x1(k +1)= b1− (a12x2(k )+ . . . +a1nxn(k )) /a11, x2(k +1)=b2− (a21x (k +1) 1 + . . . +a2nx (k ) n ) /a22, .. . ... ... ... xn(k +1)= bn− (an1x1(k +1)+ . . . +an,n−1xn−1(k +1)) /ann,
Baseado nessas equações, podemos conceber o seguinte código que não usa a formulação matricial.
function [x,Dr]=MetodoGaussSeidel2(A,b,x0,kmax,tau); k = 1; Dr(k) = tau+1;
while (k<=kmax)&(Dr(k)>tau) k = k+1;
x = x0;
for i=1:size(A,1) % size(A,1) = # linhas de A.
x(i) = b(i)/A(i,i); for j=1:i-1 x(i)=x(i)-(A(i,j)*x(j))/A(i,i); end for j=i+1:size(A,1) x(i)=x(i)-(A(i,j)*x(j))/A(i,i); end end Dr(k) = norm(x-x0,inf)/norm(x,inf); end
Matriz Esparsa Aleatória
Considere o sistema linearAx = b, em que A ∈ R100×100é tal que Pr {aij =0} = 0.99 com aij =1 exceto aii =1 +
Pn
j=1aij.
O vetorb é escolhido de modo que as componentes xi da solução
O gráfico abaixo mostra o tempo de execução e o erro relativo dos métodos numéricos:
10-6 10-5 10-4 10-3 10-2 10-1 100 101 102 103
Fat. LU Jacobi Gauss-Seidel Gauss-Seidel2 Tempo Exec.
Note que:
• A fatoração LU demorou mais que os métodos iterativos de Jacobi e Gauss-Seidel. Além disso, o erro relativo da fatoração LU foi significativamente grande.
• O método de Gauss-Seidel produziu a solução numérica com menor erro e menor tempo de execução.
• A implementação Gauss-Seidel que não está baseado numa formulação matricial requer um tempo muito mair de execução.
Os métodos de Jacobi e Gauss-Seidel não convergem sempre para a solução do sistemaAx = b.
Exemplo 1
Ambos os métodos divergem quando aplicados para resolver o sistema linearAx = b em que
A =1 2
3 4
Com efeito, as 20 primeiras iterações do método de
Gauss-Seidel, comx(0)= [0, 0]T, corresponde à sequência de
pontos vermelhos mostrados na figura abaixo:
-1000 0 1000 2000 3000 4000 -5000 -4000 -3000 -2000 -1000 0
Convergência dos Métodos Iterativos
Ambos os métodos de Jacobi e Gauss-Seidel podem ser escritos na forma matricial como
x(k +1)=Cx(k )+g, para k = 0, 1, . . . , em quex∗ =Cx∗+g se, e somente se, Ax∗ =b.
No método de Jacobi, temos:
x(k +1)=D−1(b − Mx(k )) = −D−1M | {z } C x(k )+D−1b | {z } g .
No método de Gauss-Seidel, temos:
x(k +1)=L−1(b − Ux(k )) = −L−1U | {z } C x(k )+L−1b | {z } g .
A diferença entre duas iterações consecutivas do método
x(k +1)=Cx(k )+g, k ≥ 1, satisfaz x(k +1)− x(k ) =
Cx(k )+g−Cx(k −1)+g=C x(k )− x(k −1).
Considerando uma norma matricial subordinada, temos que kx(k +1)− x(k )k ≤ kCkkx(k )− x(k −1)k, ∀k = 1, . . . .
Aplicando k -vezes a inequação, concluímos que
kx(k +1)− x(k )k ≤ kCkkkx(1)− x(0)k, ∀k = 1, . . . .
Portanto, se kCk < 1, então kx(k +1)− x(k )k → 0, ou seja, o método iterativo converge!
Critério de Convergência
Concluindo, o seguinte teorema estabelece um critério de convergência para os métodos iterativos (incluindo Jacobi e Gauss-Seidel) definidos pela equação
x(k +1)=Cx(k )+g, k ≥ 0, independentemente da aproximação inicialx(0).
Teorema 1 (Critério de Convergência)
A sequência
x(k +1)=Cx(k )+g, ∀k = 0, 1, . . . ,
converge parax∗ =Cx∗+g se kCk < 1, em que k · k denota uma
No método de Jacobi, temos C = 0 a12 a11 . . . a1n a11 a21 a11 0 . . . a2n a22 .. . ... . .. ... an1 ann an2 ann . . . 0 .
Considerando a norma subordinada k · k∞, temos
kCk∞<1 ⇐⇒ max i=1:n X j6=i aij aii <1 ⇐⇒ X j6=i aij aii <1, ∀i = 1, . . . , n ⇐⇒ X j6=i |aij| < |aii|, ∀i = 1, . . . , n.
Em palavras, o método de Jacobi converge se a matrizA é
Critério das Linhas
Pode-se mostrar que, seA é diagonalmente estritamente
dominante, então o método de Gauss-Seidel também converge.
Teorema 2 (Critério das Linhas)
Considere o sistema linearAx = b. Se a matriz A é
diagonalmente estritamente dominante, ou seja,
αi = 1 |aii| X j6=i |aij| <1, ∀i = 1, . . . , n,
então ambos os métodos de Jacobi e Gauss-Seidel geram uma sequência que converge para a solução do sistema linear independentemente da aproximação inicialx(0).
Critério de Sassenfeld
Analogamente, considerando a norma matricial subordinada k · k∞e a matrizC = −L−1U, encontramos a a seguinte condição
suficiente para a convergência do método de Gauss-Seidel:
Teorema 3 (Critério de Sassenfeld)
Considere o sistema linearAx = b. Se
βi = 1 |aii| i−1 X j=1 |aij|βj+ n X j=i+1 |aij| <1, ∀i = 1, . . . , n.
então o método de Gauss-Seidel gera uma sequência {x(k )} que converge para a solução do sistema linear independentemente da aproximação inicialx(0).
Exemplo 4
Verifique se o critério das linhas é válido para o sistema linear 3x1 +x3 = 3 x1 −x2 = 1 3x1 +x2 2x3 = 9
Exemplo 4
Verifique se o critério das linhas é válido para o sistema linear 3x1 +x3 = 3 x1 −x2 = 1 3x1 +x2 2x3 = 9
Resposta: No critério das linhas, determinamos
α1= 1 |a11| (|a12| + |a13|) = 1 3(0 + 1) = 1 3 <1, X α2= 1 |a22| (|a21| + |a23|) = 1 1(1 + 0) = 1 6< 1.
Logo, o critério das linhas não vale para esse sistema!
Os métodos de Jacobi e Gauss-Seidel podem ou não convergir nesse caso!
Exemplo 5
Verifique se o critério de Sassenfeld é válido para o sistema linear 3x1 +x3 = 3 x1 −x2 = 1 3x1 +x2 2x3 = 9
Exemplo 5
Verifique se o critério de Sassenfeld é válido para o sistema linear 3x1 +x3 = 3 x1 −x2 = 1 3x1 +x2 2x3 = 9
Resposta: No critério de Sassenfeld, determinamos
β1= 1 |a11| (|a12| + |a13|) = 1 3(0 + 1) = 1 3 <1, X β2= 1 |a22| (|a21|β1+ |a23|) = 1 1(1 1 3 +0) = 1 3 <1, X β3= 1 |a33| (|a31|β1+ |a32|β2) = 1 2(3 1 3+1 1 3) = 2 3 <1, X
Logo, o critério de Sassenfeld é satisfeito!
Considerações Finais
Na aula de hoje implementamos os métodos iterativos de Jacobi e Gauss-Seidel no GNU Octave e MATLAB. Destacamos que, nesses dois softwares, devemos priorizar uma formulação matricial do método.
Na aula de hoje discutimos também critérios de convergência para os métodos de Jacobi e Gauss-Seidel!
Observe que o critério apresentado é uma condição suficiente, mas não necessária, para a convergência. Em outras palavras, o método converge se o critério for satisfeito. Nada podemos dizer sobre a convergência se o critério não for satisfeito.