In der Statistik kommt es oft vor, dass eine Serie von
Ausgleichsproblemen gelöst werden muss, wobei die Matrix
jeweils nur wenig ändert. Wir betrachten dazu die
folgende Problemstellung:
Gegeben sei die QR-Zerlegung
mit
. Gegeben seien ferner die Vektoren
und
.
Kann man die QR-Zerlegung der Matrix
Es ist
mitDer Algorithmus besteht aus drei Schritten:
![]() |
![]() |
|
![]() |
function [G ] = rot(m,i,k,x,y); % [G ] = rot(m,i,k,x,y); % konstruiert eine orthogonale Matrix G mxm, welche y zu null rotiert G = eye(m,m); if y~=0, cot = x/y; si = 1/sqrt(1+cot^2); co = si*cot; G(i,i) = co; G(k ,k) = co; G(i,k) = si; G(k,i) = -si; end;
Damit kann das folgende Programm geschrieben werden. Nach jeder Rotation wurde ein Pausenbefehl eingefügt, man kann damit den Ablauf des Algorithmus leicht verfolgen.
A= rand(7,4);
u=rand(7,1);
v=[1 2 3 4]';
[m n] = size(A);
[Q R] = qr(A);
QS =Q;
RS = R;
%
w = Q'*u
disp(' 1. Phase: Anullieren w(n+2:m) und aendern nur Q')
for i=m:-1:n+2,
G= rot(m,i-1,i,w(i-1), w(i))
w = G*w
QS = QS*G';
pause
end;
disp(' 2. Phase Annullieren w(2:n+1) und aendern R und Q')
for i= n+1:-1:2,
G= rot(m,i-1,i,w(i-1), w(i))
w = G*w
RS = G*RS
QS = QS*G';
pause
end
disp(' Addieren jetzt die Rang 1 Mod. zur ersten Zeile von R')
RS = RS + w*v'
pause
disp(' 3.Phase: RS ist nun Hessenberg und wird reduziert')
for i = 1:n,
G= rot(m,i,i+1,RS(i,i), RS(i+1,i))
RS = G*RS
QS = QS*G';
pause
end
disp(' Kontrolle')
AS = A + u*v'; [qs rs] = qr(AS);
qs
QS
rs
RS
Nun ist es einfach die Demonstrationsversion zu einem effektiven
Programm umzuschreiben. Wir benötigen dazu eine Funktion giv, um die Rotationswinkel, bzw. den
und
davon zu
berechnen:
function [s,c] = giv(x,y); % bestimmt eine Givensrotation, % welche y zu null rotiert if y~=0, cot = x/y; s = 1/sqrt(1+cot^2); c = s*cot; else c=1; s=0; end
Im nachfolgenden Programm werden die Transformationen nicht mehr durch Multiplikation mit vollen Matrizen ausgeführt. Es werden nur noch jene Elemente neu berechnet, die von den Givensrotationen betroffen sind.
Man beachte, dass in MATLAB Vektoroperationen sehr gut dargestellt werden können, z. B. wird durch
rs(i,i-1:n) = -si*rs(i-1,i-1:n) + co*rs(i,i-1:n);
die
A= round(10*rand(7,4)) u=rand(7,1) v=[1 2 3 4]' [m n] = size(A); [Q R] = qr(A); QS =Q; RS = R; % w = Q'*u % anullieren w(n+2:m) und aendern nur Q for i=m:-1:n+2, [si , co]= giv(w(i-1), w(i)); w(i-1) = co*w(i-1) + si*w(i); % QS = QS*G'; h = QS(:,i-1); QS(:,i-1) = co*h + si*QS(:,i); QS(:,i) = -si*h + co*QS(:,i) end % annullieren w(2:n+1) und aendern R und Q for i= n+1:-1:2, [si , co]= giv(w(i-1), w(i)); % w = G*w w(i-1) = co*w(i-1) + si*w(i); % RS = G*RS h = co*RS(i-1,i-1:n) + si*RS(i,i-1:n); RS(i,i-1:n) = -si*RS(i-1,i-1:n) + co*RS(i,i-1:n); RS(i-1,i-1:n) = h % QS = QS*G'; h = QS(:,i-1); QS(:,i-1) = co*h + si*QS(:,i); QS(:,i) = -si*h + co*QS(:,i) end % Addieren jetzt die Rang 1 Mod. zur eRSten Zeile von R RS(1,:) = RS(1,:) + w(1)*v' % RS ist nun Hessenberg und wird reduziert for i = 1:n, [si , co]= giv(RS(i,i), RS(i+1,i)) % RS = G*RS h = co*RS(i,i:n) + si*RS(i+1,i:n); RS(i+1,i:n) = -si*RS(i,i:n) + co*RS(i+1,i:n); RS(i,i:n) = h % QS = QS*G'; h = QS(:,i); QS(:,i) = co*h + si*QS(:,i+1); QS(:,i+1) = -si*h + co*QS(:,i+1) end % Kontrolle AS = A + u*v'; [qs rs] = qr(AS); qs QS rs RS
Peter Arbenz 2008-09-24