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

Parameterbestimmung mit lsqnonlin - Konvergenzprobleme

 

Hackepeter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2012, 17:11     Titel: Parameterbestimmung mit lsqnonlin - Konvergenzprobleme
  Antworten mit Zitat      
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:


<br />
F=|\vec{a} - \vec{p_{i}} +i*d*\vec{r}| 
<br />
mit

<br />
\vec{r} =\begin{pmatrix} r_1 \\ r_2 \\ \sqrt{1-r_1^{2} -r_2^{2}}\end{pmatrix} 
<br />
damit ein normierter Richtungsvektor rauskommt

a ist die geschätzte Lage für den ersten Punkt, d der bekannte exakte Abstand zwischen den Punkten, p_i 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

für die Optimierungsfunktion

und
Code:
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;]
   
r=p(4,:)-p(1,:);
r=r/norm(r);
x0=[p(1,:) r(1:2)]

x = lsqnonlin(@myfun,x0);


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: ---
     Beitrag Verfasst am: 12.03.2012, 17:16     Titel:
  Antworten mit Zitat      
Sorry, F sieht folgendermaßen aus, ich habe die Summe vergessen:
F=\sum\limits_{i=0}^{n-1}  |\vec{a} - \vec{p_{i}} +i*d*\vec{r}|
 
Hackepeter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2012, 17:22     Titel:
  Antworten mit Zitat      
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


Jetzt gibt es ein Ergebnis. Ist das sinnvoll?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2012, 19:22     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Hackepeter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2012, 20:58     Titel:
  Antworten mit Zitat      
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.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2012, 21:08     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Hackepeter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2012, 21:22     Titel:
  Antworten mit Zitat      
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.
 
Neues Thema eröffnen Neue Antwort erstellen



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.