WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Rückwärtseinsetzen

 

markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 19.12.2012, 10:36     Titel: Rückwärtseinsetzen
  Antworten mit Zitat      
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.

Code:
>> A=round(10*rand(10,7))

A =

     5     2     2     8     1     6     9
     2     8     6     1     9     2     7
     7     8    10     5     6     3     4
     0     6     8     8     2     9     7
     1     0     3     7     6     9     8
    10     4     7     1     9     8     6
    10     9     4     4     8     9     1
     0     7    10     4     7     2     9
     5     4     1     5     5     5     1
     9     6     3     6     3     6     5

>> b=round(10*rand(10,1))

b =

     1
     4
     8
     2
     9
     7
     4
     2
     3
     8

>> r=triu(A)

r =

     5     2     2     8     1     6     9
     0     8     6     1     9     2     7
     0     0    10     5     6     3     4
     0     0     0     8     2     9     7
     0     0     0     0     6     9     8
     0     0     0     0     0     8     6
     0     0     0     0     0     0     1
     0     0     0     0     0     0     0
     0     0     0     0     0     0     0
     0     0     0     0     0     0     0

>> r\b

ans =

  -2.599583333333333
  -2.085416666666668
   0.573958333333333
  -0.697916666666667
  -0.645833333333333
  -2.125000000000001
   4.000000000000001

>> rwtest

x =

  -2.599583333333334
  -2.085416666666667
   0.573958333333333
  -0.697916666666667
  -0.645833333333333
  -2.125000000000000
   4.000000000000000

>> clear all
>> A=round(10*rand(10,7))

A =

     0     1     7     1     7     1     9
     7     6     1     9     1     7     5
     6     2     8     1     7     6     6
     7     5     7     4     4     1     5
    10     4     9     6     8     1     1
     4     3     1    10     4    10     9
     3     7     9     5     3     5     3
     9     5     5    10    10     0     3
     8     8     6     2     7     1     6
     5     2     3     4     4     1     5

>> r=triu(A)

r =

     0     1     7     1     7     1     9
     0     6     1     9     1     7     5
     0     0     8     1     7     6     6
     0     0     0     4     4     1     5
     0     0     0     0     8     1     1
     0     0     0     0     0    10     9
     0     0     0     0     0     0     3
     0     0     0     0     0     0     0
     0     0     0     0     0     0     0
     0     0     0     0     0     0     0

>> b=round(10*rand(10,1))

b =

     4
     7
     9
     6
     3
     2
     4
     0
     9
     6

>> r\b
Warning: Rank deficient, rank = 6,  tol =   3.5666e-014.

ans =

                   0
  -1.112619048314711
   0.373622118378340
   1.217374997769532
   0.297004910108733
   0.243000111966904
   0.026772403215672

>> rwtest

x =

                -Inf
   1.439236111111111
   0.614583333333333
  -0.250000000000000
   0.333333333333333
  -1.000000000000000
   1.333333333333333


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.

Code:

>> r=dlmread('r.dlmread');
>> b=dlmread('b.dlmread');
>>r\b
>> rwtest, x
 


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.

rw.zip
 Beschreibung:

Download
 Dateiname:  rw.zip
 Dateigröße:  7.59 KB
 Heruntergeladen:  573 mal
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 19.12.2012, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

ja, der Rang muss gleich n sein. Ansonsten verwende besser eine QR-Zerlegung. Die funktioniert stets.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 20.12.2012, 07:43     Titel:
  Antworten mit Zitat      
Matrix r ist ja genau erst durch eine QR-Zerlegung entstanden Smile
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
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 20.12.2012, 09:07     Titel:
  Antworten mit Zitat      
Das mit der QR-Zerlegung hättest du ruhig schon erwähnen können. Smile 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.
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 20.12.2012, 09:20     Titel:
  Antworten mit Zitat      
MaFam hat Folgendes geschrieben:
Das mit der QR-Zerlegung hättest du ruhig schon erwähnen können. Smile 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 Smile 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?
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 20.12.2012, 09:35     Titel:
  Antworten mit Zitat      
Beispiel:

Code:

n=3;
m=8;
A=rand(m,n);
[Q,R]=qr(A);

R_red=R(1:n,:);
% Nun R_red für die Rückwärtseinsetzung verwenden, wenn der Rang von R_red=n
% ...
 


oder besser so:

Code:

n=3;
m=8;
A=rand(m,n);
[Q,R]=qr(A);

R_red=R(1:rank(A),:);
% Nun R_red für die Rückwärtseinsetzung verwenden
% ...
 
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 20.12.2012, 09:42     Titel:
  Antworten mit Zitat      
Achso. Das macht mein Script ja im prinzip mit
Code:

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 20.12.2012, 09:45     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 20.12.2012, 09:54     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 20.12.2012, 10:10     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 20.12.2012, 13:49     Titel:
  Antworten mit Zitat      
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.

markuman hat Folgendes geschrieben:
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.


Mir auch! Shocked
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 20.12.2012, 14:03     Titel:
  Antworten mit Zitat      
Ich kann mir das nur so erklären, dass die Kondition von r drastisch mies sein muss....
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 20.12.2012, 14:12     Titel:
  Antworten mit Zitat      
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 Cool ) 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:

markuman hat Folgendes geschrieben:
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.


Mir auch! Shocked


Very Happy It's Magic
Und dann noch dieser verfluchte Backslash Operator, keiner weiß was er immer macht, aber er macht immer das richtige.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 20.12.2012, 15:16     Titel:
  Antworten mit Zitat      
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...
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 20.12.2012, 15:22     Titel:
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.