[x,A,p]=plu(A,b) -
Data la matrice
con determinante
non nullo e
vettore dei termini noti, la funzione fattorizza
come
il prodotto di matrici
con
triangolare superiore,
triangolare
inferiore con elementi diagonali uguali ad 1 e risolve il sistema
con
opportuna matrice di permutazione. La funzione
restituisce anche il vettore p contenente i vari indici della
permutazione finale delle righe di
.
La matrice L viene posta nella parte triangolare inferiore di A meno la
diagonale principale che deve contenere tutti 1, la matrice U viene
posta nela parte triangolare superiore di A.
%PLU
%[x,LU,p]=PLU(A,b)
%Pre: A matrice n x n non singolare, b vettore di lunghezza n
%
% La funzione risolve il sistema lineare di n equazioni in n
% incognite
% Ax=b con il metodo della fattorizzazione LU con pivoting
% parziale.
% Restituisce:
% - in x la soluzione del sistema,
% - in LU una matirce che contiene nella parte triangolare
% superiore la matrice U
% e nella parte strettamente
% triangolare inferiore gli elementi significativi
% della
% matrice L (in pratica L è una matrice che ha la parte
% strettamente triangolare
% inferiore uguale ad LU e tutti 1
% sulla diagonale principale).
% - nel vettore p la permutazione applicata alla matrice A.
% La matrice P
% può essere ricostruita permutando le colonne
% della matrice identità secondo
%l'ordine descritto dal
% vettore p.
% Le matrici L,U,P sono tali che P*A=L*U
%
% See also SIMPLELU, QRHOUSE
function [x,A,p]=PLU(A,b)
n=length(b);
p=1:n; % vettore contenente la permutazione finale
for i=1:n-1
[m,k]=max(abs(A(i:n,i)));
% k e' l'indice del massimo elemento in modulo
% la la sua posizione e' relativa alla dimensione del
% vettore, quindi si deve aggiustare tale valore
k=k+i-1;
% esecuzione di vari swap su
%%% righe matrice A
tmp=A(i,:); A(i,:)=A(k,:); A(k,:)=tmp;
%%% vettore dei termini noti
tmp=b(i); b(i)=b(k); b(k)=tmp;
%%% vettore permutazioni
tmp=p(i); p(i)=p(k); p(k)=tmp;
for j=i+1:n
A(j,i)=A(j,i)/A(i,i);
A(j,i+1:n)=A(j,i+1:n)-A(j,i)*A(i,i+1:n);
end;
end;
L=tril(A,-1);
for c=1:n
A(c,c)=1;
end
U=triu(A);
y=solveL(L,b);
x=solveU(U,y);
return
>> A
A =
1 2 3 4
5 6 7 8
9 10 32 354
65 78 98 54
>> b
b =
1
2
54
7
>> plu(A,b)
ans =
-1.20731707317072
2.38414634146340
-1.14634146341463
0.21951219512195
>> inv(A)*b
ans =
-1.20731707317073
2.38414634146343
-1.14634146341463
0.21951219512195
2004-05-29