Use o botão abaixo para reportar erros ou dar sugestões.
Cálculo Numérico - Versão Scilab
4.7 Métodos iterativos para sistemas lineares
Na seção anterior, tratamos
de métodos diretos para a resolução de sistemas lineares. Em um
método direto (por exemplo, solução via fatoração LU) obtemos uma
aproximação da solução depois de realizarmos um número finito de
operações (só teremos a solução ao final do processo).
Veremos nessa seção dois métodos iterativos básicos para obter uma
aproximação para a solução de um sistema linear. Geralmente em um
método iterativo, iniciamos com uma aproximação para a solução (que
pode ser ruim) e vamos melhorando essa aproximação através de sucessivas
iterações.
4.7.1 Método de Jacobi
O método de Jacobi pode ser obtido a partir do sistema linear
Isolando o elemento
da primeira equação temos
(4.203)
Note que utilizaremos os elementos
da
iteração
(a direita da equação) para estimar o elemento
da
próxima iteração.
Da mesma forma, isolando o elemento
de cada
equação ,
para todo
podemos construir a iteração
Em notação mais compacta, o método de Jacobi consiste na iteração
Exemplo 4.7.1.Resolva o sistema
usando o método de Jacobi iniciando com
.
Exemplo 4.7.2.Considere o seguinte sistema
(4.218)
Usando o método de Jacobi com aproximação inicial
,
obtemos os seguintes resultados:
1
-x-
2
3
4
5
⋮
⋮
⋮
10
Verifique a resposta.
Aqui, cabe um código Scilab explicativo. Escreva você mesmo o código.
function [x,deltax]=jacobi(A,b,x,tol,N) n=size(A,1) xnew =x convergiu=%F //FALSE; k=1 while k<=N & ~convergiu xnew(1)=(b(1) - A(1,2:n)*x(2:n))/A(1,1) for i=2:n-1 xnew(i)=(b(i) -A(i,1:i-1)*x(1:i-1) ... -A(i,i+1:n)*x(i+1:n) )/A(i,i) end xnew(n)= (b(n) -A(n,1:n-1)*x(1:n-1) )/A(n,n) deltax=max( abs(x-xnew) ) if deltax<tol then convergiu=%T //TRUE end k=k+1 x=xnew // atualiza x disp([k,x’,deltax]) // depuracao end if ~convergiu then error(’Nao convergiu’) end endfunction
4.7.2 Método de Gauss-Seidel
Assim, como no método de Jacobi, no método de Gauss-Seidel também isolamos o elemento
da equação
. Porém perceba que a
equação para depende
de na iteração
. Intuitivamente
podemos pensar em usar
que acabou de ser calculado e temos
(4.219)
Aplicando esse raciocínio, podemos construir o método de Gauss-Seidel
como
Em notação mais compacta, o método de Gauss-Seidel consiste na
iteração:
Exemplo 4.7.3.Resolva o sistema
usando o método de Gauss-Seidel com condições iniciais
.
Código Scilab: Método de Gauss-Seidel
function [x,deltax]=gauss_seidel(A,b,x,tol,N) n=size(A,1) xnew =x convergiu=%F //FALSE; k=1 while k<=N & ~convergiu xnew(1)=(b(1) - A(1,2:n)*x(2:n))/A(1,1) for i=2:n-1 xnew(i)=(b(i) -A(i,1:i-1)*xnew(1:i-1) ... -A(i,i+1:n)*x(i+1:n) )/A(i,i) end xnew(n)=(b(n) -A(n,1:n-1)*xnew(1:n-1) )/A(n,n) deltax=max( abs(x-xnew) ) if deltax<tol then convergiu=%T //TRUE end k=k+1 x=xnew // atualiza x disp([k,x’,deltax]) // depuracao end if ~convergiu then error(’Nao convergiu’) end endfunction
4.7.3 Análise de convergência
Nesta seção, analisamos a convergência de métodos iterativos para
solução de sistema lineares. Para tanto, consideramos um sistema linear
, onde
é a matriz (real) dos
coeficientes, é um vetor
dos termos constantes e
é o vetor incógnita. No decorrer, assumimos que
é
uma matriz não singular.
Geralmente, métodos iterativos são construídos como uma iteração de
ponto fixo. No caso de um sistema linear, reescreve-se a equação matricial em
um problema de ponto fixo equivalente, isto é:
(4.234)
onde é chamada de
matriz da iteração e
de vetor da iteração. Construídos a matriz
e o
vetor ,
o método iterativo consiste em computar a iteração:
(4.235)
onde
é uma aproximação inicial dada.
A fim de construirmos as matrizes e os vetores de iteração
do método de Jacobi e de Gauss-Seidel, decompomos a matriz
da
seguinte forma:
(4.236)
onde é a
matriz diagonal ,
isto é:
(4.237)
e, respectivamente,
e
são as seguintes matrizes triangular inferior e superior:
(4.238)
Exemplo 4.7.4. Considere o seguinte sistema linear:
Escreva o sistema na sua forma matricial
identificando a matriz
dos coeficientes , o vetor
incógnita e o vetor dos termos
constantes . Em seguida,
faça a decomposição .
Solução. A forma matricial deste sistema é
,
onde:
(4.242)
A decomposição da matriz
nas matrizes
triangular inferior,
diagonal e
triangular superior é:
(4.243)
No Scilab, podemos construir as matrizes
,
e
, da
seguinte forma:
Vamos, agora, usar a decomposição discutida acima para construir a matriz de iteração
e o vetor de
iteração
associado ao método de Jacobi. Neste caso, temos:
Ou seja, a iteração do método de Jacobi escrita na forma matricial é:
(4.247)
com uma aproximação
inicial dada, sendo a
matriz de iteração e
o vetor da iteração.
Exemplo 4.7.5.Construa a matriz de iteração
e o vetor de iteração
do método de Jacobi para o sistema dado no Exemplo 4.7.4.
Solução. A matriz de iteração é dada por:
(4.248)
O vetor da iteração de Jacobi é:
(4.249)
No Scilab, podemos computar
e da
seguinte forma:
-->TJ = -inv(D)*(L+U);
-->cJ = inv(D)*b;
Iteração de Gauss-Seidel
A forma matricial da iteração do método de Gauss-Seidel
também pode ser construída com base na decomposição
. Para
tando, fazemos:
Ou seja, a iteração do método de Gauss-Seidel escrita na forma matricial
é:
(4.253)
com uma aproximação
inicial dada, sendo a
matriz de iteração e
o vetor da iteração.
Exemplo 4.7.6.Construa a matriz de iteração
e o vetor de iteração
do método de Gauss-Seidel para o sistema dado no Exemplo 4.7.4.
Solução. A matriz de iteração é dada por:
(4.254)
O vetor da iteração de Gauss-Seidel é:
(4.255)
No Scilab, podemos computar
e da
seguinte forma:
-->TG = -inv(L+D)*U;
-->cG = inv(L+D)*b;
Condições de convergência
Aqui, vamos discutir condições necessárias e suficientes para a
convergência de métodos iterativos. Isto é, dado um sistema
e
uma iteração:
(4.256)
dado, estabelecemos
condições nas quais ,
onde é a solução do
sistema dado, isto é,
ou, equivalentemente, .
Lema 4.7.1.Seja uma matriz real .O limite ,,se, e somente se, .
Demonstração. Aqui, fazemos apenas um esboço da demonstração.
Para mais detalhes, veja [8], Teorema 4, pág. 14.
Primeiramente, suponhamos que ,
.
Como (veja [8], lema 2, pág. 12):
(4.257)
temos ,
o que mostra a implicação.
Agora, suponhamos que
e seja . Então,
existe
tal que (veja [8], Teorema 3, página 12):
(4.258)
Assim, temos:
(4.259)
Da equivalência entre as normas segue a recíproca.
Observação 4.7.1. Observamos que:
(4.260)
Lema 4.7.2.Se ,então existe e:
(4.261)
Demonstração. Primeiramente, provamos a existência de
. Seja
um autovalor
de e
um autovetor
associado, isto é, .
Então, . Além
disso, temos , logo
, o que garante que
é não singular.
Agora, mostramos que
admite a expansão acima. Do Lema 4.7.1 e da Observação 4.7.1 temos:
(4.262)
o que mostra que .
Teorema 4.7.1.A sequência recursivadadapor:
(4.263)
converge para solução de para qualquer escolha de se, e somente se, .
Demonstração. Primeiramente, assumimos que
.
Observamos que:
Ora, se é a
solução de ,
então , isto é,
. Logo, temos demonstrado
que converge para a
solução de , para
qualquer escolha de .
Agora, suponhamos que
converge para
solução de , para
qualquer escolha de .
Seja, então, um
vetor arbitrário e .
Observamos que:
Logo, para qualquer ,
temos, :
(4.273)
Como
é arbitrário, da Observação 4.7.1 temos
,
. Então, o Lema 4.7.1
garante que .
Observação 4.7.2.Pode-se mostrar que tais métodos iterativos tem taxa de
convergência super linear com:
(4.274)
Para mais detalhes, veja [8], pág. 61-64.
Exemplo 4.7.7.Mostre que, para qualquer escolha da aproximação
inicial, ambos os métodos de Jacobi e Gauss-Seidel são convergentes
quando aplicados ao sistema linear dado no Exemplo 4.7.4.
Solução. Do Teorema 4.7.1, vemos que é necessário e suficiente que
e
. Computando estes raios
espectrais, obtemos
e .
Isto mostra que ambos os métodos serão convergentes.
Condição suficiente
Uma condição suficiente porém não necessária para que os métodos de
Gauss-Seidel e Jacobi convirjam é a que a matriz seja estritamente diagonaldominante.
Definição 4.7.2.Uma matriz édiagonal dominante quando
(4.276)
e para ao menos um ,éestritamente maior que a soma dos elementos fora da diagonal.
Teorema 4.7.2.Se a matriz for diagonal dominante9,então os métodos de Jacobi e Gauss-Seidel serão convergentes independenteda escolha inicial .
Se conhecermos a solução exata
do
problema, podemos calcular o erro relativo em cada iteração como:
(4.277)
Em geral não temos ,
entretanto podemos estimar o vetor resíduo
. Note
que quando o erro tende a zero, o resíduo também tende a zero.
Teorema 4.7.3.O erro relativo e o resíduo estão relacionados como (veja [3])
(4.278)
onde éo número de condicionamento.
Exemplo 4.7.8.Ambos os métodos de Jacobi e Gauss-Seidel são
convergentes para o sistema dado no Exemplo 4.7.4, pois a matriz dos
coeficientes deste é uma matriz estritamente diagonal dominante.
Exercícios
E 4.7.1.Considere o problema de 5 incógnitas e cinco equações dado
por
Escreva na forma
e resolva usando eliminação gaussiana para
no Scilab.
Obtenha o vetor incógnita
com
usando Jacobi com tolerância .
Compare o resultado com o resultado obtido no item d.
Obtenha o vetor incógnita
com
usando Gauss-Seidel com tolerância .
Compare o resultado com o resultado obtido no item d.
Discuta com base na relação esperada entre tolerância e exatidão
conforme estudado na primeira área para problemas de uma variável.
delta=norm(x-x0,2)
if delta<1e-6 then
controle=controle+1
else
controle=0
end
mprintf(’i=%d, x1=%f, x5=%f, tol=%.12f\n’, i, x(1), x(5), delta)
x0=x;
end
delta=norm(x-x0,2)
if delta<1e-2 then
controle=controle+1
else
controle=0
end
mprintf(’i=%d, x1=%f, x5=%f, tol=%.12f\n’,i,x(1),x(5),delta)
x0=x;
end
endfunction
E 4.7.2.Resolva o seguinte sistema pelo método de Jacobi e Gauss-Seidel:
(4.284)
Use como critério de paragem tolerância inferior a
e inicialize
com .
E 4.7.3.Refaça o Exercício 4.1.6 construindo um algoritmo que
implemente os métodos de Jacobi e Gauss-Seidel.
E 4.7.4. Considere o seguinte sistema de equações lineares:
Construa a iteração para encontrar a solução deste problema
pelos métodos de Gauss-Seidel e Jacobi. Usando esses métodos,
encontre uma solução aproximada com erro absoluto inferior a
. Veja
também Exercício 4.5.2
Resposta.
,
,
,
,
,
,
,
,
,
,
Exemplos de rotinas:
function x=jacobi()
x0=zeros(11,1)
k=0;
controle=0;
while controle<3 & k<1000
k=k+1
x(1)=x0(2)
for j=2:10
x(j)=(cos(j/10)+x0(j-1)+x0(j+1))/5
end
x(11)=x0(10)/2
delta=norm(x-x0) //norma 2
if delta<1e-5 then
controle=controle+1
else
controle=0;
end
mprintf(’k=%d, x=[%f,%f,%f], tol=%.12f\n’,k,x(1),x(2),x(3),delta)
x0=x;
end
endfunction
function x=gs()
x0=zeros(11,1)
k=0;
controle=0;
while controle<3 & k<1000
k=k+1
x(1)=x0(2)
for j=2:10
x(j)=(cos(j/10)+x(j-1)+x0(j+1))/5
end
x(11)=x0(10)/2
delta=norm(x-x0) //norma 2
if delta<1e-5 then
controle=controle+1
else
controle=0;
end
mprintf(’k=%d, x=[%f,%f,%f], tol=%.12f\n’,k,x(1),x(2),x(3),delta)
x0=x;
end
endfunction
E 4.7.5.Faça uma permutação de linhas no sistema abaixo e resolva pelos
métodos de Jacobi e Gauss-Seidel: