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

Optimization Toolbox: lsqnonlin levenberg-marquardt

 

Harald
Forum-Meister

Forum-Meister


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

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?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen


stiffi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 13.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2011, 14:14     Titel:
  Antworten mit Zitat      
Hallo,

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)
Code:
%%% Optimierungsroutine lsqnonlin %%%
function lsq=minimiz(par)
HPLC=xlsread('Messwerte.xls','gewaschen','A82:D96');
tspan = HPLC(:,1)'; % Matrix transponieren
c_v0(1) = HPLC (1,4); % Cellulose
c_v0(2) = HPLC (1,3); % Cellobiose
c_v0(3) = HPLC (1,2); % Glucose
$$$TRANSP=HPLC';
$$$MAT=[TRANSP(4,:),TRANSP(3,:),TRANSP(2,:)];
%Lösung des DGL-Systems mit Startwerten
options=odeset('RelTol',1e-6);
[t,c_v] = ode45(@(t,c_v)lsqparafit2(t,c_v,par),tspan,c_v0,options);%so hab ich die anonyme function geschrieben???
%Bewertungskriterium (soll minimiert werden)
$$$tra=c_v';
$$$vekt=[tra(1,:),tra(2,:),tra(3,:)];
$$$reMAT=reshape(MAT,1,[]);
$$$revekt=reshape(vekt,1,[]);
lsq = revekt - reMAT;


4. bei so einen niedrigen RelTol wirft macht MATLAB nur einen Iterationsschritt


Dein Vorschlag FMINSEARCH:
Dein Vorschlag klingt für mich immer attraktiver Wink.
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)

Danke für die Hilfe!

Gruß

Stiffi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stiffi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 13.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2011, 15:13     Titel:
  Antworten mit Zitat      
Hi,

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?

Danke Dir!

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

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.08.2011, 15:37     Titel:
  Antworten mit Zitat      
Hallo,

die Daten solltest du natürlich dann nur einmal einlesen. Das dürfte das ganze auch deutlich schneller machen. Den Ansatz dazu hatte ich ja erklärt.

Kann es. Ich würde dazu meine Zielfunktion ändern und Strafterme definieren, z.B.
Code:
konstante * sum(max(-par, 0))


Nochmal: es ist unsinnig, RelTol auf 1e-2 oder so zu setzen. Die Simulation muss möglichst genau sein, also RelTol auf 1e-6 oder so.

Und nein, das "Drosseln" von FMINSEARCH auf diese Art ist nicht sinnvoll, da es bei einem ähnlichen Problem schiefgehen kann.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stiffi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 13.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2011, 08:08     Titel:
  Antworten mit Zitat      
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)];


Das Ergebnis sieht geplottet sehr gut aus.

Danke nochmal Harald für die Gedult und Deine Tips Wink!

Trotzdem würde mich prinzipiell interessieren, wieso 'Levenberg-Marquardt' nach ein oder 2 Iterationsschritten hängen bleibt.

'Display',iter zeigt Folgendes im Command-Window an:


First-Order Norm of
Iteration Func-count Residual optimality Lambda step
0 10 5547.62 4.18e+004 0.01
1 20 1540.52 1.85e+004 0.001 7.88621

Viele Grüße

Stiffi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.08.2011, 08:27     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stiffi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 13.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2011, 08:45     Titel:
  Antworten mit Zitat      
Hi,

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?

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

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.08.2011, 08:59     Titel:
  Antworten mit Zitat      
Hallo,

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).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stiffi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 13.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2011, 09:04     Titel:
  Antworten mit Zitat      
Hi,

dann muss ich wohl noch etwas rumprobieren.

Danke schon mal, das bisherige Resultat ist ja auch schon recht schön.

Gruß
Stiffi
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2011, 10:50     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 06.03.2012, 18:35     Titel:
  Antworten mit Zitat      
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:
Code:

options = optimset('TolX',1e-15,'TolFun',10e-19,'DiffMinChange',1e-16);
[x,resnorm,residual,exitflag,output,lambda,jacobian]=lsqnonlin(@fit_simp_TRUST,X0,[],[],options,X,Y);


und danach mit dem Levenberg-Verfahren
Code:

options = optimset('TolX',1e-15,'TolFun',10e-19,'DiffMinChange',1e-16','LargeScale','off','LevenbergMarquardt','on');
[x,resnorm,residual,exitflag,output,lambda,jacobian]=lsqnonlin(@fit_simp_LEVMARQ,X0,[],[],options,X,Y);
optimiere.

doch leider bekomme ich für beide Verfahren immer die selben Werte. Das sollte ja so nicht sein oder???
 
Harald
Forum-Meister

Forum-Meister


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

wieso soll das nicht so sein? Das bedeutet lediglich, dass beide Verfahren zum selben Minimum konvergieren. Ich fände das sogar sehr gut.

Grüße,
Harald

P.S.: Wenn die Anfrage nichts oder wenig mit dem ursprünglichen Thema zu tun hat, bitte ein neues Thema aufmachen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.