[x,A]=QRhouse(A,b) -
Data la matrice ed il vettore
la funzione fattorizza
come il prodotto di due matrici
con
ortogonale ed
triangolare superiore, secondo il metodo
di Householder e risolve il sistema
. La matrice
viene memorizzata nella parte
triangolare superiore di
, ed al posto della
vengono memorizzate nella
parte inferiore le parti significative dei vettori di
associati a ciascuna colonna della matrice originaria.
%QRHOUSE %[x,A]=QRHOUSE(A,b) % %Pre: A è una matrice quadrata non singolare n x n; % b vettore di lunghezza n % % La procedura fornisce la fattorizzazione QR di una matrice % A e risolve % il sistema lineare Ax=b; Q è una matrice % ortogonale (Q'Q=I) e R è % triangolare superiore. % In x viene restituita la soluzione del sistema lineare mentre % in A viene %restituita una matrice che contiene nella sua % parte triangolare superiore % la matrice R e nella parte % strettamente triangolare inferiore le componenti % essenziali % dei vettori di householder che generano la matrice Q % See also HOUSE function [x,A]=QRhouse(A,b) n=length(b); % beta = 2/(v' * v) con v vettore di houseolder beta=zeros(1,n-1); gamma=zeros(1,n); for i=1:n-1 % adesso il vettore v si trova in % A(i:n,i) A(i:n,i)=house(A(i:n,i))'; beta(i)=2/([1;A(i+1:n,i)]'*[1;A(i+1:n,i)]); % calcola v'*y con y vettore colonna corrente for j=i+1:n gamma(j)=([1;A(i+1:n,i)]'*A(i:n,j)); end % aggiorna la riga i-esima for t=i+1:n A(i,t)=A(i,t)-gamma(t)*beta(i); end % viene aggiornata la sottomatrice in % esame per colonne, moltiplicando per % una matrice di Householder for j=i+1:n % prodotto vettoriale con fattore moltiplicativo % aggiuntivo -gamma(k)*beta(i) for k=i+1:n A(k,j)=A(k,j)-gamma(j)*A(k,i)*beta(i); end end end % aggiornamento termine noto x=b(:); for i=1:n-1 temp=beta(i)*[1;A(i+1:n,i)]'*x(i:n); x(i:n)=x(i:n)-temp*[1;A(i+1:n,i)]; end x=solveU(A,x); return
>> A A = 3.0000000000 1.0000000000 0.5000000000 0.8000000000 1.5000000000 9.0000000000 0.5000000000 0.6000000000 3.2000000000 4.0000000000 12.7000000000 3.2000000000 0.7000000000 3.2000000000 4.1000000000 11.3000000000 >> b b = 0.50000000000000 1.20000000000000 3.00000000000000 6.20000000000000 >> inv(A)*b ans = -0.01092762955907 0.09772671951632 0.08447073456824 0.49102600234596 >> QRHouse(A,b) ans = -0.01092762955907 0.09772671951632 0.08447073456824 0.491026002345962004-05-29