1. gut.
2. gut, dass du mit Function Handles arbeitest. Du kannst die Variablen aber trotzdem mit übergeben, siehe mein Post vom 5.8., 11:09
3. gut.
4. RelTol sollte eher niedrig (1e-6) sein, damit die ODE genau simuliert wird.
Wenn das nicht hilft, vielleicht mal andere Startwerte versuchen.
Andere Frage: du meintest mal, dass FMINSEARCH die Lösung schnell gefunden hätte. Was hält dich dann davon ab, FMINSEARCH zu nutzen und das ganze auf sich beruhen zu lassen?
2. evtl. mach ich mit den function handles einen fehler, weil ich muss die parameter schon nochmal separat nennen, z.B.
(die Zeilen, die ich nur brauche, um die richtige Matrixform zu bekommen, kennzeichne ich mit $$$, zur besseren Übersichtlichkeit)
4. bei so einen niedrigen RelTol wirft macht MATLAB nur einen Iterationsschritt
Dein Vorschlag FMINSEARCH:
Dein Vorschlag klingt für mich immer attraktiver .
Dummerweise hab ich mir extra die optimization-toolbox zugelegt, weil in der Literatur eben für diesen Zweck häufig dieser lsqnonlin verwendet wird.
Aber generell ist ja die Parameteroptimierung mit fminsearch auch nicht falsch oder?
Aber zu fminsearch: Dort kann ich für die Parameter keine Grenzen eingeben, oder? (z.B damit Parameter nicht negativ werden, was physikalisch keinen Sinn macht)
dir geht es um HLPC? Nun, du musst für lsqnonlin ein ähnliches Konstrukt verwenden wie für ode45, wenn du das nur einmal einlesen willst.
Hast du mal geschaut, ob die Parameter von FMINSEARCH korrekt sind (d.h. ob die gefittete Kurve auch zu den Daten passt)? Wenn ja, würde ich mich damit zufrieden geben.
Um sicher zu gehen, dass nichts falsches passiert, würde ich dieses Optimum dann mal in den Ansatz mit LSQNONLIN stecken. Wenn MATLAB von diesem Optimum wegläuft, hast du noch irgendwo einen Implementierungsfehler. Wenn nicht, dann war einfach der Startwert nicht gut genug.
richtig, also HPLC sind die Daten aus dem Labor, die in MATLB eingelesen werden.
Also die Werte von fminsearch passen schon relativ gut.
Sagen wir so: Die Kurven, die der ode-solver mit den von fminsearch optimierten Parametern zeichnet, schneiden die Messpunkte ziemlich genau.
Aber: Das passiert bereits bei einer Einstellung von 'MaxIter'=500, wenn ich MaxIter nicht verändere und stattdessen "default" (default = 200*number of variables) verwende, wird die Optimierung erstens kaum oder nicht fertig und zudem wandern manche Parameter in einen physikalisch nicht sinnvollen Bereich.
Kann man fminsearch mit einem Trick Grenzen für die Parameter mitgeben?
z.B. Paramter dürfen nicht negativ sein?
Wenn ich das Optimum von fminsearch in lsqnonlin eingebe, dann wandern die Parameter kaum weg. lsqnonlin macht aber auch nur mehr zwei Iterationen bei RelTol=1e-2 und DiffMinChange 1e-2 oder RelTol=1e-4 und DiffMinChange 1e-2.
Ich hab ja damit wenig Erfahrung, aber MaxIter manuell runterzudrosseln, nur um (physikalisch) bessere Werte zu bekommen ist auch nicht optimal oder?
Hi,
nach sehr langem Probieren funktioniert lsqnonlin nun, mit dem Trust Region Reflective Algorithmus und den Genauigkeiten: RelTol=1e-6 und Diffminchange=1e-5. Komischerweise funktioniert der Levenberg-Marquardt-Algorithmus nicht richtig, was mir aber gelinde gesagt Wurst ist.
Was hab ich anders gemacht:
1. lsqnonlin aufrufen: es müssen die Messdaten Y_exp und die Startwerte init_conc (sind für Solver und Messdaten gleich) an lsqnonlin übergeben werden
Code:
% Übergabe der Startparameter an die Least-Square-Routine von lsqnonlin [opt_par,resnorm,residual,exitflag,output,lambda,jacobian]=lsqnonlin(@minimiz,init_par,lb,ub,options,tspan,init_conc,Y_exp);
2. Dimensionen der Matritzen der Messdaten Y_exp und der simulierten Werte Y_sim müssen natürlich gleich sein und die Konzentrationen müssen den selben Spalten zugeordnet sein, z.B: Glucosekonzentration ist sowohl in Y_exp als auch in Y_sim in Spalte 1 aufgelistet
3. die Startkonzentration init_conc wird als Zeilenvektor übergeben das Zeitintervall tspan als Spaltenvektor
4. die objective function, die minimiert wird sieht folgendermaßen aus:
Code:
% Minimierungskriterium function lsq=minimiz(opt_par,tspan,init_conc,Y_exp)
lsq=[Y_sim(:,3)-Y_exp(:,3);Y_sim(:,2)-Y_exp(:,2);Y_sim(:,1)-Y_exp(:,1)];
um den Grund zu sehen, warum ein Algorithmus beendet wird, solltest du dir EXITFLAG anzeigen lassen. In der Doku wird dann beschrieben, was der entsprechende Wert bedeutet.
Meine Vermutung: der Algorithmus ist in ein lokales Minimum gelaufen, oder es gab ein "sonstiges Problem".
Wenn es so wäre, dass ein Algorithmus immer besser ist als ein anderer, wären wohl nicht zwei verschiedene Algorithmen implementiert. Hinter die Gründe, warum der eine Algorithmus in deinem Fall nun so viel besser ist als der andere, sehe jedoch auch ich nicht.
Exitflag wird bei mir nur angezeigt wenn der Solver fertig ist.
Im Falle von "Levenberg-Marquardt" wird er das nicht und ich muss manuell abbrechen (strg-c).
Kann man sich das auch während des Lösungsvorgangs permanent anzeigen lassen?
jetzt verstehe ich erst, was du mit "hängenbleiben" meinst. Ich dachte, der Löser bricht an der Stelle vorzeitig ab.
Verschiedene Möglichkeiten:
- Geduld haben. Ggf. auch mehrere Minuten.
- in der Zielfunktion ausgeben, für welche Eingabeargumente ausgewertet wird. Das kann einen Hinweis auf mögliche Probleme geben.
Wenn du deine Excel-Daten immer noch in jeder Iteration lädst, ist es nicht erstaunlich, dass das ganze relativ lange dauert.
Alles andere habe ich bereits (mehrfach) erwähnt (RelTol, DiffMinChange).
Danke schon mal, das bisherige Resultat ist ja auch schon recht schön.
Gruß
Stiffi
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 15.11.2011, 10:50
Titel:
Hallo,
ich arbeite momentan auch mit lsqnonlin. Ich bilde eine Exp-Funktion nach. Ich habe für unterschiedliche Ströme unterschiedliche Funktionsverläufe. Bei einigen Stömen(Kurvenverlauf bis max. 3mA) ist dieNachbildung besser als bei anderen Stömen(Kurvenverlauf bis max. 1.2mA).
Sobald ich nun die Toleranzen usw. für die kleineren Ströme feiner justiere, müsste ich doch genauso gute Ergebnisse haben?
Kann ich selber eine Error-Funktion erstellen die mir einfach genauere Kurvensimulationen liefert?
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.03.2012, 18:35
Titel:
Hallo,
ich probiere derzeit das Trust- und levenberg-Algorithmus zu vergleichen.
ich habe mir eine Optimierungsumgebung aufgebaut, in der ich zunächst mit dem Trust-Verfahren:
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.