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

Optimierungsfunktion mit Methode der kleinsten Quadrate

 

Palle947
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 12.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2020, 15:14     Titel: Optimierungsfunktion mit Methode der kleinsten Quadrate
  Antworten mit Zitat      
Guten Tag,

ich habe folgendes Problem: Ich habe eine Kostenfunktion, welche mit Hilfe der Methode der kleinsten Quadrate gelöst werden soll bzw. sollen 4 unabhängige Variablen ermittelt werden. Das grobe Vorgehen ist im Bild dargestellt, wobei der Vektor x meine Optimierungsvariablen beinhaltet.
Meine Frage lautet jetzt, wie ich dieses Vorgehen in ein Optimierungsproblem umwandle, welches von zB. lsqnonlin gelöst werden kann? Also wirklich nur die function, wie ich diese dann aufrufe und Optionen für den solver setze weiß ich. g(t) bezieht sich übrigens auf Messdaten, welche natürlich auch einzeln eingeladen werden müssen..
Mein Ansatz sieht wie folgt aus:

Code:
function [PSI] = dynamic_constraints(x)

IMU = load('GruppeTwo20200312_09.dat');

g1 = [IMU(:,5); IMU(:,6); IMU(:,7)];
g2 = [IMU(:,18); IMU(:,19); IMU(:,20)];
phi_1 = x(1,1);
phi_2 = x(1,2);
teta_1 = x(1,3);
teta_2 = x(1,4);

j_1 = [cos(phi_1) * cos(teta_1); cos(phi_1) * sin(teta_1); sin(phi_1)];
j_2 = [cos(phi_2) * cos(teta_2); cos(phi_2) * sin(teta_2); sin(phi_2)];
 
%% Für least square Optimierung

% e = norm(cross(g1,j1)) - norm(cross(g2,j2));

for i = 1:size(IMU,1)
    g1 = [IMU(i,5); IMU(i,6); IMU(i,7)];
    g2 = [IMU(i,18); IMU(i,19); IMU(i,20)];
    e(i,1) = (norm(cross(j_1, g1))) - (norm(cross(j_2, g2)));  
end
 
PSI = e;

end


Dieser Code funktioniert leider nicht mit dem lsqnonlin.. Wie muss ich diese Syntax verändern? Vielen Dank für eure Hilfe!

Gruß,
Pascal

Bildschirmfoto 2020-04-11 um 15.04.40.png
 Beschreibung:
Grobes Vorgehen der Optimierung

Download
 Dateiname:  Bildschirmfoto 2020-04-11 um 15.04.40.png
 Dateigröße:  134.32 KB
 Heruntergeladen:  169 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.04.2020, 16:13     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Dieser Code funktioniert leider nicht mit dem lsqnonlin..

Was funktioniert daran nicht? Welche Fehlermeldung bekommst du?

Selbst wenn du meinst, dass der Aufruf mit lsqnonlin nicht das Problem ist, wäre es gut, wenn du das zur Verfügung stellst.

Es ist unnötig, die Daten in jedem Funktionsaufruf zu laden, siehe
https://www.mathworks.com/help/opti.....ing-extra-parameters.html

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Palle947
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 12.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2020, 16:33     Titel:
  Antworten mit Zitat      
Erstmal vielen Dank für die Antwort, ja die Daten müssten nicht jedes mal einzeln geladen werden da hast du recht, werde das verbessern. Mein Hauptprogramm sieht wie folgt aus:

Code:

% Reihenfolge: phi_1, phi_2, teta_1, teta_2
x0 = [0, 0, 0, 0];      %Startwerte der Optimierung

lb = [-2*pi, -2*pi, -2*pi, -2*pi];      %untere Grenze der Winkel (max -360 Grad für azimuth and inclination angles)
ub = [2*pi, 2*pi, 2*pi, 2*pi];          %obere Grenze der Winkel (max 360 Grad für azimuth and inclination angles)

%% Finde Minimum (leasts squre incl. Jacobian)

opts = optimoptions(@lsqnonlin,'SpecifyObjectiveGradient',true);
fun = @dynamic_constraints;
[x,resnorm,res,eflag,output] = lsqnonlin(fun,x0,lb,ub,opts);
 


Der Fehler lautet wie folgt:
Error in lsqnonlin (line 205)
initVals.F = feval(funfcn{3},xCurrent,varargin{:});

Error in Axis_coordinates (line 55)
[x,resnorm,res,eflag,output] = lsqnonlin(fun,x0,lb,ub);%,opts);

Caused by:
Failure in initial objective function evaluation. LSQNONLIN cannot continue.

wobei Axis_coordinates mein Hauptprogramm ist, aus welchem ich die Optimierung aufrufe..
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

da sollte noch die eigentliche Fehlermeldung dabei sein, nämlich was bei der "initial objective function evaluation" schief geht.

Falls da nichts ist oder das nicht weiterhilft,
Code:
dynamic_constraints(x0)

ausführen bzw. debuggen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Palle947
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 12.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2020, 17:35     Titel:
  Antworten mit Zitat      
Die Fehlermeldung war komplett.. etwas Anderes zeigt er nicht an. Wenn ich dynamic_constraints(x0) aufrufe, gibt er mir einen 2392x1 Fehlervektor e aus (2392 ist die Anzahl der Messpunkte). So soll es doch eig. auch sein oder? Deshalb verstehe ich nicht, warum lsconlin nicht funktioniert. Wenn nochmal eine sum(e) berechnet und dann der fmincon benutz wird, funktioniert es, jedoch sind die Ergebnisse sehr schlecht, weshalb ich gerne auf einen Least square Algorithmus mit Jacobi zurückgreifen möchte.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.04.2020, 17:38     Titel:
  Antworten mit Zitat      
Hallo,

wenn, dann sollte man mit fmincon die Summe der Fehlerquadrate minimieren, also
Code:


Kannst du mal einen Beispieldatensatz zur Verfügung stellen (verkleinert oder verfälscht reicht), bei dem das Problem auftritt? Ohne mehr zu sehen kann ich nicht weiterhelfen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Palle947
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 12.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2020, 17:44     Titel:
  Antworten mit Zitat      
Ja genau das habe ich mit fmincon getan. Es läuft jetzt das Problem lag daran, dass ich wohl zu viele outputs definiert hatte..

aus
Code:
[x,resnorm,res,eflag,output] = lsqnonlin(fun,x0,lb,ub);

habe ich
Code:
x = lsqnonlin(fun,x0,lb,ub);

gemacht und jetzt läuft es! Ich werde jetzt versuchen das noch etwas anzupassen und die Vorgehensweise wie Messdaten eingelesen werden überarbeiten.

Vielen Dank für deine Hilfe!

Gruß,
Pascal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.04.2020, 17:49     Titel:
  Antworten mit Zitat      
Hallo,

sicher, dass da nicht was anderes war? Zum einen ist die zuerst verwendete Syntax laut Doku unterstützt, zum anderen passt die Fehlermeldung nicht dazu.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Palle947
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 12.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2020, 20:33     Titel:
  Antworten mit Zitat      
Hast recht, habe vorher beim Ausprobieren der Funktion noch die eine Zeile über der for Schleife als Kommentar gesetzt. Dies ist hier im Forum auch so drin, hatte ich bei mir nur nicht umgesetzt und deshalb vermutlich der Fehler..
Habe jetzt aber festgestellt, dass die Werte genauso schlecht sind wie beim fmincon und will daher mal versuchen nicht alle Daten auf einmal in den Fehlervektor e zu laden und zu optimieren, sondern nach und nach und jedes mal aufs neue eine lesst square Optimierung durchführen, welche dann die Optimierungsparameter anpasst. Kannst du mir vlt. sagen, wie ich es realisieren kann, dass die Optimierung in einer Schleife funktioniert, bei der jedes mal eine Messwert mehr in e geladen wird, ein neues x berechnet wird und das bis zum ende des Datensatzes.

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn du das wirklich machen möchtest, dann die Daten außerhalb der Optimierung laden und wie im Link beschrieben an die Funktion übergeben, aber nur den benötigten Teil. Ich halte das aber nicht für zielführend.
Meine Vermutung ist, dass die schlechten Ergebnisse aufgrund nicht ausreichend guter Startwerte zustande kommen und der Solver in ein lokales Minimum läuft. Entweder kennst du also bessere Startwerte oder ich würde empfehlen, einen Ansatz aus der globalen Optimierung (z.B. multistart) zu verwenden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
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.