Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
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.
Ax=LUx =b
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.
Assim, supe-se que B seja a matriz identidade, portanto teremos que X ser a
matriz inversa de A.
#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++)
}
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);
}
iii)
Resolues:
= (1; 1; 0)t
= (2; 2; 0)t
= (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.