Você está na página 1de 9

UNIVERSIDADE FEDERAL FLUMINENSE

Fatorao LU com Pivoteamento Parcial


Exemplo de programa na linguagem pascal.

Mtodos Numricos

Nome: Fernanda Dutra Gabriela Guedes Julia Louzada Stphanie Agnes Professor: Marco Antnio

15/06/2011

Mtodo da Decomposio LU O processo de Fatorao LU usado para resolver um sistema linear Ax = B e consiste na decomposio da matriz A em um produto de matrizes L e U, ento resolvida uma seqncia de sistemas lineares de modo a se obter a soluo do sistema linear original. Consideramos que L uma matriz triangular inferior com a diagonal unitria e que U a matriz triangular superior. Dessa forma o sistema linear Ax = B pode ser escrito como (LU)x = B ou na forma L(Ux) = B. Uma vez que a decomposio triangular A = LU conhecida, a soluo do sistema Ax = B encontrada em dois passos: Primeiro resolvemos Ly = B, onde y o vetor a ser encontrado. Depois resolvemos Ux = y. Ou seja, para encontrarmos o vetor x que a soluo do sistema linear original devemos resolver os sistemas: i) L.y = B ii) U.x = y Uma condio suficiente para aplicar o mtodo de LU, que o determinante da matriz, seja diferente de zero. que aplicar o mtodo. aplicao do mtodo. Estratgia de pivoteamento parcial No incio de cada eliminao de Gauss, trocando as linhas, escolher para o piv o maior |aij| da coluna j. Contudo, no usual checar tal condio, j que calcular a determinante mais trabalhoso do O mtodo de decomposio de LU no ser apropriado, quando houver uma diviso por zero durante o processo da

O programa na Linguagem Pascal


Program fatlu; Uses Crt; Type Matriz = array[1..50,1..50] of Real; Vetor = array[1..50] of Real; Var P, Q, R : Matriz; y, x, d : Vetor; n, Opc, i, Ms : Integer; IORESULT,NormVideo:real; Procedure InicializaMatriz(Var M : Matriz; n : Integer); { Zera uma matriz onde M e o parametro que recebe a matriz e n a ordem da mesma. M e passada por referencia } Var i, j : Integer; Begin For i:=1 to n do Begin For j:=1 to n do M[i,j] := 0; End; End; Procedure InicializaVetor(Var V : Vetor; n : Integer); { Zera um vetor onde V e o parametro que recebe o vetor e n o tamanho do mesmo. V e passado por referencia } Var i : Integer; Begin For i:=1 to n do V[i] := 0; End; Procedure MostraMatriz (M : Matriz; n : integer); { Exibe uma matriz M de ordem n na tela } Var i, j : Integer; Begin For i:=1 to n do Begin Writeln; Writeln; For j:=1 to n do Write(M[i,j]:2:2,' '); End; End; Procedure MostraVetor (V : Vetor; n : Integer); { Exibe um vetor de tamanho n na tela }

Var i : Integer; Begin For i:=1 to n do Begin Writeln(V[i]:2:2); Writeln; End; End; Procedure LerSistema(Var A : Matriz; Var b : Vetor; n : Integer); { Faz a leitura dos dados do sistema. A e a matriz dos coeficientes e lida por linhas, b e o vetor segundo membro e n a ordem da matriz dos coeficientes. A e b so passados por referencia. } Var i, j : Integer; IORESULT:real; Resp : Integer; Begin Resp := 0; While (Resp <> 1) do Begin ClrScr; InicializaMatriz(A,n); InicializaVetor(b,n); GotoXY(18,1); Write('Digite Por Linhas a matriz dos coeficientes'); For i:=1 to n do Begin For j:=1 to n do Begin GotoXY(4*j,2+2*i); {$I-} Read(A[i,j]); {$I+} End; End; If (IORESULT = 0) Then Begin Writeln; Write('Confirma os Dados?[0-Nao,1-Sim] '); Readln(Resp); If (Resp = 1) Then Begin Resp := 0; While (Resp <> 1) do Begin ClrScr; GotoXY(18,1); Write('Digite o vetor segundo membro do sistema'); For i:=1 to n do Begin GotoXY(4,2+2*i); {$I-}

Read(b[i]); {$I+} End; If (IORESULT = 0) Then Begin Writeln; Write('Confirma os Dados?[0-Nao,1-Sim] '); Readln(Resp); End Else Begin ClrScr; GotoXY(27,12); Write('Erro na leitura dos dados!'); ReadKey; End; End; End; End Else Begin ClrScr; GotoXY(27,12); Write('Erro na leitura dos dados!'); ReadKey; End; End; End; Procedure Pivoteia(Var A, L : Matriz; Var b : Vetor; c, n: Integer); { Faz o Pivoteamento da Matriz A de ordem n na coluna c, alem disso faz as trocas de linhas no vetor b e na matriz L. A, L e b so passados por referencia. } Var i, LPivo : Integer; Pivo, Troca : Real; Begin Pivo := Abs(A[c,c]); LPivo := c; For i:=c+1 to n do Begin If (Abs(A[i,c]) > Pivo) then Begin LPivo := i; Pivo := Abs(A[i,c]); End; End; For i:=1 to n do Begin Troca := A[LPivo,i]; A[LPivo,i] := A[c,i]; A[c,i] := Troca; End;

For i:=1 to n do Begin Troca := L[LPivo,i]; L[LPivo,i] := L[c,i]; L[c,i] := Troca; End; Troca := b[LPivo]; b[LPivo] := b[c]; b[c] := Troca; End; Procedure FatoraLU (A : Matriz; Var U, L : Matriz; Var n, s : Integer); { Faz a Fatoracao LU da matriz A devolvendo as matriz triangulares L e U de ordem n e o inteiro s que indica se a matriz e singular ou nao, se s for 1 a matriz U e singular caso contrario no singular } Var i, j, k : Integer; Begin s := 0; For k:=1 to n-1 do Begin Pivoteia(A,L,d,k,n); For i:=k+1 to n do Begin L[i,k] := A[i,k]/A[k,k]; For j:=k to n do A[i,j] := A[i,j] - L[i,k]*A[k,j]; End; End; For i:=1 to n do Begin For j:=1 to n d Begin If (j >= i) then U[i,j] := A[i,j]; End; End; If (U[n,n] = 0) then s := 1; For i:=1 to n do L[i,i] := 1; End; Procedure RetroSub (M : Matriz; Var w, u: Vetor); { Acha a Solucao de um sistema triangular superior qualquer onde M e a matriz dos coeficientes, w o vetor das incognitas e u o vetor segundo membro } Var i, j : Integer; Begin

InicializaVetor(w,n); For i:=n downto 1 do Begin w[i] := u[i]; For j:= 1 to n do Begin If (i<>j) then w[i] := (w[i]-M[i,j]*w[j]); End; w[i] := w[i]/M[i,i]; End; End; Procedure SubPro (M : Matriz; Var w, u : Vetor); { Faz o mesmo que o RetroSub mas para sistemas triangulares inferiores } Var i, j : Integer; Begin InicializaVetor(w,n); For i:=1 to n do Begin w[i] := u[i]; For j:=1 to n do Begin If (i<>j) then w[i] := (w[i]-M[i,j]*w[j]); End; w[i] := w[i]/M[i,i]; End; End; Begin Repeat TextColor(LightGreen); ClrScr; GotoXY(26,5); Write('Digite a Ordem do Sistema: '); GotoXY(39,7); {$I-} Readln(n); {$I+} If ((IORESULT <> 0) or (n<=0)) Then Begin ClrScr; GotoXY(12,12); Write('A Ordem da Matriz deve ser um numero Inteiro positivo!'); ReadKey; Opc := 1; End Else Begin InicializaMatriz(P,n); InicializaMatriz(Q,n); InicializaMatriz(R,n); InicializaVetor(d,n);

InicializaVetor(x,n); InicializaVetor(y,n); ClrScr; LerSistema(P,d,n); FatoraLU(P,Q,R,n,Ms); ClrScr; GotoXY(5,1); Write('A Matriz L obtida foi: '); GotoXY(1,2); MostraMatriz(R,n); GotoXY(10,25); Write('Pressione qualquer tecla para continuar '); ReadKey; ClrScr; GotoXY(5,1); Write('A Matriz U obtida foi: '); GotoXY(1,2); MostraMatriz(Q,n); GotoXY(15,25); Write('Pressiona Qualquer tecla para exibir o resultado...'); ReadKey; If (Ms = 0) then Begin SubPro(R,y,d); RetroSub(Q,x,y); ClrScr; GotoXY(30,1); Write('Resultado do sistema'); GotoXY(1,3); MostraVetor(x,n); GotoXY(16,23); Write('Deseja Resolver mais algum sistema?[0-Nao,1-Sim] '); GotoXY(39,25); Readln(Opc); End Else Begin ClrScr; GotoXY(21,12); Write('Sistema sem solucao, Matriz singular!'); GotoXY(16,22); Write('Deseja Resolver mais algum sistema?[0-Nao,1-Sim] '); GotoXY(39,24); Readln(Opc); End; End; Until Opc = 0; End.

Anexo

Figura 1: O programa em execuo

Você também pode gostar