[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.219512195121952004-05-29