Está en la página 1de 9

Universidade Federal Fluminense Introduo aos Mtodos Numricos

Trabalho sobre Mtodo de Gauss Seidel

Araken Jesse da Silva Arturo Gmez Turma 3as e 5as. 16 hs. Niteri, 17/6/2008

Mtodo de Gauss-Seidel O mtodo de Gauss Seidel mtodo iterativo para resoluo de equaes lineares AX=b. Neste caso, temos: a11 x1 + a12 x2 + ... + a1n xn = b1 a21 x1 + a22 x2 + ... + a2n xn = b2 : : an1 x1 + an2 x2 + ... + ann xn = bn Supondo aii 0 i = 1, , n

Da, podemos escrever: a11 x1 = b1 ( a12 x2 + a13 x3 + + a1n xn ) a22 x2 = b2 ( a21 x1 + a23 x3 + ... + a2n xn ) : : ann xn = bn ( an1 x1 + an2 x2 + ... + an n-1 xn-1 ) Ento: x1 = [b1 ( a12 x2 + a12 x3 + + a1n xn)]/a11 x2 = [b2 ( a21 x1 + a23 x3 + ... + a2n xn)]/a22 : : xn = [bn ( an1 x1 + an2 x2 + ... + an n-1 xn-1)]/ann O sistema fica sob a forma x = cx + g 0 -a21/a22 : : -an1/ann -a12/a11 0 -an2/ann -a13/a11 ... a1n/a11 -a23/a22 ... a2n/a22 : : -an3/ann ... 0

c=

g=

b1/a11 b2/a22 : : bn/ann

A partir de uma aproximao inicial X(0) calcularemos as seguintes aproximaes: X(1), X(2), ... , X(k) . Quando essas aproximaes convergem, nos do a soluo do sistema. A diferena do mtodo de Gauss-jacobi, que calcula todas as componentes da ksima iterao em funo das (k-1)simas que Gauss- Seidel usa como aproximao as componentes j calculadas da k-sima iterao. Ento o sistema fica como: x1(k) = 1/a11 ( b1 a12 x2(k-1) a13 x3(k-1) - ... - a1n xn(k-1)) x2(k) = 1/a22 ( b2 a21 x1(k) a23 x3(k-1) - ... a2n xn(k-1)) : : (k) xn = 1/ann ( bn an1 x1(k) an2 x2(k) - ... an n-1 xn-1(k) ) Portanto, no processo iterativo de Gauss-Seidel, no momento de se calcular xj(k), usamos todos os valores de x1(k), ... , xj-1(k) que j foram calculados e os valores xj+1(k-1),..., xn(k-1) restantes. Vamos implementar um algoritmo para o seguinte exemplo concreto: GS( A, b, x0 ) := c 0 x x0 for i 0 ... rows(A) - 1 xi 1/Ai,i [ bi rows ( A ) 1 j =0

( j i )( Ai, j. Xj ) ]

while [(A.x b 0,0001 ( max(x0 x) 0,0001] ( c 30) cc+1 x1 x for i 0 ... rows(A) 1
rows ( A ) 1

xi 1/Ai,i [ bi x0 x1 x

( j i )( Ai, j. Xj ) ]
j =0

Se anexa um programa em Pascal que permete aplicar Gauss Seidel resoluo de um sistema qualquer. Anlise da convergncia Como todo processo iterativo, precisamos de critrios que nos forneam garantia de convergncia. Para este mtodo, temos dois critrios que estabelecem condies suficientes de convergncia: o critrio de Sassenfield e o critrio das linhas. Critrio de Sassenfeld Vamos definir as quantidades i dadas por: 1 = 1/|a11| .

| aij |
j =2 i 1

i = 1/|aii| . [ | aij | .j +
j =1

j =i + 1

| aij | ]

; i = 2, 3, ... , n

onde n a ordem do sistema linear que queremos resolver e aij so os coeficientes das equaes que compem esse sistema. O critrio de Sassenfeld garante que o mtodo de Gauss-Seidel convergir para um sistema linear se a quantidade m, definida por: M=max i ; 1 i n for menor que 1 Podemos aplicar este algoritmo para verificar a convergncia: Sassenfeld(A) := 0 [
rows ( A ) 1 j= 1

| Ao, j | ] / A0,0

for i 1, ... , rows(A) 2 i [ j. | Ai, j | ]/Ai,i + [


j =0 i 1 rows ( A ) 1 j= i+ 1

| Ai, j | ]/Ai,i

rows(A)-1 [ max() Critrio das Linhas

rows ( A ) 2 j =0

j. | Ai, j | ]/(Arows(A)-1 , rows(A)-1)

Segundo este critrio, Um dado sistema ir convergir pelo mtodo de Gauss-Seidel, se:

j= 1; j i

| ai, j |

< |aii| ;

i = 1, 2, ... , n

Ambos critrios fornecem condies suficientes. Critrio de Parada Para definir a parada do algoritmo, temos os seguintes critrios: 1) x(k) x(k-1) <
2) x(k) x(k-1) / xi(k) <

norma do supremo erro relativo

3) Ax - b < 4) iteraes < n Caractersticas do mtodo de Gauss Seidel Nmero de operaes requeridas: Em cada iterao, Gauss-Seidel requer 2n3 operaes. Ento, se o nmero de iteraes menor que n/2, este mtodo requer menos operaes que os diretos. Quanto aos erros, no se acumulam como sim acontesce nos mtodos direitos. Importam somente os cometidos na ltima iterao, pois os cometidos em iteraes anteriores no levam divergncia. Este mtodo, portanto, torna-se apropriado para matrizes com diagonal dominante, (critrio das linhas) e em particular quando estas tm zeros fora da diagonal. Esta situao, especialmente quando se trata de sistemas grandes, gera grande erros ao tentar resolver por mtodos diretos ( eliminao gaussiana).

Exemplo de aplicao prtica Entre os problemas que requerem soluo de sistemas lineares deste tipo encontram-se algumas equaes em derivadas parciais: Seja o seguinte problema uxx = ut u(x,0) = g(x) u(0,t) =u(1,t) = 0 Vamos a dividir o domnio em uma grade de retngulos de h x k. Desejamos encontrar os valores numricos de u(xi,tj). Usaremos as frmulas de derivao numrica: uxx ut

1 * [ u ( x + h, t ) 2 * u ( x, t ) + u ( x h, t )] h2
1 * [u ( x, t ) ux(t k )] k

onde h = xi+1 xi e

k = tj-1 tj

Aproximaremos, ento, a funo u(xi, tj), pela soluo da equao em diferenas vij. Assim, podemos escrever:
1 (vi =1, j 2vi, j + vi 1, j ) = 1 (vi, j vi, j 1 ) , e da, 2 k h vi , j 1 = k k k * vi 1, j + (1 + 2 * 2 )vi , j + 2 vi +1, j 2 h h h

O qual pode se escrever de forma vetorial como


k k 1+ 2 2 2 v1, j 1 h h . k k 2 1+ 2 2 h . = h 0 . v n , j 1 0 0 k h2 . 0 v1, j . . . . * . . v k n, j 1+ 2 2 h 0

k h2

, onde a matriz A obviamente diagonal dominante, o vetor v(j-1). conhecido e v(j) o vetor que queremos calcular.
v
j 1

= A*v

Isto nos permite, conhecido o vetor

v1,1 . . ,a . v n ,1

partir das condies iniciais, calcular

sucessivamente os vetores vij, completando os valores numricos da grade. Como a matriz diagonal dominante, podemos aplicar Gauss Seidel para resolver o sistema. A tal efeito, partiremos do vetor com t = 0, calculado com a condio de borde dada g(x,0) = x*(1-x). O vetor correspondente a t = k o resultado de aplicar gauss seidel ao sistema em que dito vetor a incgnita e o anterior o resultado. Usamos tambm o vetor anterior como primeira aproximao para o algoritmo. Se bem para qualquer relao de h e k a matriz A fica bem condicionada para aplicar Gauss- Seidel, usamos k = h2. Ambos sero menores que 1. Fica implementado em Pascal da forma seguinte: program EDP; var n,i,j,it,l:integer; {n o nmero de elementos que vo ter os vetores} var matriz:array[1..100,1..100] of real; {trata-se da matriz para o sistema} var solucao:array[1..100,1..200] of real; {cada vetor coluna corresponde a um valor de t} var x0,x1,dif:array[1..100] of real; { usadas para avaliar o erro em cada paso} var eps,S,h,k:real; {eps o valor da tolerancia, S uma varivel usada para acumular sumatorias, h e k so as distancias entre os pontos da grade da EDP} function max (Y:array of real):real; {funo para encontrar o elemento de maior mdulo de um vetor} var k:integer; begin max:=abs(Y[1]); for k:=2 to n do if abs(Y[k])>max then max:= abs(Y[k]); end; function g (z:real):real; {condio de borde -parablica- para t = 0} begin

g:=z*(1-z); end; begin write('ingresar tolerancia '); {ingreso do sistema e outros parmetros} readln(eps); n:=11; h:=1/(n-1);k:=1/((n-1)*(n-1)); {criao da matriz para o clculo do sistema} for i:=1 to n do for j:=1 to n do begin if (j<i-1)or(j>i+1) then matriz[i,j]:=0 else if (j=i-1)or(j=i+1) then matriz[i,j]:=-k/(h*h)else matriz[i,j]:=1+2*k/(h*h); end; {criao do vetor com a condio de borde} for i:=1 to n do solucao[i,1]:=g(h*(i-1)); {clculo da grade usando gauss seidel para ir de um vetor ao seguinte} for l:=2 to n do begin for i:=1 to n do solucao[i,l]:=solucao[i,l-1]; for i:=1 to n do begin {paso de iterao} S:=0; for j:=1 to n do if i<>j then S:=S+matriz[i,j]*solucao[j,l]; solucao[i,l]:=(solucao[i,l-1]-S)/matriz[i,i]; end; for i:=1 to n do dif[i]:= abs(solucao[i,l]-solucao[i,l-1]); while max(dif)>eps do begin for i:=1 to n do x1[i]:=solucao[i,l]; for i:=1 to n do begin {paso de iterao} S:=0; for j:=1 to n do if i<>j then S:=S+matriz[i,j]*solucao[j,l]; solucao[i,l]:=(solucao[i,l-1]-S)/matriz[i,i]; end; for i:=1 to n do

x0[i]:=x1[i]; for i:=1 to n do dif[i]:= abs(solucao[i,l]-x0[i]); end; end; writeln('a grade da equao em diferenas fica como:'); for i:=1 to n do begin for j:= 1 to n do write (solucao[i,j]:1:3,' '); writeln; end; readln; end.

También podría gustarte