Ich habe jetzt das Problem, dass mein Code einen meiner Parameter Gamma nahezu 1 setzt und alle anderen nahezu 0 (eine realistische Lösung für den Funktionstyp wären z.B. einzelne Gamma-Werte wie 0.78, 0.12, 0.07,...,1e-5), so dass ich sehr große Anpassungsfehler (bis zu über 100%) erhalte...Außerdem fällt mir auf, dass die Funktion bei der Minimumssuche stark bei den Startparametern hängen bleibt, d.h., wenn ich z.B. für Gamma1_start=0.8 wähle, ist das Ergebnis Gamma1=0.79999 und wenn ich stattdessen Gamma1_start=0 wähle, bekomme ich als Ergebnis Gamma1=0.00001. Was ich daher haben möchte ist, dass die Nebenbedinungen schon alle erfüllt sind, aber dass das Programm die Fitparameter stärker variiert...Habe auch schon mit optimset rumgespielt und TolFun und TolX hochgeschraubt, das nutzt aber auch nichts...
fmincon sucht nach einem lokalen (!) Minimum. Gerade wenn es sich also um eine sehr "hügelige" Funktion handelt, läuft man oft in eine lokales Minimum, obwohl man das globale sucht.
Abhilfen:
- bessere Startwerte (haha, ich weiss)
- verschiedene Startwerte systematisch durchlaufen lassen
- wahrscheinlich am hilfreichsten: Algorithmen aus der Genetic Algorithm and Direct Search Toolbox, wie z.B. patternsearch.
Mit patternsearch komme ich immerhin auf unter 21% Anpassungsfehler. Das Problem mit den Startparametern ist, dass ich für die verwendeten Messdaten eigentlich genaue Anpassungsparameter habe, mit denen jemand in einem Paper auf unter 0,5% Anpassungsfehler kommt...aber wenn ich diese Werte als Startparameter verwende, komme ich trotzdem auf die 21% Anpassungsfehler und nicht wie im Paper mit den gleichen Daten auf 0,5%...
Nächster Vorschlag: genetischer Algorithms (ga), und patternsearch als Hybrid Function hinten dran.
Am besten mal mit verschiedenen Algorithmen in Genetic Algorithm and Direct Search Toolbox und dabei jeweils verschiedenen Einstellungen experimentieren.
Danke, damit klappt es schon viel besser...mir ist aber beim ga noch eine Sache unklar: Wenn ich wie unten im Code patternsearch als Hybridfunktion nehme, dann muss ich in patternsearch ja wieder Startparameter param_start definieren...aber die Startparameter für patternsearch sollte ich ja eigentlich von dem genetic algorithm bekommen...wie funktioniert das denn?
Wenn patternsearch als Hybrid Function definiert ist, ruft MATLAB automatisch nach dem Abschluss von ga die Funktion patternsearch auf, und zwar mit dem besten Individuum als Startwert.
Also bekomme ich je nach "Auslese" beim ga unterschiedliche Parameter raus, d.h. jedes Mal wenn ich einen ga laufen lasse, bekomme ich eine andere Anpassung? Denn die Anpassungsfehler unterscheiden sich doch erheblich, sie liegen z.B. zwischen 0.12% und 40%! Also um gute Ergebnisse beim ga zu bekommen, muss man den Algorithmus einfach ein paar Mal durchlaufen lassen und sich dann das beste Ergebnis aussuchen?
Alternative ist, mit den Optionen zu arbeiten, beispielsweise größere Populationen, oder mehr Generationen. Meiner Erfahrung nach sind mehrere Versuche aber effizienter.
, wobei T_anpass_ga meine Anpassungsfunktion ist und T_exakt sind die einzelnen Messwerte...Ist das so richtig oder muss ich in obj nur T_anpass_ga definieren wie es z.B. bei lsqcurvefit der Fall ist?
Gibt es eine Möglichkeit, dass ich meine gefundenen Fitparameter abspeichere und dann nochmals ga durchlaufen lasse, damit ich überprüfen kann, ob ich nicht noch bessere Parameter finden kann?
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.