Verfasst am: 20.08.2012, 09:43
Titel: Problem mit fmincon
Hallo,
ich bin neu hier und bitte um ein bisschen Nachsicht, wenn ich was falsch mache
Ich versuche grade mit fmincon den Wert von 6 Parametern abzuschätzen, allerdings habe ich das Problem, dass sich diese Werte kaum von meinen vorgegebenen Startwerten weg bewegen, obwohl diese nur geraten sind und wahrscheinlich von den passenden Werten hziemlich weit entfernt sind.
Beim Abbruch kommt immer die Meldung:
"Optimization terminated: first-order optimality measure less
than options.TolFun and maximum constraint violation is less
than options.TolCon.",
die ja eigentlich eine Erfolsmeldung ist.
Leider werde ich aus der Hilfe nicht schlau, was TolFun, TolX und TolCon genau bewirken und hoffe ihr könnt mir da weiter helfen.
du sagst, dass es kaum von den vorgegebenen Startwerten wegläuft. Vielleicht sind deine Startwerte schon ziemlich gut? Vielleicht läuft fmincon aber auch in ein lokales Minimum.
Ich würde es zunächst mal mit unterschiedlichen Startwerten versuchen.
Eine weitere Möglichkeit wäre, TolFun (und TolCon) über optimset herunterzusetzen.
Letztlich muss man sich darüber im klaren sein, dass fmincon immer nur ein lokales Minimum findet und man keine Garantie hat, dass es das globale ist. Wenn man keine Startwerte angeben kann, die "nahe genug" am globalen Minimum sind, kann man es mit der Global Optimization Toolbox (patternsearch oder ga) versuchen.
vielen dank für deine Antwort,
ich habe schon verschiedene Startwerte versucht, was aber nichts geändert hat.
Leider verfüge ich nicht über die Global Optimation Toolbox
vorher hatte ich es mit fminsearch versucht, wobei das Ergebnis dabei vom Verlauf deutlich besser aussah, allerdings waren dabei einige von meinen gesuchten Größen negativ, was sie allerdings nicht sein können, da es sich dabei um Federsteifigkeiten handelt. Deswegen bin ich auf fmincon umgestiegen, um hier die Bedingung zu setzten, dass die gesuchten Grüßen positiv sein müssen.
Habe ich mit fmincon an der Stelle dann keine Chance brauchbare Ergebnisse zu finden?
ein Möglichkeit ist, selbst über verschiedene Startwerte zu iterieren oder die Funktion erstmal an vielen Stellen auszuwerten, um einen guten Startwert zu bekommen.
Um weitere Hilfe geben zu können, müsste man wohl das gesamte Problem anschauen.
Du könntest auch mit FMINSEARCH arbeiten und deine Nebenbedingungen als Strafterme mit einfließen lassen.
weist du zufällig, was TolX, TolFun und TolCon genau bewirken?
ich habe versucht einen schwingfähigen Riementrieb als 3 Massenschwinger nachzubilden.
dabei habe ich Messdaten von den Winkelgeschwindigkeiten der 3 Riemenscheiben sowie deren Winkel. Außerdem habe ich ein Modell entworfen, dass diese Größen nachbilden soll, wenn ich da die gleichen Eingangsgrößen draufgebe.
Im angehängten Bild sind die schwarzen Linien die jeweils berechneten Gößen und die anderen die gemessenen.
Die Schwingungen, auf die es mir dabei ankommt sind also nicht wirklich gut mit dem Modell berechnet worden, was daran liegen dürfte, dass die Parameter, die ich annähern will nicht passen.
sorry wegen dem Doppelpost, aber eine Frage hab ich noch
ich hab jeztz bei fminsearch mal Straftere gesetzt, und an den Optionen rumgespielt.
Meine Frage ist, warum der Optimieren hier abbricht:
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.609491e+003
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.574491e+003
obwohl meine Vorgaben so aussahen:
Code:
opt=optimset('Display','Iter','MaxFunEvals',80000,'TolFun',e-50,'TolX',e-15,'TolCon',1e-8);
y = fminsearch(@fun_RSG,[100000010000001000000500500500],opt);
5 der 6 Linien sind ja quasi identisch. Warum die 6. nun nicht passt, ist aus der Ferne schwer zu sagen.
Die Vermutung bleibt, dass es sich bei dem gefundenen Minimum um ein lokales Minimum handelt. Gerade wenn man Schwingungsterme hat, sind die recht empfindlich für lokale Minima. Für Empfehlungen dazu siehe vorherige Antwort.
sind denn die gemessenen Daten (magenta) deiner Meinung nach "glatt" genug um dort ein Gradienten basiertes Verfahren anzuwenden? Das Problem, warum die son bisschen eckig aussehen ist, dass die teilweise mit einer relativ geringen Schrittweite erfasst wurden.
es reicht ja nicht, die Glattheit dieser Kurven zu betrachten. Man müsste sich ansehen, wie die Kurven sich ändern, wenn die Parameter geändert werden.
In der Regel reicht es allerdings aus, wenn kleine Änderungen in den Parametern auch nur kleine Änderungen in der Zielfunktion bewirken.
ich glaub mein Modell ist einfach falsch...
bei fminsearch will er mit 2 Parametern immer ins Minus laufen und wenn ich einen Strafterm setze wie:
Zitat:
if c2<50
f=f*100
end
dann läuft der Parameter immer gegen 50, was ja bedeutet, dass er garantiert nicht 50 ist!
und bei fmincon enfernen sich die Parameter nach wie vor nicht von den Startwerten, egal wie ich die wähle.
Außerdem hab ich grad zufällig gesehn, dass er am Anfang immer die Meldung:
Warning: Large-scale (trust region) method does not currently solve this type of problem,
using medium-scale (line search) instead.
wobei ich damit nicht wirklich was anfangen kann.
Kann das die Ursache sein? wie stell ich das denn auch medium-scale?
dann läuft der Parameter immer gegen 50, was ja bedeutet, dass er garantiert nicht 50 ist!
So würde ich das nicht sagen. Es bedeutet lediglich, dass 50 lokal besser als Werte über 50 ist.
Die Warnung kannst du ignorieren. Wenn du möchtest, kannst du das explizit über optimset einstellen.
Mir scheint, dass du eine Funktion mit sehr sehr vielen lokalen Minima hast. Ich sehe nur die Möglichkeit, die Funktion zunächste an sehr sehr vielen (> 10000) mehr oder weniger zufälligen Stellen auszuwerten und die beste dieser Stellen als Startwert für die eigentliche Optimierung zu nehmen, oder globale Optimierung mit den Algorithmen aus der Global Optimization Toolbox (hieß früher Genetic Algorithm and Direct Search Toolbox).
erstmal vielen Dank für deine große Hilfe
Über 1000 Anfangspunkte werde ich wohl leider nicht testen können, da ein durchlauf ja schon ziemlich lange dauert, aber mal noch ne andere Sache, ich bin mir mit meinen Bedingungen, die ich bei fmincon angegeben hab grad nicht ganz sicher
Ich wollte die Bedingung setzten, dass meine 6 Parameter alle >0 sein müssen.
Dafür habe ich die Matrix A und den Vektor b wie folgt definiert:
theoretisch passt das. Der Algorithmus wird jedoch besser / schneller laufen, wenn du einen Nullvektor als untere Schranke (lb) angibst.
Grüße,
Harald
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.