Parameterbestimmung mit lsqnonlin - Konvergenzprobleme
Hackepeter
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.03.2012, 17:11
Titel: Parameterbestimmung mit lsqnonlin - Konvergenzprobleme
Hi,
Ich versuche gerade folgendes Optimierungssystem zu lösen:
Ich messe mehrere Punkte im Raum, die alle auf einer Geraden liegen und deren Abstand (d) zueinander bekannt ist.
Leider ist auf den Messungen ziemlich viel Rauschen drauf, deshalb möchte ich in 3D eine Gerade durch die Punkte fitten.
Allerdings brauche ich nicht nur die Richtung der Geraden, sondern auch eine genaue Schätzung der Lage des ersten Punktes.
Die Idee ist, dass ich dann mit den aus der Optimierung erhaltenen Vektoren a und r die Lage weiterer Punkte ganz einfach mit
p=a+i*d*r
berechnen kann.
Folgenden Ansatz habe ich mir überlegt:
mit
damit ein normierter Richtungsvektor rauskommt
a ist die geschätzte Lage für den ersten Punkt, d der bekannte exakte Abstand zwischen den Punkten, die gemessenen Punkte, wobei i von [0..{anzahl der punkte}-1] geht.
Folgendermaßen sieht mein Matlab-Code zur Optimierung mit vier Beispielpunkten aus:
Code:
function F = myfun(x)
p=[-0.357732117176056,-0.743793487548828,7.77998304367065;
-0.360314100980759,-0.719934403896332,7.81962966918945;
-0.361997991800308,-0.693021535873413,7.81095886230469;
-0.366450041532517,-0.669356286525726,7.86093759536743;]
d=0.04;
F=0;
for i=0:length(p(:,1))-1,
F = F+norm(x(1:3)-p(i+1,:)+i*d*[x(4) x(5)sqrt(1-x(4)^2-x(5)^2)]);
end end
als aufruf (das definierte p ist in beiden identisch).
Leider konvergiert das ganze so nicht. Ist die Idee richtig, oder hab ich da etwas komplett falsch gemacht? Von nichtlinearer Optimierung hab ich leider überhaupt keine Ahnung.
Hackepeter
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.03.2012, 17:16
Titel:
Sorry, F sieht folgendermaßen aus, ich habe die Summe vergessen:
Hackepeter
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.03.2012, 17:22
Titel:
Ich habe die Fehlerfunktion mal folgendermaßen angepasst:
Code:
function F = myfun(x)
p=[-0.357732117176056,-0.743793487548828,7.77998304367065;
-0.360314100980759,-0.719934403896332,7.81962966918945;
-0.361997991800308,-0.693021535873413,7.81095886230469;
-0.366450041532517,-0.669356286525726,7.86093759536743;];
d=0.04;
F=[];
for i=0:length(p(:,1))-1,
F(i+1) =norm(x(1:3)-p(i+1,:)+i*d*[x(4) x(5)sqrt(1-x(4)^2-x(5)^2)]);
end end
eine Geradengleichung lässt sich deutlich einfacher ermitteln: Aus
z = a*x + b*y ein lineares Gleichungssystem aufstellen und das mit \ lösen.
Was soll der "erste Punkt" einer Geraden sein? Falls du einen Aufpunkt meinst: der kann ebenso wie der Richtungsvektor problemlos aus obigem Ansatz bestimmt werden.
Ob das Ergebnis sinnvoll ist, kannst du z.B. an der Summe der Residuen abschätzen, oder z.B. auch daran, ob die visualisierte Gerade in etwa durch die Punkte geht.
Grüße,
Harald
Hackepeter
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.03.2012, 20:58
Titel:
Harald hat Folgendes geschrieben:
eine Geradengleichung lässt sich deutlich einfacher ermitteln: Aus
z = a*x + b*y ein lineares Gleichungssystem aufstellen und das mit \ lösen.
Was soll der "erste Punkt" einer Geraden sein? Falls du einen Aufpunkt meinst: der kann ebenso wie der Richtungsvektor problemlos aus obigem Ansatz bestimmt werden.
Moin!
Ich brauche drei Dinge:
1. Die Gerade mit dem best-fit wie du sie beschreibst.
2. Die Punkte sollen auf der Gerade alle den definierten Abstand zueinander haben
3. Unter Berücksichtigung von 2. soll er einen Aufpunkt finden, mit dem der Fehler von berechneten (mit p=a+i*d*r) zu gemessenen Werten möglichst klein ist.
Wenn ich das einfach nur als lineares Gleichungssystem aufstelle, fehlen mir ja 2 & 3.
wie soll 2. gehen? Zwei Punkte haben einen bestimmten Abstand voneinander, fertig. Und wenn man viele Punkte hat, wird da in den seltensten Fällen eine gerade genau durchgehen. Den Abstand zwischen welchen Punkten misst du dann? Zudem müsstest du dann mit d_ij arbeiten, da es ja um den Abstand zueinander geht?
Ich muss sagen, ich verstehe diese Problemstellung nicht wirklich, aber das kann an mir liegen.
Zum Testen, ob der Fit gut ist, siehe letzter Absatz im letzten Kommentar.
Grüße,
Harald
Hackepeter
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.03.2012, 21:22
Titel:
Harald hat Folgendes geschrieben:
wie soll 2. gehen? Zwei Punkte haben einen bestimmten Abstand voneinander, fertig. Und wenn man viele Punkte hat, wird da in den seltensten Fällen eine gerade genau durchgehen. Den Abstand zwischen welchen Punkten misst du dann? Zudem müsstest du dann mit d_ij arbeiten, da es ja um den Abstand zueinander geht?
Ich muss sagen, ich verstehe diese Problemstellung nicht wirklich, aber das kann an mir liegen.
Moin,
erstmal danke für deine Hilfe! Ja das Problem ist ein wenig komisch zu erklären, vielleicht mache ich gleich mal eine Zeichnung.
Also, ich weiß, dass meine Punkte alle auf einer Geraden liegen müssten. Ich habe im Prinzip eine Linearachse mit einer Messebene drauf, die an unbekannter Position startet (das der Aufpunkt a den ich suche). Jetzt verfahre ich die Ebene der Linearachse immer um einen konstanten Wert, den ich kenne und messe den Punkt erneut.
Meine Messung ist aber in einem anderen Koordinatensystem, als das der Achse. Also möchte ich den Aufpunkt a (für die erste Ebene), und die Richtung, in welcher die Ebene aus Sicht meines Messkoordinatensystems verschoben wird berechnen.
Die gemessenen Punkte sind aber mit Rauschen in alle Richtungen behaftet.
Deshalb hab ich das Modell wie oben beschrieben aufgestellt. Alle Punkte befinden sich auf einer Geraden, die ich fitten will, um den Richtungsvektor zu bekommen.
Um den Startpunkt möglichst genau zu schätzen, habe ich mir überlegt, dass ja alle Punkte sich auf dem Startpunkt plus bekannter Verschiebung in Geradenrichtung berechnen lassen.
Ich hoffe das war jetzt etwas plausibler?
Harald hat Folgendes geschrieben:
Zum Testen, ob der Fit gut ist, siehe letzter Absatz im letzten Kommentar.
Das sieht eigentlich ganz gut aus.
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
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.