|
markuman |
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 19.12.2012, 10:36
Titel: Rückwärtseinsetzen
|
|
r*x=b
r ist eine obere rechte Dreiecksmatrix. Das ganze möchte ich durch rückwärtseinsetzen lösen. Matlab macht das einfach mit r\b.
Soweit so gut. Mit simplen Matrizen funktioniert mein Script auch. Jedoch nicht wenn auf der Hauptdiagonalen von r eine Null ist, was sich ja durch pivotisierung verhindern lässt.
Jetzt sind meine Matrizen allerdings etwas größer und auf der Hauptdiagonalen befindet sich keine Null (Es liegt auch ein Diagonalcheck Script im Anhang). Jedoch funktioniert mein rwtest Script nicht mehr. Dateien, siehe Anhang.
Wie ihr sehen könnt, passt das nicht mehr.
Gibt es weitere kriterien (ausser dass auf der Hauptdiagonalen keine Null sein darf (Division durch Null)) auf die man beim Rückwärtseinsetzen achten muss? Oder weist mein rwtest.m Script fehler auf? Mit den Beispielmatrizen oben funktioniert es jedenfalls.
Beschreibung: |
|
Download |
Dateiname: |
rw.zip |
Dateigröße: |
7.59 KB |
Heruntergeladen: |
573 mal |
|
|
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 19.12.2012, 16:28
Titel:
|
|
Hallo,
ja, der Rang muss gleich n sein. Ansonsten verwende besser eine QR-Zerlegung. Die funktioniert stets.
Grüße, Marc
|
|
|
markuman |
Themenstarter
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 20.12.2012, 07:43
Titel:
|
|
Matrix r ist ja genau erst durch eine QR-Zerlegung entstanden
Die Ursprüngliche Matrix war 445 Zeilen mal 35 Spalten. A*x=B
Wenn man A in Q und R zerlegt hat, hat man laut Wikipedia R*x=Q'*B.
Bleibt R*x=B über und man kann das mittels rückwärtseinsetzen lösen....laut Wikipedia
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 20.12.2012, 09:07
Titel:
|
|
Das mit der QR-Zerlegung hättest du ruhig schon erwähnen können. Wikipedia verrät (wie so oft) nur die Hälfte. Man löst nach QR-Zerlegung R*x=Q'*b und es bleibt ein R*x=Q'*c, wobei nur die ersten n Zeilen von R von 0 verschieden sind, so dass man im Grunde [R';0]*x=Q'*[c1;c2] lösen muss durch Rückwärtseinsetzen. Die untere Gleichung liefert nur Fehlerterme. Die obere Gleichung gilt es daher zu lösen.
|
|
|
markuman |
Themenstarter
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 20.12.2012, 09:20
Titel:
|
|
MaFam hat Folgendes geschrieben: |
Das mit der QR-Zerlegung hättest du ruhig schon erwähnen können. Wikipedia verrät (wie so oft) nur die Hälfte. Man löst nach QR-Zerlegung R*x=Q'*b und es bleibt ein R*x=Q'*c, wobei nur die ersten n Zeilen von R von 0 verschieden sind, so dass man im Grunde [R';0]*x=Q'*[c1;c2] lösen muss durch Rückwärtseinsetzen. Die untere Gleichung liefert nur Fehlerterme. Die obere Gleichung gilt es daher zu lösen. |
Okey, das versteh ich nicht so ganz Ich hatte nie Numerik oder das Thema mit der QR-Zerlegung im Studium.
Woher weiß ich wie viele die ersten Zeilen sind?
Kennst du evtl eine URL oder eine ISBN in der die Schritte nach der QR-Zerlegung einfach erklärt sind?
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 20.12.2012, 09:35
Titel:
|
|
Beispiel:
oder besser so:
|
|
|
markuman |
Themenstarter
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 20.12.2012, 09:42
Titel:
|
|
Achso. Das macht mein Script ja im prinzip mit
Es greift sich n heraus und fängt mit der Zeile n mit dem Rückwärtseinsetzen an. Zeilen >n:m fasst es nicht an.
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 20.12.2012, 09:45
Titel:
|
|
Klar, aber einfach nur über die Zeilen zu gehen, kann zu Fehlern führen. Besser ist es den Rang von A zu verwenden, oder den Rang von R. Diese sind stets gleich.
|
|
|
markuman |
Themenstarter
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 20.12.2012, 09:54
Titel:
|
|
Ahja, das liefert mir tatsächlich einen Rang 16.
Kannst du mir jetzt noch verdeutlichen was genau mit Q'*[c1;c2] gemeint ist?
Matlab liefert mir mit r\(q'*SOC) nämlich 35 Lösungen. Wenn ich mit Rang 16 Rückwärtseinsetze, komme ich nämlich nur auf 16 Lösungen.
|
|
|
markuman |
Themenstarter
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 20.12.2012, 10:10
Titel:
|
|
MaFam hat Folgendes geschrieben: |
Klar, aber einfach nur über die Zeilen zu gehen, kann zu Fehlern führen. Besser ist es den Rang von A zu verwenden, oder den Rang von R. Diese sind stets gleich. |
Mit ist aber auch ein Rätsel wieso r einen Rang von 16 hat.
http://paste.osuv.de/index.php/EjWWj/
Nur Zeile 36 und 37 sind für mich gleich Null.
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 20.12.2012, 13:49
Titel:
|
|
markuman hat Folgendes geschrieben: |
Ahja, das liefert mir tatsächlich einen Rang 16.
Kannst du mir jetzt noch verdeutlichen was genau mit Q'*[c1;c2] gemeint ist?
Matlab liefert mir mit r\(q'*SOC) nämlich 35 Lösungen. Wenn ich mit Rang 16 Rückwärtseinsetze, komme ich nämlich nur auf 16 Lösungen. |
Die Anzahl der Lösungen richtet sich nach der Länge von x, bzw. der Spaltenzahl von A. Ich habe keine Ahnung, was hinter r\(q'*SOC) steckt.
Mir auch!
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 20.12.2012, 14:03
Titel:
|
|
Ich kann mir das nur so erklären, dass die Kondition von r drastisch mies sein muss....
|
|
|
markuman |
Themenstarter
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 20.12.2012, 14:12
Titel:
|
|
MaFam hat Folgendes geschrieben: |
Die Anzahl der Lösungen richtet sich nach der Länge von x, bzw. der Spaltenzahl von A. Ich habe keine Ahnung, was hinter r\(q'*SOC) steckt.
|
In meinem kleinen Testszenario hat A 37 Zeilen und 35 Spalten. B (was ich vorhin SOC genannt hatte ) hat 37 Zeilen und 1 Spalte.
Nachdem A zu q und r zerlegt wurde, ist q= 37x37 groß und r 37x35 (wie A).
Nachdem ich q'*B gerechnet habe, ist das Ergebnis b 37x1 groß.
Es bleibt r(37x35)*x=b(37x1)
Der Rang ist von r und A 16.
Löse ich direkt mittels A\B, ist x 35 Zeilen und 1 Spalte groß. (Ist das selbe Ergebnis wie wenn ich x=r\(q'*b) eingebe. Mit fehlt jetzt quasi der letzte Schritt....bei dem was da wirklich passiert).
MaFam hat Folgendes geschrieben: |
Mir auch! |
It's Magic
Und dann noch dieser verfluchte Backslash Operator, keiner weiß was er immer macht, aber er macht immer das richtige.
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 20.12.2012, 15:16
Titel:
|
|
markuman hat Folgendes geschrieben: |
Kannst du mir jetzt noch verdeutlichen was genau mit Q'*[c1;c2] gemeint ist?
|
Eigentlich ist Q'*[b1;b2]=[c1;c2]. Man entfernt die Nullzeilen in R und ebenso viele Zeilen in b, so dass man nur noch mit R_red und c1 rechnet.
Ansonsten müsste das alles prima funktionieren, wenn der Rang korrekt berechnet werden würde. Das ist ja hier mit 16 überhaupt nicht der Fall. Ich vermute, wie gesagt, dass die Kondition von A dafür verantwortlich ist. Allerdings kann der Backslash-Operator damit ja auch umgehen...
|
|
|
markuman |
Themenstarter
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 20.12.2012, 15:22
Titel:
|
|
MaFam hat Folgendes geschrieben: |
Eigentlich ist Q'*[b1;b2]=[c1;c2]. Man entfernt die Nullzeilen in R und ebenso viele Zeilen in b, so dass man nur noch mit R_red und c1 rechnet.
|
Ok, das hätte ich dann auch so gemacht. Danke.
MaFam hat Folgendes geschrieben: |
Ansonsten müsste das alles prima funktionieren, wenn der Rang korrekt berechnet werden würde. Das ist ja hier mit 16 überhaupt nicht der Fall. Ich vermute, wie gesagt, dass die Kondition von A dafür verantwortlich ist. Allerdings kann der Backslash-Operator damit ja auch umgehen... |
Ja, Rang 16, aber x ist trotzdem 35x1 groß.
Ich versuch dem mal noch weiter nach zu gehen. Danke schon mal!
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|