QR-Z. mit householder matlab < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 15:45 Fr 08.06.2012 | Autor: | Katthi |
Hallo Leute,
meine neue Aufgabe ist es, die QR Zerlegung mit Hilfe der Householder-Tranformatiin zu bestimmen.
habe auch schon einen amtlab code, aber wenn ich es mit beispielen teste, erhalte ich zwar die richtigen Dimensionen, aber nicht die richtigen Werte.
Wäre super, wenn ihr mal drüberschauen könntet.
Außerdem wird mir immernoch ein ans ausgegebn, obwohl ich überall ein Semikolon gesetzt habe. das ans gibt mir nochmal die Matrix Q aus.
function [Q,R] = qr_householder(A);
% Berechnung von Q und R
[m,n]=size(A); % Bestimmen der Größe von A, m Zeilen & n Spalten
Q = eye(m); % Q als m x m Einheitsmatrix initialisieren
for i=1:(m-1) % Initialisierung einer Schleife mit der Zählvariablen i,
% die von 1 bis m-1 (Anzahl Zeilen - 1) läuft
x = A(i:m,i); % Festlegen des jeweiligen Spaltenvektors auf den Vektor x
v = x; % Duplizieren von x auf v (Householder Vektor)
v(1) = x(1) + sign(x(1)) * norm(x);
% Bestimmen des jeweiligen Householder Vektors
% dabei ändert sich nur das erste Element v(1) des Vektors v
% man verwendet das signum(x1) um Auslöschung zu vermeiden,durch norm(x)
% verwenden wir die euklidische Norm das "+ sign..." erhält man durch die
% Konstruktion aus der Vorlesung durch sigma = - sign(x1)*norm(x)
Q(i:m,:) = Q(i:m,:)-2/(v'*v)*(v*v')*Q(i:m,:); % Folgematrix Q aus ihrem
% Vorgänger bestimmen
A(i:m,:) = A(i:m,:)-2/(v'*v)*(v*v')*A(i:m,:); % A(neu) = Q * A(alt)
end
Q
R = A % die im (m-1)-ten Schritt erzeugte Matrix A ist die
% gesuchte obere rechte Dreiecksmatrix R
end
Viele Grüße
Katthi
|
|
|
|
> Hallo Leute,
Sind Matlab-Wochen?
>
> meine neue Aufgabe ist es, die QR Zerlegung mit Hilfe der
> Householder-Tranformatiin zu bestimmen.
> habe auch schon einen amtlab code, aber wenn ich es mit
> beispielen teste, erhalte ich zwar die richtigen
> Dimensionen, aber nicht die richtigen Werte.
> Wäre super, wenn ihr mal drüberschauen könntet.
>
> Außerdem wird mir immernoch ein ans ausgegebn, obwohl ich
> überall ein Semikolon gesetzt habe.
Vorneweg: Ich seh es
Wenn du ganz rechts im Codeeditor von Matlab über die orangfarbenen Striche die Maus setzt, so siehst du Hinweise u.a. auch über das Semikolon (setzt natürlich voraus, dass die Matlabversion nicht aus der Steinzeitnist)
> das ans gibt mir
> nochmal die Matrix Q aus.
>
> function [Q,R] = qr_householder(A);
>
> % Berechnung von Q und R
>
> [m,n]=size(A); % Bestimmen der Größe von A, m Zeilen & n
> Spalten
>
> Q = eye(m); % Q als m x m Einheitsmatrix initialisieren
>
> for i=1:(m-1) % Initialisierung einer Schleife mit der
> Zählvariablen i,
> % die von 1 bis m-1 (Anzahl Zeilen - 1)
> läuft
>
> x = A(i:m,i); % Festlegen des jeweiligen Spaltenvektors auf
> den Vektor x
>
> v = x; % Duplizieren von x auf v (Householder Vektor)
>
> v(1) = x(1) + sign(x(1)) * norm(x);
> % Bestimmen des jeweiligen Householder Vektors
> % dabei ändert sich nur das erste Element v(1) des
> Vektors v
> % man verwendet das signum(x1) um Auslöschung zu
> vermeiden,durch norm(x)
> % verwenden wir die euklidische Norm das "+ sign..."
> erhält man durch die
> % Konstruktion aus der Vorlesung durch sigma = -
> sign(x1)*norm(x)
>
> Q(i:m,:) = Q(i:m,:)-2/(v'*v)*(v*v')*Q(i:m,:); % Folgematrix
> Q aus ihrem
> % Vorgänger bestimmen
>
> A(i:m,:) = A(i:m,:)-2/(v'*v)*(v*v')*A(i:m,:); % A(neu) = Q
> * A(alt)
>
> end
>
> Q
> R = A % die im (m-1)-ten Schritt erzeugte Matrix
> A ist die
> % gesuchte obere rechte Dreiecksmatrix R
> end
>
> Viele Grüße
>
> Katthi
Ich habe jetzt auch gesucht. Irgendwie kommt Matlab nicht mit den Multiplikationen von den Teilmatrizen A(i:m,:) klar.
Ich finde jetzt aber auch nicht konkret den Fehler. Baut man sich hingegen die ganze Houlholdermatrix, so klappt die Multiplikation. Sehr eigenartig!
Bei deiner Schreibweise oben werden irgendwie auch die Teile der Matrix mit manipuliert, die eigentlich bleiben müssten.
So klappt es:
function Q=qr_householder(A)
% Berechnung von Q und R
[m,n] = size(A);% Bestimmen der Größe von A, m Zeilen & n Spalten
Q = eye(m);
for i=1:m-1 % Initialisierung einer Schleife mit der Zählvariablen i,
% die von 1 bis m-1 (Anzahl Zeilen - 1) läuft
x = A(i:m,i); % Festlegen des jeweiligen Spaltenvektors auf den Vektor x
v=x;% Duplizieren von x auf v (Householder Vektor)
v(1) = x(1) + sign(x(1))*norm(x);
H = eye(m-i+1) - 2*v*v'/(v'*v);
H = [eye(i-1) zeros(i-1,m-i+1); zeros(m-i+1,i-1) H];
A = H*A; % A(neu) = Q * A(alt)
Q = Q*H; % Folgematrix Q aus ihrem
% Vorgänger bestimmen
end
R = A; % die im (m-1)-ten Schritt erzeugte Matrix A ist die
% gesuchte obere rechte Dreiecksmatrix R
end
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 17:42 Fr 08.06.2012 | Autor: | Katthi |
haha ja so in etwa :D nee muss jede Woche diese Programmieraufgaben lösen und heute kam die für nächste Woche. wollte nur fleißig vorarbeiten ;)
Vielen Dank so klappt es =)
muss das jetzt dann wieder in die Orth_error function von gestern packen. und zwar mit den anderen Gram-Schmidt-Verfahren. dann sollte ja durch diesesn fprintf befehl diese tabellarische Form ausgegeben werden, aber im command window ist das dann irgendwie komisch und taucht bei jedem n, das ich bei der Vandermonde-Matrix eingebe immer wieder neu auf. so ganz richtig ist das doch nicht oder??
|
|
|
|
|
> haha ja so in etwa :D nee muss jede Woche diese
> Programmieraufgaben lösen und heute kam die für nächste
> Woche. wollte nur fleißig vorarbeiten ;)
>
> Vielen Dank so klappt es =)
>
> muss das jetzt dann wieder in die Orth_error function von
> gestern packen. und zwar mit den anderen
> Gram-Schmidt-Verfahren. dann sollte ja durch diesesn
> fprintf befehl diese tabellarische Form ausgegeben werden,
> aber im command window ist das dann irgendwie komisch und
> taucht bei jedem n, das ich bei der Vandermonde-Matrix
> eingebe immer wieder neu auf. so ganz richtig ist das doch
> nicht oder??
Was taucht auf?
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 17:51 Fr 08.06.2012 | Autor: | Katthi |
oh :D
diese Tabelle taucht da bei jedem n auf.
das n sollte ja in 5er Abständen gehen, aber trotz der Änderung mit dem [mm] \n [/mm] zeigt der 20er Schritte an.
Vielleicht weißt du ja, woran das liegt, sonst bleibt es halt so... =)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:08 Fr 08.06.2012 | Autor: | wieschoo |
Kopier mal die Tabelle (und eventuell den Code), der diese erzeugt hier hinein.
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 09:08 Sa 09.06.2012 | Autor: | Katthi |
Guten morgen =)
Also ich habe ein Skript file geschrieben, indem alle Verfahren für die verschiedenen n durchlaufen werden und jeweils dann diesen orth_error des jeweiligen Verfahrens berechnen,
aber genau dabei bin ich mir unsicher, ob das so geht. so sieht das aus:
n = [5:5:150];
for k = n
V(k); % Matrix erstellen
Q1 = qr_gram_schmidt(V(k));% erstes Verfahren drauf anwenden
e1 = orth_error(Q1);% das orth_error berechnen
Q2 = qr_gram_schmidt(V(k)); % zweites Verfahren drauf anwenden
e2 = orth_error(Q2);% das orth_error berechnen
Q3 = qr(V(k)); % drittes Verfahren drauf anwenden
e3 = orth_error(Q3);% das orth_error berechnen
Q4 = qr_householder(V(k)); % viertes Verfahren drauf anwenden
e4 = orth_error(Q4); % das orth_error berechnen
[mm] fprintf('%d:\n [/mm] %e %e %e [mm] %e\n',n, [/mm] e1, e2, e3, e4);
end
bei dem fprintf zeigt der irgendwie nicht alles an. der erste EIntrag ist ohne Leerzeichen ' % d : \ n
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:20 Mo 11.06.2012 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|