Sei sulla pagina 1di 10

TRABALHO DE CLCULO NUMRICO

DECOMPOSIO LU

Antnio de S Saad
Gabrielle Barreto
Gustavo Duarte
Gustavo H. R. Braga
Rodrigo Macedo

Junho/2016

1. INTRODUO
A anlise numrica o estudo de algoritmos que buscam resultados numricos
de problemas das mais diferentes reas do conhecimento humano, modelados
matematicamente. Em geral, os algoritmos de mtodos numricos se dividem em
diretos, recursivos e iterativos.
Os mtodos diretos usam transformaes algbricas para simplificar a matriz e
permitir a resoluo simples do sistema. A vantagem desta famlia de algoritmos sua
exatido matemtica (quando no se leva em conta a preciso finita da representao
dos nmeros reais), e o fato de se obter uma forma fatorada da matriz que pode servir
para a obteno de mais de uma soluo, por exemplo quando as condies nos limites
(bi) mudam sem que as equaes mudem. A principal desvantagem o fato das
transformaes destrurem a estrutura da matriz inicial: mais especificamente, os
valores nulos da matriz, que geralmente no precisam ser armazenados em memria,
podem se tornar no zero medida que o algoritmo progride, necessitando assim um
aumento no uso de memria. Assim, para grandes matrizes esparsas, preferir-se- o uso
dos mtodos iterativos.
Em lgebra linear, a decomposio LU (em que LU vem do ingls lower e
upper), mtodo numrico direto em questo neste trabalho, uma forma de fatorao de
uma matriz no singular como o produto de uma matriz triangular inferior (lower) e
uma matriz triangular superior (upper). s vezes se deve pr-multiplicar a matriz a ser
decomposta por uma matriz de permutao. Esta decomposio se usa em anlise
numrica para resolver sistemas de equaes (mais eficientemente) ou encontrar as
matrizes inversas.
Para esse trabalho, utilizamos o software Dev-C++ para a resoluo de um
sistema Ax=b, pelo mtodo da Decomposio LU. O Dev-C++ um compilador
freeware das linguagens C, C++ e C#. uma opo muito interessante, pois de fcil
utilizao e aprendizado para usurios novos e possui muitos recursos avanados para
usurios experientes.

2. APLICAO GERAL DO MTODO


Clculo numrico se baseia na obteno da soluo de um problema, pela
aplicao de um mtodo numrico (algoritmo). A grande vantagem do estudo dos
mtodos numricos, est na aplicao desses algoritmos em computadores, pois a
resoluo de problemas complexos se torna muito mais fcil. Dessa forma, pode-se
destacar alguns tipos de problemas que o mtodo da Decomposio LU pode nos
oferecer a soluo, como por exemplo:

Resoluo de sistemas de equaes lineares;


Dada uma equao matricial:

Ax=LUx =b

Deseja-se a soluo para um determinado A e b, dessa forma as etapas so as


seguintes:
1. Resolve-se primeiramente Ly = b, para y.

2. Calcula-se Ux = y, para x.
Esse mtodo se torna muito eficiente devido a sua aplicao computacional,
devido ao fato de se poder escolher qualquer novo vetor b, que no necessrio realizar
novamente a eliminao de Gauss.

Encontrar a matriz inversa;

As matrizes L e U tambm podem ser utilizadas para o clculo da matriz


inversa. Quando resolvemos um sistema linear, utiliza-se b e x como vetores, mas para o
clculo da matriz inversa, iremos considerar ambas como matrizes. Dessa forma, tmse:
AX =LUX=B

Assim, supe-se que B seja a matriz identidade, portanto teremos que X ser a
matriz inversa de A.

Clculo do determinante de uma matriz quadrtica;

O determinante de uma matriz quadrtica, pode ser determinado a partir da sua


decomposio LU. Em outras palavras, mediante a transformao de uma matriz para
um produto de uma matriz triangular inferior (L), e superior (U), o determinante pode
ser calculado como o produto dos elementos diagonais de ambas as matrizes. Como
segue a seguinte expresso:

3. DECOMPOSIO LU COM ALGORITMO EM LINGUAGEM C


O algoritmo em linguagem C abaixo pode ser utilizado na resoluo de um
sistema Ax = b, no qual A uma matriz (n x n) e b um vetor (n x 1), pelo mtodo de
decomposio LU. Aps o comando, o algoritmo ir apresentar uma matriz triangular
inferior L = (lij), i,j = 1,2,3...n com lii = 1 e a matriz triangular superior U = uij, i,j =
1,2,3...n. E os vetores Y e X, o qual a soluo do sistema. Segue a programao:

#include<stdio.h>//Algoritimo de decomposio LU
main(){
int num,i,j,k=1,l=0,a=1,y;
float
matriz[4][4],matrizU[4][4],matrizL[4]
[4],vetB[4]={0,0,0,0,0},vetY[4]={0,0,0,0,0},vetX[4]={0,0,0,0,0},det2=1,det3=1,det4=1
;
printf("Algoritimo de decomposicao LU\nAx=B\nDigite a ordem da matriz
quadrada A \n");

scanf(" %d",&num);
if(num<=1||num>4)
printf(" O algoritimo nao calcula uma matriz de ordem %d \n",num);
else{
while(k!=3){

for(i=0;i<num;i++){
for(j=0;j<num;j++){
printf("Digite o elemento X %d,%d da matriz A \n",i+1,j+1);
scanf(" %f",&matriz[i][j]);
}
}//valores atribuidos a matriz A
k=3;
det2=(matriz[0][0]*matriz[1][1])-(matriz[0][1]*matriz[1][0]);
if(num>=3)
det3=-(matriz[0][2]*matriz[1][1]*matriz[2][0]+matriz[0][0]*matriz[1]
[2]*matriz[2][1]+matriz[0][1]*matriz[1][0]*matriz[2][2])+(matriz[0][0]*matriz[1]
[1]*matriz[2][2]+matriz[0][1]*matriz[1][2]*matriz[2][0]+matriz[0][2]*matriz[1]
[0]*matriz[2][1]);
if(num==4){
det4= matriz[0][0]*(-matriz[3][1]*matriz[2][2]*matriz[1][3]-matriz[3]
[2]*matriz[2][3]*matriz[1][1]-matriz[3][3]*matriz[2][1]*matriz[1][2]+matriz[1]
[1]*matriz[2][2]*matriz[3][3]+matriz[1][2]*matriz[2][3]*matriz[3][1]+matriz[1]
[3]*matriz[2][1]*matriz[3][2])
-matriz[0][1]*(-matriz[3][0]*matriz[2][2]*matriz[1][3]-matriz[3]
[2]*matriz[2][3]*matriz[1][0]-matriz[3][3]*matriz[2][0]*matriz[1][2]+matriz[1]
[0]*matriz[2][2]*matriz[3][3]+matriz[1][2]*matriz[2][3]*matriz[3][0]+matriz[1]
[3]*matriz[2][0]*matriz[3][2])
+matriz[0][2]*(-matriz[3][0]*matriz[2][1]*matriz[1][3]-matriz[3]
[1]*matriz[2][3]*matriz[1][0]-matriz[3][3]*matriz[2][0]*matriz[1][1]+matriz[1]
[0]*matriz[2][1]*matriz[3][3]+matriz[1][1]*matriz[2][3]*matriz[3][0]+matriz[1]
[3]*matriz[2][0]*matriz[3][1])
-matriz[0][3]*(-matriz[3][0]*matriz[2][1]*matriz[1][2]-matriz[3]
[1]*matriz[2][2]*matriz[1][0]-matriz[3][2]*matriz[2][0]*matriz[1][1]+matriz[1]
[0]*matriz[2][1]*matriz[3][2]+matriz[1][1]*matriz[2][2]*matriz[3][0]+matriz[1]
[2]*matriz[2][0]*matriz[3][1]);

}
if(matriz[0][0]==0||det3==0||det2==0||det4==0){
printf(" A matriz possui um menor principal nulo\nReescreva a
matriz\n");
k=1;
}
}
}
if(num==2)
printf("O determinante e %.4f \n",det2);
if(num==3)
printf("O determinante e %.4f \n",det3);
if(num==4)
printf("O determinante e %.4f \n",det4);
printf("Insira os valores do vetor B\n");
for(i=0;i<num;i++){
printf("Digite o elemento X %d,1 do vetor B\n",i+1);
scanf(" %f",&vetB[i]);
}//Valores atribuidos ao vetor B
for(j=0;j<num;j++)
matrizU[0][j]=matriz[0][j];//Primeira linha de U
for(i=1;i<num;i++)
matrizL[i][0]=matriz[i][0]/matriz[0][0];//Primeir coluna de L
for(j=1;j<num;j++)
matrizU[1][j]=matriz[1][j] - (matrizL[1][0]*matrizU[0][j]);//Segunda linha de
U
if(num>=3){
for(i=2;i<num;i++)
matrizL[i][1]=(matriz[i][1] - matrizL[i][0]*matrizU[0][1])/matrizU[1][1];//Segunda
Coluna de L
for(j=2;j<num;j++)

matrizU[2][j]=matriz[2][j] - matrizL[2][0]*matrizU[0][j] - matrizL[2]


[1]*matrizU[1][j];//Terceira linha de U
}
if(num==4){
matrizL[3][2]=(matriz[3][2]-matrizL[3][0]*matrizU[0][2]-matrizL[3]
[1]*matrizU[1][2])/matrizU[2][2];//Terceira Coluna de L
matrizU[3][3]=matriz[3][3]-matrizL[3][0]*matrizU[0][3]-matrizL[3][1]*matrizU[1]
[3]-matrizL[3][2]*matrizU[2][3] ;//Terceira Linha de U
}
for(i=0;i<num;i++){
for(j=0;j<num;j++){
if(i==j)
matrizL[i][j]=1;
if(j>i)
matrizL[i][j]=0;
if(j<i)
matrizU[i][j]=0;
}
}
printf("\t MATRIZ U\n");
for(i=0;i<num;i++){
for(j=0;j<num;j++){
printf("%.4f ",matrizU[i][j]);
}
printf("\n");
}
printf("\t MATRIZ L\n");
for(i=0;i<num;i++){
for(j=0;j<num;j++){
printf("%.4f ",matrizL[i][j]);
}
printf("\n");

}
j=k=0;
printf("\tVETOR Y\n");
for(i=0;i<num;i++){
vetY[i]=vetB[i]-j*matrizL[i][0]*vetY[0]-k*matrizL[i][1]*vetY[1]-l*matrizL[i]
[2]*vetY[2];
printf(" %.4f",vetY[i]);
l=k;
k=j;
j=a;
}//calculando vetor Y
j=k=l=0;
printf("\n\tVETOR X\n");
for(i=num-1;i>=0;i--){
vetX[i]=(vetY[i]-j*vetX[num-1]*matrizU[i][num-1]-k*vetX[num2]*matrizU[i][num-2]-l*vetX[num-3]*matrizU[i][num-3])/matrizU[i][i];
printf(" %.4f",vetX[i]);
l=k;
k=j;
j=a;
}//calculando vetor X
printf("\n");
return(0);
}

4. EXEMPLO DE APLICAO DO MTODO NO DEV-C++


Resolva os sistemas lineares abaixo pelo mtodo de decomposio LU, utilizando
software criado:
i)
ii)

iii)

2X1 + X3= 3 / 2X2 + X3 = 3 / X1 + X2 + X3 = 5

Resolues:

Portanto, conclui-se que:


i)

= (1; 1; 0)t

Portanto, conclui-se que:


ii)

= (2; 2; 0)t

Portanto, conclui-se que:


iii)

= (1; 1; 1)t

REFERNCIAS BIBLIOGRFICAS
MAILLARD. N. Algoritmos Matriciais em Processamento de Alto Desempenho.
Universidade Federal do Rio Grande do Sul. http://www.lbd.dcc.ufmg.br/colecoes/eradrs/2005/003.pdf, 2005. Acesso em 25/06/2016.
WIKIPDIA Anlise Numrica. http://pt.wikipedia.org/wiki/An%C3%Allise_num
%C3%A9rica, 2011. Acesso em 08/06/2016
BUNCH, JAMES R.; HOPCROFT, JOHN (1974). Triangular factorization and
inversion by fast matrix multiplication. Mathematics of Computation 28: 231236,
10.2307/2005828, ISSN 0025-5718
MINGHIM, ROSANE. Manual Dev-C++. Universidade de So Paulo ICMC
Departamento de Cincias da Computao. So Paulo, Brasil.

Potrebbero piacerti anche