Matroids Matheplanet Forum Index
Moderiert von matroid
Mathematik » Numerik & Optimierung » Ausgleichsproblem mit (Gaußschen Normalgleichungen)
Autor
Kein bestimmter Bereich J Ausgleichsproblem mit (Gaußschen Normalgleichungen)
Anonymous
Unregistrierter Benutzer
  Themenstart: 2003-05-20

Hallo! Ich habe das Augleichproblem ||Ax-b||2 --> min mittels Gaußschen Normalgleichungen lösen. Gegeben ist ein überbestimmtes GLS. A ist rechteckige Vandermondematrix A <- R hoch m x n für n < m Bsp:           A                 *         x         =     b (1.000, 1.000, 1.000)         (x0)             b0 (1.000, 0.100, 0.010)   *    (x1)       =    b1   (1.000, 0.200, 0.040)         (x2)             b2 (1.000, 0.300, 0.090)                           b3 Wie kann ich die "Gausschen" Normalgleichungen mittels Matlab aufstellen. Kann mir jemand ein Beispiel geben? Wie gehe ich danach weiter vor. Hoffe es kann mir jemand weiterhelfen. lg NEO


 
murmelbaerchen
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 03.02.2003
Mitteilungen: 4294
  Beitrag No.1, eingetragen 2003-05-20

Hallo Neo, eigentlich solltes Du dich doch mit der Matrix auskennen ;-)) Sorry, aber den musste ich jetzt loswerden. Also mit matlab kann ich dir nicht weiter helfen, da ich eher der Maplefraktion angehöre. Falls Du aber allgemein Problem mit dem Verfahren hast: || Ax -b || _2  --> min  Also die Minimierung nach der Methode der kleinsten Fehlerquadrate ist äquivalent zu folgender Gleichung A^T * A * x  = A^T *b Wobei A^T die transponierte ist. Man kann auch leicht zeigen, dann A^T*A immer invertierbar ist. Also kannst Du x direkt mittels Programm bestimmen: x= (A^T*A)^(-1)*A^T*b Ich hoffe das hilft Dir?? Murmelbärchen


   Profil
Thomatz
Ehemals Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.04.2003
Mitteilungen: 53
Wohnort: Bärlin
  Beitrag No.2, eingetragen 2003-05-22

Hallo, falls es Dir nur um die Lösung geht, schau mal in die Matlab-Hilfe unter 'backslash' oder 'mldivide'. Der Ausdruck x=A\b sollte eine solche Least-Square-Näherung liefern. Schöne Grüße


   Profil
sternenstaub
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2003
Mitteilungen: 247
  Beitrag No.3, eingetragen 2003-05-22

Also die transponierte einer Matrix erhaelst Du in Matlab, indem Du A' schreibst. Multiplikation, ganz klar mit *. Und die Matrix A eingeben sollte kein Problem sein, oder? Gruesse Sternenstaub


   Profil
Anonymous
Unregistrierter Benutzer
  Beitrag No.4, vom Themenstarter, eingetragen 2003-05-22

Hallo! Danke erstmal für eure Antworten, waren großteils sehr hilfreich. *g* Es geht leider nicht nur um die Lösungen. Ich muss die Gaußschen NOrmalgleichungen aufstellen und dann lösen. Weiß zufällig jemand wie man in Matlab mti einfacher GEanuigkeit rechen kann? Doppelt ist ja kein Problem. TEilweise bekomme ich unschöne Lösungen, weiß jemand wie ich das umgehen kann? Warning: Matrix is close to singular or badly scaled.         Results may be inaccurate. RCOND = 4.870837e-019.> In C:\Aktuell\Matlab\work\gngldoub.m at line 18 ans =  1.0e+002 *  -0.02509050786728   0.25190308419988  -0.66918953203131   1.49632173894905  -1.33943813241436   0.54883030504920  -0.20128122505499  -0.18045656289381   0.01134536103811   0.13072704779537  -0.23771426377109   0.25990965823441  -0.20812527452874   0.12498407206443  -0.04999983421043   0.01999999737035 Vielen DAnk nochmals Neo


 
sternenstaub
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2003
Mitteilungen: 247
  Beitrag No.5, eingetragen 2003-05-22

Hi, die Kondition von A^T*A ist das Quadrat der Kondition von A. Bei Ausgleichsproblemen ist A meist schon schlecht konditioniert, d.h. A^T*A erst recht. Darauf deutet die Zeile Warning: Matrix is close to singular or badly scaled. hin. Deshalb löst man Ausgleichsprobleme eigentlich nicht mehr mit der Normalengleichung, sondern mittels einer QR-Zerlegung. Wenn Du nun wirklich eine Normalengleichung lösen mußt, mach eine Cholesky-Zerlegung mit (eventueller) Nachiteration. Aber was soll Dein Output ans sein? Da tauchen 16 Werte auf, das spräche für eine 4x4 Matrix, aber wo ist die her? A^T*A müßte eine 3x3 Matrix sein. Grüße Sternenstaub


   Profil
Anonymous
Unregistrierter Benutzer
  Beitrag No.6, vom Themenstarter, eingetragen 2003-05-23

Hallo! Ups... Hab vergessen dazuzusagen, dass das der Lösungsvektor der Normalgleichungen ist. Es handelt sich um ein überbestimmtes System. Wenn ich von den Normalgelichungen ausgehend das System mittels Cholesky löse, kann ich ev. diese unschönen Lösungsvektor vermeiden? Wie komme ich in Matlab über die Normalgleichungen mittels Cholesky zu Lösung? Wenn ich mich nicht täusche muss die Matrix best. Kriterine erfüllen um das Coleskyverfahren anwenden zu können. Weiß jemand was bez. einfacher GEnauigkeit. bis später Neo


 
sternenstaub
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2003
Mitteilungen: 247
  Beitrag No.7, eingetragen 2003-05-23

Das verstehe ich nicht, wie kann Dein Loesungsvektor 16 Eintrage haben? x muss doch ein 3d-Vektor sein! Um das Cholesky-Verfahren anwenden zu koennen muss die Matrix, die so zerlegt werden soll symmetrisch positiv definit sein. Die Symmetrie von A^T*A sieht man leicht. Fuer Pos.def. muss man sich das genauer anschauen: = Damit A^T*A pos def. ist, muss also Ax ungleich 0 sein fuer alle x ungleich 0. Das kannst Du recht einfach nachrechnen (versuch A soweit wie moeglich auf Dreicksgestalt zu kriegen). Die Cholesky-Zerlegung erhlaelst Du in Matlab mit dem Befehl chol. Cholesky kann nicht garantieren, dass Du keine Probleme bekommst, wenn die Matrix eine zu hohe Kondition hat ist es halt irgendwann aus, da hilft dann nur hoehere Genauigkeit. Cholesky ist aber im Gegensatz zur Gausszerlegung in jedem Fall stabil, dass heisst das Verfahren sorgt nicht noch dafur, dass sich die Rundungsfehler kummulieren. Gruesse Sternestaub P.S.: Melde Dich das naechste mal doch an, dann erscheinst du nicht als Anonymos [ Nachricht wurde editiert von sternenstaub am 2003-05-23 10:19 ]


   Profil
sternenstaub
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2003
Mitteilungen: 247
  Beitrag No.8, eingetragen 2003-05-23

Ach ja, noch was: Wenn Du eine Matrix A eingibst ist sie zunaechst immer double, B=single(A) liefert dann dieselbe Matrix in einfacher Genauigkeit. Edit: Aber rechnen kann man damit in der Regel nicht Gruesse Sternenstaub [ Nachricht wurde editiert von sternenstaub am 2003-05-23 12:14 ]


   Profil
Anonymous
Unregistrierter Benutzer
  Beitrag No.9, vom Themenstarter, eingetragen 2003-05-25

Hi again! Hm. Heißt, wenn die At * A nicht pos. definit ist und ich das Ausgleichsproblem über die Gaußschen NG lösen muss, ich zu keiner besseren Lösung kommen kann, da die Konditon so schlecht ist? Kann man die gefundene Lösung vielleicht trotzdem etwas schöner darstellen? Hab leider nicht sehr viel Ahnung von der Materie, wie ihr sicher schon bemerkt habt. Bin eher wie die Jungfrau zum Kind zu diesem Projekt gekommen. Vielleicht wird ja ein Jesus daruas. *g* lg Neo PS: Ich poste später noch ein konkretes Beispiel, wo so eine schlechte Lösung rauskommt.


 
Anonymous
Unregistrierter Benutzer
  Beitrag No.10, vom Themenstarter, eingetragen 2003-05-26

Konkretes Beispiel: Funktion: expx(sin(4*z))                0                  0                  0                           0    0.00012860082305   0.00077160493827   0.00462962962963    0.00411522633745   0.01234567901235   0.03703703703704    0.03125000000000   0.06250000000000   0.12500000000000    0.13168724279835   0.19753086419753   0.29629629629630    0.40187757201646   0.48225308641975   0.57870370370370    1.00000000000000   1.00000000000000   1.00000000000000                           0                           0   1.00000000000000    0.02777777777778   0.16666666666667   1.00000000000000    0.11111111111111   0.33333333333333   1.00000000000000    0.25000000000000   0.50000000000000   1.00000000000000  = A    0.44444444444444   0.66666666666667   1.00000000000000    0.69444444444444   0.83333333333333   1.00000000000000    1.00000000000000   1.00000000000000   1.00000000000000    x = ?        b =    0               0.16666666666667              0.33333333333333            0.50000000000000              0.66666666666667              0.83333333333333            1.00000000000000 Nach Aufstellung von Axt* A * x = Axt*b ermittele ich die Lösung über x = inv(Axt * A)*Axt*b x =   1.0e+002 *   -0.56042399788755    1.63419528398355   -1.59199908456173    0.50988151725530    0.00303792308062    0.01001011269909 Leider keine sehr schöne Lösung. Habs auch mit Cholesky probiert, schaut aber auch niht besser aus. Vielleicht hab ich irgendwo einen Fehler drin, wie muss ich da genau vorgehen? Gibts noch einen andren Weg um bessere Lösungen zu bekommen, außer die Genauigkeit zu erhöhen? Kann ich die Zahlen vielleicht irgendwie schöner anschreien bzw darstellen? Danke im voraus gute nacht neo


 
Anonymous
Unregistrierter Benutzer
  Beitrag No.11, vom Themenstarter, eingetragen 2003-05-26

Hi! Kann mir wirklich keiner weiterhelfen.  :-( lg Neo


 
sternenstaub
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2003
Mitteilungen: 247
  Beitrag No.12, eingetragen 2003-05-27

Hi! Was solll die Funktion expx(sin(4*z)) in Deinem Beispiel sein? Wie erhaelst Du die Matrix? Die Zahlenkolonnen tippe ich naemlich nicht ab, um das nachzurechen. Wie gross ist den der Fehler der Loesung, sprich wenn Du Ax-b rechnest, wie weit bist Du vom Nullvektor entfernt? Du schreibst x = inv(Axt * A)*Axt*b was sollen die ganzen x auf der rechten Seite??? Gruesse Sternestaub


   Profil
sternenstaub
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2003
Mitteilungen: 247
  Beitrag No.13, eingetragen 2003-05-27

So jetz hab' ich Dein Beispiel doch mal nachvollzogen, wobei A die Vandermondsche Matrix zu den Stuetzstellen 0,1/6,2/6,3/6,4/6,5/6,1 darstellen soll, oder? Und b=[0,1/6,2/6,3/6,4/6,5/6,1] Ich hab A aufgestellt (da gibt es in Matlab uebrigens den Befehl vander), b eingegeben und schliesslich mit x=(A'*A)\(A'*b)) geloest. Anschliessend noch einmal mit x=inv(A'*A)*(A'*b)) Ich habe Loesungen x erhalten, deren Residuum (Ax-b) sich in der Groessenordnung von 10^(-13) bzw. 10(-9) bewegte, das ist doch voellig o.k., oder? Die Kondition von A'*A ist im Berecih 10^7, das ist zwar nicht gut, aber bei doppelter Genauigkeit der Rechnung noch voll ok. Gruesse Sternenstaub [ Nachricht wurde editiert von sternenstaub am 2003-05-27 10:31 ]


   Profil
Das Thema wurde von einem Senior oder Moderator abgehakt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]