program fatlu

11
UNIVERSIDADE FEDERAL FLUMINENSE Fatoração LU com Pivoteamento Parcial Exemplo de programa na linguagem pascal. Métodos Numéricos Nome: Fernanda Dutra Gabriela Guedes Julia Louzada Stéphanie Agnes Professor: Marco Antônio 15/06/2011

Upload: fernanda-dutra

Post on 02-Mar-2015

115 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Program Fatlu

UNIVERSIDADE FEDERAL FLUMINENSE

Fatoração LU com Pivoteamento Parcial

Exemplo de programa na linguagem pascal.

Métodos Numéricos

Nome: Fernanda DutraGabriela GuedesJulia LouzadaStéphanie Agnes

Professor: Marco Antônio

15/06/2011

Page 2: Program Fatlu

Método da Decomposição LU

O processo de Fatoração LU é usado para resolver um sistema linear Ax = B e consiste

na decomposição da matriz A em um produto de matrizes L e U, então é resolvida uma

seqüência de sistemas lineares de modo a se obter a solução do sistema linear original.

Consideramos que L é uma matriz triangular inferior com a diagonal unitária 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 decomposição triangular A = LU é conhecida, a solução 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 solução do sistema

linear original devemos resolver os sistemas:

i) L.y = B

ii) U.x = y

Uma condição suficiente para aplicar o método de LU, é que o determinante da matriz,

seja diferente de zero. Contudo, não é usual checar tal condição, já que calcular a

determinante é mais trabalhoso do que aplicar o método. O método de decomposição de LU

não será apropriado, quando houver uma divisão por zero durante o processo da aplicação do

método.

Estratégia de pivoteamento parcial

No início de cada eliminação de Gauss, trocando as linhas, escolher para o pivô o maior |aij| da coluna j.

Page 3: Program Fatlu

O programa na Linguagem Pascal

Program fatlu;Uses Crt;TypeMatriz = array[1..50,1..50] of Real;Vetor = array[1..50] of Real;

VarP, 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 }

Vari, j : Integer;BeginFor i:=1 to n doBeginFor j:=1 to n doM[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 }

Vari : Integer;BeginFor i:=1 to n doV[i] := 0;End;

Procedure MostraMatriz (M : Matriz; n : integer);

{ Exibe uma matriz M de ordem n na tela }Vari, j : Integer;BeginFor i:=1 to n doBeginWriteln; Writeln;For j:=1 to n doWrite(M[i,j]:2:2,' ');End;End;

Procedure MostraVetor (V : Vetor; n : Integer);

{ Exibe um vetor de tamanho n na tela }

Page 4: Program Fatlu

Vari : Integer;BeginFor i:=1 to n doBeginWriteln(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 são passados por referencia. }

Var

i, j : Integer;IORESULT:real;Resp : Integer;BeginResp := 0;While (Resp <> 1) doBeginClrScr;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 doBeginGotoXY(4*j,2+2*i);{$I-}Read(A[i,j]);{$I+}End;End;

If (IORESULT = 0) ThenBeginWriteln;Write('Confirma os Dados?[0-Nao,1-Sim] ');Readln(Resp);If (Resp = 1) ThenBeginResp := 0;While (Resp <> 1) doBeginClrScr;GotoXY(18,1);Write('Digite o vetor segundo membro do sistema');

For i:=1 to n doBeginGotoXY(4,2+2*i);{$I-}

Page 5: Program Fatlu

Read(b[i]);{$I+}End;If (IORESULT = 0) ThenBeginWriteln;Write('Confirma os Dados?[0-Nao,1-Sim] ');Readln(Resp);End

Else

BeginClrScr;GotoXY(27,12);Write('Erro na leitura dos dados!');ReadKey;End;End;End;End

Else

BeginClrScr;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 são passados por referencia. }

Vari, LPivo : Integer;Pivo, Troca : Real;BeginPivo := Abs(A[c,c]);LPivo := c;For i:=c+1 to n doBeginIf (Abs(A[i,c]) > Pivo) then

BeginLPivo := i;Pivo := Abs(A[i,c]);End;End;

For i:=1 to n doBeginTroca := A[LPivo,i];A[LPivo,i] := A[c,i];A[c,i] := Troca;End;

Page 6: Program Fatlu

For i:=1 to n doBeginTroca := 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 é não singular }

Var

i, j, k : Integer;

Begins := 0;

For k:=1 to n-1 doBeginPivoteia(A,L,d,k,n);For i:=k+1 to n doBeginL[i,k] := A[i,k]/A[k,k];For j:=k to n doA[i,j] := A[i,j] - L[i,k]*A[k,j];End;End;

For i:=1 to n doBeginFor j:=1 to n dBeginIf (j >= i) thenU[i,j] := A[i,j];End;End;

If (U[n,n] = 0) thens := 1;For i:=1 to n doL[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 }

Vari, j : Integer;Begin

Page 7: Program Fatlu

InicializaVetor(w,n);For i:=n downto 1 doBeginw[i] := u[i];For j:= 1 to n doBeginIf (i<>j) thenw[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 }Vari, j : Integer;Begin

InicializaVetor(w,n);For i:=1 to n doBeginw[i] := u[i];

For j:=1 to n doBeginIf (i<>j) thenw[i] := (w[i]-M[i,j]*w[j]);End;w[i] := w[i]/M[i,i];End;End;

BeginRepeatTextColor(LightGreen);ClrScr;GotoXY(26,5);Write('Digite a Ordem do Sistema: ');GotoXY(39,7);{$I-}Readln(n);{$I+}

If ((IORESULT <> 0) or (n<=0)) ThenBeginClrScr;GotoXY(12,12);Write('A Ordem da Matriz deve ser um numero Inteiro positivo!');ReadKey;Opc := 1;End

Else

BeginInicializaMatriz(P,n);InicializaMatriz(Q,n);InicializaMatriz(R,n);InicializaVetor(d,n);

Page 8: Program Fatlu

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

BeginSubPro(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

ElseBeginClrScr;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.

Page 9: Program Fatlu

Anexo

Figura 1: O programa em execução