Uploaded by lu

55429294-Calculo-numerico-Matriz-inversa-por-fatoracao-LU-MATLAB

advertisement
Fernando Henrique Gomes Zucatelli
1. CÁLCULO NUMÉRICO
Algoritmo para obter inversa de A após fatoração LU. PA=LU
Algoritmo:
function [L U P Z] = Inversa_Fatoracao_LU(A)
%
% Funcao para calcular a inversa de uma matriz
% usando a fatoração LU
% A: matriz dada
% M: recebe A para resolver o sistema
% U: recebe A para se tornar Upper
% L: recebe identidade com L linhas de A e é trabalhada até ser Lower
% P: recebe identidade e sofre as permutações.
% I: recebe identidade e sofre eliminação Gaussiana para ser inv(L)
% Z: recebe L quando U é Upper para se tornar inversa
[Lm Cm] = size(A);
L = eye(Lm); %criar a identidade de tamanho Linhas de A
U = [A];
P = eye(Lm);
%pivotiamento para P e U
for i=1:Lm
[el_max pos_max] = max(abs(A(i,:)));
if (abs(el_max)~=0)
if el_max ~= U(i,1)
U_temp=U(i,:);
U(i,:)=U(pos_max,:);
U(pos_max,:)=U_temp;
P_temp=P(i,:);
P(i,:)=P(pos_max,:);
P(pos_max,:)=P_temp;
end
else
break
fprintf(1,'Matriz é singular')
return;
end
end
% Eliminação de Gauss para U = Upper e L = Lower
for i=1:Lm
for j=i+1:Lm
m=U(j,i)/U(i,i);
U(j,:) = U(j,:) - m*U(i,:);
L(j,i) = m;
end
end
% U é Upper e L é lower
% Eliminação de Gauss para obter inv(L) sem usar o comando pronto do MATLAB
I = eye(Lm);
L_Aux = [L];
for i=1:Lm
for j=i+1:Lm
m=L_Aux(j,i)/L_Aux(i,i);
L_Aux(j,:) = L_Aux(j,:) - m*L_Aux(i,:);
I(j,:) = I(j,:) - m*I(i,:);
end
end
y = I*P; % A = P'*L*U => U*inv(A) = inv(L)*P = I*P => UZ=y
Z = zeros(Lm);
for i=1:Lm
M = [U y(:,i)];
[Lm Cm] = size(M);
z1 = zeros(Lm,1); %matriz coluna
z1(Lm) = M(Lm,Cm)/M(Lm,Lm);
for j=Lm-1:-1:1
z1(j) = (M(j,Cm) - M(j,j+1:Lm) * z1(j+1:Lm))/M(j,j);
end
Z (:,i) = Z(:,i) + z1;
end
domingo – 17/10/2010 – 15:31
1
Fernando Henrique Gomes Zucatelli
2
Resultados
a) C =
4
-1
2
-2
3
-1
0
0
2
3
1
0
0
7
1
1
Calculada pelo MATLAB format short (nota-se que é arredondado pelos zeros após o ponto) inv(C)=
-1.0000 -1.0000
4.0000 -2.0000
-3.0000 -4.0000 12.0000 -6.0000
11.0000 14.0000 -43.0000 22.0000
10.0000 14.0000 -41.0000 21.0000
Z é a inv(D) calculada pelo programa criado
Z=
-1.0000 -1.0000
4.0000 -2.0000
-3.0000 -4.0000 12.0000 -6.0000
11.0000 14.0000 -43.0000 22.0000
10.0000 14.0000 -41.0000 21.0000
b) D =
2
1
0
0
1
0
-1
1
0
1
1
1
-1
0
0
3b
calcula pelo MATLAB inv(D) =
3
-3
-3
2
-5
6
6
-4
4
-5
-4
3
1
-1
-1
1
Z é a inv(D) calculada pelo programa criado
Z=
3
-3
-3
2
-5
6
6
-4
4
-5
-4
3
1
-1
-1
1
domingo – 17/10/2010 – 15:31
Download