Diskussion:Givens-Rotation
Überarbeiten
BearbeitenFormal habe ich getan, was ich konnte, aber inhaltlich: Der letzte Absatz erweckt den Eindruck, einen wichtigen Inhalt transportieren zu sollen, wird diesem Anspruch aber in keinster Weise gerecht. Wer kann übersetzen?
Nebenbei: Ist die Verwendung der Transponierten der Givensmatrix bei der Rotation korrekt?
84.161.141.153 19:58, 11. Nov 2005 (CET)
- Ich hoffe so ist es etwas besser. Es sollte vielleicht noch einmal beispielhaft gezeigt werden, wie man überhaupt auf eine Givens-Rotationsmatrix kommt.--CHW 20:16, 29. Nov 2005 (CET)
Bin mir 99,9% sicher, dass das Beispiel fehlerhaft ist. Ändere das mal schnell selbst. Beste Grüße Alex
Soweit ich das nachvollziehen kann ist mein Rechenaufwand größer, mit O(m!*[2*n*(n-1)+6]) überschlagen sind das O(m! * 2n^2) Gruß, Daniel
- Das ist schon so richtig das mit der Fakultät wäre ja praktisch der helle Wahnsinn. 1000!*5^2 Rechenoperationen würden wohl den schnellsten Computer umhauen ;-) --Mathemaduenn 20:30, 23. Mai 2007 (CEST)
Im Beispiel und in der Formel ist irgendwie der Wurm drin: In der Formel wird auf das Matrix-Element ajj zugegriffen. Bei G_{1,4} wäre dass dann ja a_{4,4}, aber A hat keine vierte Spalte. Kann doch irgendwie nicht sein, oder? Auch bei quadratischen Matrizen kommt nichts gescheites raus, hab den Algorithmus mal in Matlab geschrieben.
function G = givens_example_doesnt_work(A, i, j) aij = A(i,j); ajj = A(j,j); p = sign(ajj)*sqrt(ajj^2+aij^2); c = ajj/p; s = -ajj/p; G = eye(size(A)(1)); G([i j],[i j]) = c; G(i,j) = -s; G(j,i) = s; end
Hi, habe mich damit beschäftigt und packe dir eben die Lösung rein, VG der Martin
function [Q,R] = QR_Givens(A) m = size(A,1); n = size(A,2); Q = eye(m,m); for i=1:n-1 for j=m:-1:i roh = sign(A(i,i))*sqrt(A(i,i)^2 + A(j,i)^2); c = A(i,i)/roh; s = A(j,i)/roh; H = G(i,j,c,s,m); Q = H * Q; A = H * A; end end R = A; end
function [R] = G(i,j,c,s,m) R = eye(m,m); R(i,i) = c; R(i,j) = s; R(j,i) = -s; R(j,j) = c; (nicht signierter Beitrag von 88.78.117.8 (Diskussion) 16:57, 18. Dez. 2013 (CET)) end
G*A oder G'*A sieht aber irgendwie nicht so aus wie erwartet. Gruß Max
- wenn du s = -ajj/p; auf s = -aij/p; ausbesserst liefert G'*A das gewünschte Ergebnis
- G(1,4) greift auch nicht auf a_{4,4} zu. Die richtige Notation wäre ja G(1,4,delta) wobei 1,4 angibt dass die erste und 4 Zeile rotiert werden und delta gibt den Winkel an - anstatt aber den Winkel zu berechnen ist es hier einfacher s und c direkt nach der angegebenen Vorschrift zu berechnen. Null setzen wollen wir hier a_{4,1} und a_{4,2} wir greifen also nur auf a_{1,1} und a_{2,2} zu.
- lg Wdvorak 16:10, 3. Sep. 2008 (CEST)
Lemma
BearbeitenAlso den Begriff Givens-Drehung habe ich noch nie gehoert. Rotation ist ein gebraeuchlicher deutscher Begriff. --P. Birken 13:36, 7. Feb. 2007 (CET)
- Hmm mir ging's genau umgekehrt. Eigentlich würde imho auch keiner zu einer Drehung Rotation sagen. Muß ich nochmal in 2-3 Bücher schauen. --Mathemaduenn 14:08, 7. Feb. 2007 (CET)
- Ich habe es in der Vorlesung "Methoden der Informationstechnik: Digitale Mobilfunksysteme I + II" an der Uni-Dortmund unter dem Namen Givens-Rotation kennen gelernt. Auch in dem Skript wird ausschlißlich Givens-Rotation benutzt. Gruß André 8. Feb. 2007
Im Köckler/Schwarz wird der Begriff Givens-Rotation verwendet. Givens-Drehung habe ich auch noch nicht gehört. --Stefan Birkner 17:20, 7. Feb. 2007 (CET)
- Zurück vom kurzen Literaturcheck -Ergebnis unbefriedigend
- in "Schwarz Numerische Mathematik" heißt das beschriebene Jacobi-Rotationen(der nennt die Givensrotation eine spezielle Jacobi Rotation also offenbar etwas anderes als das hier beschriebene?)
- in "Schwetlick Numerische lineare Algebra" heißt es Givens-Drehung
- in "Martin Hanke-Bourgeois Grundlagen der Numerischen Mathematik und des Wissenschaftlichen Rechnens" heißt's Givens-Rotation
@Stefan Kannst Du nochmal nachschauen ob das beschriebene dort nicht auch Jacobi Rotation heißt? --Mathemaduenn 17:40, 7. Feb. 2007 (CET)
- Ich hab's mal wieder zurückverschoben und nach Schwarz die "Jacobi Rotationen" mit reingeschrieben. Nach googel Test scheints mir doch eher eine einzelne Verwendung von Herrn Schwetlick gewesen zu sein. Grüße --Mathemaduenn 14:20, 8. Feb. 2007 (CET)
Änderung
BearbeitenDie Konvention für Matrizen ist: zuerst die Zeile i, dann die Spalte j (nicht signierter Beitrag von 84.63.70.251 (Diskussion | Beiträge) 02:50, 15. Dez. 2009 (CET))
Q Matrix
BearbeitenWas ist dieses klein t hinter
auf die Englische Seite ist es nicht vorhanden und es ist hier nicht erklärt. Sollte es T sein? (nicht signierter Beitrag von 95.117.103.239 (Diskussion) 14:21, 27. Mai 2011 (CEST))
Ich habe die notation im beispiel überarbeitet - hoffe das passt jetzt so - Wdvorak 14:52, 27. Mai 2011 (CEST)
Fehler im Beispiel
BearbeitenDas Beispiel scheint mir falsch zu sein, die zweite Zeile und die letzte Spalte von Q sind nicht normiert. Es muss wohl "1/sqrt(5)" statt "1/5" heißen oder sieht das jemand anders? --F GX 17:57, 23. Jul. 2011 (CEST)
- Ich habe es jetzt nachgerechnet und korrigiert. --F GX 15:36, 24. Jul. 2011 (CEST)
Implementierungsvorschrift
BearbeitenHallo ich glaube einige Fehler bei der Implemetierungsvorschrift für die Givens-Matrix gefunden zu haben. Für eine G(i, k)j,l Matrix ergeben sich laut Vorschrift nur dann in der Diagonale eine 1, wenn j==l gilt. Beispiel: Für eine Matrix G(i, k)1,3 entstehen in der Diagonalen somit niemals Einsen. Die anderen Vorschriften sollten auch mal geprüft werden. Aus meiner Sicht müsste es lauten:
G(i, k, θ)j,l = cos(x), für i=k=l oder i=k=j
G(i, k, θ)j,l = -sin(x), für i=l und k=j
G(i, k, θ)j,l = sin(x), für i=j und k=l
G(i, k, θ)j,l = 1, für i=k und k≠l oder i=k und k≠j
G(i, k, θ)j,l = 0, für alle weiteren Fälle
Falls ich mich nicht irre, könnte es sein dass jemadn mit den Indizes durcheinandergekommen ist? Ich würde außerdem Vorschlagen die die Matrix mit G(i,j)k,l, das wirkt etwas natürlicher.
Implementierungsbeispiel in Matlab für G(i, k, θ)j,l: ------------------
x = 2/3*pi(); s = sin(x); c = cos(x); m = 5;
j = 5; l = 4; G(:, :) = zeros(m);
for k = 1: m
for i = 1: m if i==k if i==l || k==j G(i, k) = c; else G(i, k) = 1; end elseif i==j && k==l G(i, k) = s; elseif i==l && k==j G(i, k) = -s; else G(i, k) = 0; end end
end (nicht signierter Beitrag von 141.57.62.242 (Diskussion) 18:13, 21. Jan. 2021 (CET))