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

Optimierungsproblem - local minimum found

 

mstp91
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2020, 11:30     Titel: Optimierungsproblem - local minimum found
  Antworten mit Zitat      
Hallo allerseits,

ich habe eine m.file erstellt und greife aus meinem Hauptskript auf meine Modellfunktion zu, die an die Messdaten angepasst werden soll.
Ebenfalls habe ich die Fitsyntax für
Code:
aus der Dokumentation übernommen und plotte meine Startwerte problemlos.

Der Solver iteriert aber nicht. Stattdessen findet er gemäß der Nachricht ein lokales Minimum:

Code:

         message: 'Initial point is a local minimum.↵↵Optimization completed because the size of the gradient at the initial point ↵is less than the selected value of the optimality tolerance.↵↵Stopping criteria details:↵↵Optimization completed: The final point is the initial point.↵The first-order optimality measure, 0.000000e+00, is less than↵options.OptimalityTolerance = 1.000000e-16.↵↵Optimization Metric                                       Options↵relative first-order optimality =   0.00e+00  OptimalityTolerance =   1e-16 (selected)'
 
 


Ich habe schon versucht meine Startwerte geringfügig und auch markant zu verändern, wie es in der Doku empfohlen wird.
Dieses Problem ist mein Hauptproblem, weshalb die Fits nicht klappen.

Vielen Dank vorab für eventuelle Anmerkungen und Tipps Smile

Gruß
mstp91
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.03.2020, 11:34     Titel:
  Antworten mit Zitat      
Hallo,

wie eben schon gesagt: ohne das reproduzieren oder zumindest deinen Code sehen zu können kann man dir nicht helfen.
Die Meldung an sich ist ja klar. Wieso diese Meldung kommt, kann man dir aber so nicht beantworten ohne zu sehen, was du machst.

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
 
mstp91
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2020, 13:37     Titel:
  Antworten mit Zitat      
Hallo Harald,

zunächst möchte ich letzten Abschnitt meines Skriptes erläutern. Vielleicht hilft das schon weiter.

Code:

a = 300;
b = 0.009;
lb = [100.0001];
ub = [1200, 8];
x0 = [a, b];
yfit = @(p) fit_fun(xdata,a, b, 1, 21)-ydata;
options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective','Display','iter','StepTolerance',1e-16,'OptimalityTolerance',1E-16);
[popt,resnorm,residual,exitflag,output]  = lsqnonlin(yfit,x0,lb,ub,options)
 


Wenn ich die Funktion mit den Startwerten plotte und "ydata" nicht von "yfit" subtrahiere, so bekomme ich eine Funktion in der Nähe meiner Messdaten heraus. Sobald ich aber "ydata" von "yfit" subtrahiere, kommt etwas ganz seltsames dabei heraus.
Ich habe einen Ausschnitt des Verlaufs einiger Messwerte kurz nach dem Startzeitpunkt als Bild angehängt (grüne Kurve). Die zweite rote Kurve stellt den fehlerhaften, nicht iterierten Fit dar. Wenn das noch nicht genügt, so füge ich noch die Modellformel hinzu und schicke dir gerne - sofern erwünscht - die Messwerte als PN.

Gruß
mstp91

Problem.PNG
 Beschreibung:

Download
 Dateiname:  Problem.PNG
 Dateigröße:  14 KB
 Heruntergeladen:  299 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.03.2020, 14:53     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Sobald ich aber "ydata" von "yfit" subtrahiere, kommt etwas ganz seltsames dabei heraus.

Das sind die Abweichungen zwischen Fit und Daten, die Residuen. Das sollte dann um die 0 herum schwanken.

Zitat:
Wenn das noch nicht genügt, so füge ich noch die Modellformel hinzu und schicke dir gerne - sofern erwünscht - die Messwerte als PN.

Genügt leider noch nicht. Bitte also alles zur Verfügung stellen, damit ich das nachvollziehen kann.

Edit: gerade nochmal drauf geschaut. Deine Fit-Funktion hängt überhaupt nicht von p ab. Damit kommt für jedes p derselbe Wert raus, und damit ist jeder Startwert auch ein lokales Minimum. Die Funktion muss so aussehen:
yfit = @(p) irgendwas mit p

Ein sinnvoll aussehendes Beispiel:
Code:
yfit = @(p) fit_fun(xdata, p(1), p(2), 1, 21)-ydata;

Ob das natürlich das ist, was du optimieren willst, weiß der Himmel.


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
 
mstp91
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2020, 16:47     Titel:
  Antworten mit Zitat      
Hi,

ja, ich hab versehentlich die Variablen aus x0 eingetragen und nicht die Komponenten x(1) und x(2) direkt, die variiert werden sollen.
In meiner Hauptformel tauchen die Startwerte aber auf. Hier nochmal der die Formel + den Fit.
Code:

function [ Sig ] = fit_fun( xdata, x(1), x(2), DS, N )

n = 0:N;
xdata = xdata';

    V = zeros( size(n) );
    V(1) = sqrt(2*x(2) * (1-x(2)/12+11*x(2)^2/1440);
    V(2:end) = n(2:end)*pi + 2*x(2)./(n(2:end)*pi) - 4*x(2)^2./(n(2:end)*pi).^3 ...
        + (16./(n(2:end)*pi).^5 - 2./(3*(n(2:end)*pi).^3))*x(2)^3 ...
        - (80./(n(2:end)*pi).^7 - 16./(3*(n(2:end)*pi).^5))*x(2)^4;
    A = 2*(-1).^n .* V.^2 ./ (V.^2 + 2*x(2) + x(2)^2);
   
    Sig = DS * exp( -xdata./x(1).*V.^2 ) .* A';

end

a = 275.36;
b = 0.061;
lb = [0,0.00001];
ub = [1500, 10];
x0 = [a, b];
yfit = @(x) fit_fun(xdata,x(1), x(2), 1, 202) - ydata;
options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective','Display','iter','StepTolerance',1e-16,'OptimalityTolerance',1E-16);
[x,resnorm,residual,exitflag,output]  = lsqnonlin(yfit,x0,lb,ub,options)

 


Die Messwerte schicke ich dir nun per PN.

Liebe Grüße
mstp91
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
function [ Sig ] = fit_fun( xdata, x(1), x(2), DS, N )

Wenn deine Funktion so aussieht, dann bekommst du sofort einen Syntaxfehler. So kann sie also nicht aussehen.

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
 
mstp91
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.03.2020, 12:01     Titel:
  Antworten mit Zitat      
Hi,

hab die x(1) und x(2) wieder durch a und b erstetzt und kann mit varrierenden Startwerden meine Formel manuell gut anpassen. Sobald aber diese "ydaten" ins Spiel kommen bekomme ich als Anpassung nur noch eine Gerade. Mir ist leider nicht ersichtlich durch was das Problem hervorgerufen wird.

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

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.03.2020, 12:05     Titel:
  Antworten mit Zitat      
Hallo,

mir auch nicht, ohne den aktuellen Stand zur Verfügung zu haben sowie die Daten.
PN habe ich keine erhalten.

Nur sicherheitshalber: yfit sind derzeit die Residuen, die möglichst auf 0 gebracht werden sollen. Wenn du den tatsächlichen Fit visualisieren willst, musst du ydata wieder addieren.

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.