|
Autor |
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  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  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  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  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  Dabei seit: 07.02.2003 Mitteilungen: 247
 | Beitrag No.7, eingetragen 2003-05-23
|
Profil
|
sternenstaub
Senior  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  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  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. |
|
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]
|