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

Optimisierungsproblem: Parameter einer DGL optimal wählen

 

johepet

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2017, 13:22     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
der Anfangsvektor muss einen endlichen Wert zurückgeben.
Die Aussage im Link wird sich darauf beziehen, dass die Solver damit klar kommen, wenn irgendwann im späteren Verlauf der Optimierung NaN zurückgegeben werden.


ah ... dann ist's auch klar, warum's nicht geklappt hat.

Leider beschäftigt mich gerade ein anderes/weiteres Problem bzgl. der Optimierung. Wenn ich meine Startwerte mit den gefundenen optimalen Parametern vergleich, zeigt sich, dass einige der Startwerte überhaupt nicht geändert/angepasst werden bzw. wenn, dann sich deren Änderung nur in äußerst "homöopathischen" Dosen bewegt. ... Das Problem ist wahrscheinlcih auch, dass manche Parameter das Ergebnis erst dann signifikant beeinflussen, wenn diese "drastisch" geändert werden. ... So hat z.B. in Zielfunktion die Änderung eines Parameters von z.B. 0.6 auf 0.5 großen Einfluss, wogegen die Änderung eines Parameters von 28000 auf 28000.5 überhaupt keinen Einfluss hat, wohl aber würde sich ein Einfluss zeigen, wenn 28000 auf 25000 geändert werden würde.

Gibt es Möglichkeiten, irgendwie zu berücksichtigen, in welchem "maß" die Parameter geändert werden müssen?
Oder habe ich in meinem Programm einen grundsätzlichen Denkfehler?

Ich dachte mir nun, dass ich diesem Problem möglicherweise durch den Vorschlag mit "multistart" zu Leibe rücken kann, allerdings kriege ich Multistart nicht zu laufen, wenn ich nach Punkt 5./6. der Dokumentation vorgehe.

Code:

 % Fitten
 %calcParam = lsqnonlin(@(PAR) objectiveFunction_lsq_2(PAR,timevec,epsvec,initcond0), ...
 %    InitialGuess);
 
 % Multistart
 problem = createOptimProblem('lsqcurvefit','x0',InitialGuess, ...
     'objective',@(PAR) objectiveFunction_lsq_2(PAR,timevec,epsvec,initcond0));
 mstart = MultiStart('PlotFcns',@gsplotbestf);
 [xmulti,errormulti] = run(mstart,problem,50);
 


Offenbar verwende ich createOptimProblem() falsch, da Matlab
"Undefined function 'createOptimProblem' for input arguments of type 'function_handle'.

Error in Optimierungsalgorithmus (line 152)
problem = createOptimProblem('lsqcurvefit','x0',InitialGuess, ..."

meldet. ... Ich wollte nur ein großräumiges "Umbauen" der Zielfunktion (timevec ist ein Zeitvektor und epsvec ein Vektor mit Messdaten, an den das Problem gefittet werden soll; die eigentliche Zielfunktion wird in objectiveFunction_lsq_2() ausgewertet und darin der fehler bestimmt, den dann objectiveFunction_lsq_2() zurückgibt; s. obiges Beispiel) vermeiden und habe gehofft, das wie im obigen Versuch gezeigt hinzubekommen. ... leider mit wenig Erfolg.

Vielleicht hat jemand noch ein paar Tipps parat?
Viele Grüße + Danke,
johepet


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.06.2017, 13:51     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Gibt es Möglichkeiten, irgendwie zu berücksichtigen, in welchem "maß" die Parameter geändert werden müssen?

Die Option 'TypicalX'.

Zitat:
Offenbar verwende ich createOptimProblem() falsch, da Matlab
"Undefined function 'createOptimProblem' for input arguments of type 'function_handle'.

Hast du denn die Global Optimization Toolbox?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2017, 14:27     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die Option 'TypicalX'.


Ah. Dann schau' ich mir die mal an; gemeinsam mit lb/ub wäre es wshl nicht schlecht, dort ein paar Einstellungen vorzunehmen, zumal ich aus verschiedenen (bekannten) Parametersets eine "ungefähre" range kenne, in welchen Grenzen sich Parameter bewegen bzw. in welchem Maße sie sich ändern ...

Zitat:
Hast du denn die Global Optimization Toolbox?


Ja, schon. ver() zeigt mir an, dass ich Version 3.2.1 (R2012a) nutze.

Liebe Grüße,
johepet
 
Harald
Forum-Meister

Forum-Meister


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

dann wundert mich das.
Versuch bitte auch mal, das Beispiel aus der Doku zu createOptimProblem auszuführen. Es kann auch sein, dass sich in den 5 Jahren etwas an der Syntax geändert hat.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2017, 16:02     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Versuch bitte auch mal, das Beispiel aus der Doku zu createOptimProblem auszuführen. Es kann auch sein, dass sich in den 5 Jahren etwas an der Syntax geändert hat.


Hier liegt anscheinend der Hase im Pfeffer: bis einschließlich Step 4 ist alles paletti, sobald ich aber Step 5 des Dokubeispiels


problem = createOptimProblem('lsqcurvefit','x0',p0,'objective',fitfcn,...
    'lb',lb,'ub',ub,'xdata',xdata,'ydata',ydata);
 


aufrufen möchte, kommt es zur selben Fehlermeldung:

"Undefined function 'createOptimProblem' for input arguments of type 'function_handle'."

... "leider" verwende ich Matlab R2012a, und offenbar hat sich gegenüber "damals" wie du vermutest etwas geändert. ...

Viele Grüße,
johepet
 
Harald
Forum-Meister

Forum-Meister


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

hast du mal in "deiner" Doku (also der in R2012a mit installierten) die Beispiele angesehen? Vielleicht musst du nur Kleinigkeiten in der Syntax ändern.

Versuch mal bitte das:
Code:
anonrosen = @(x)(100*(x(2) - x(1)^2)^2 + (1-x(1))^2);
opts = optimset('Algorithm','interior-point');
problem = createOptimProblem('fmincon','x0',randn(2,1),...
    'objective',anonrosen,'lb',[-2;-2],'ub',[2;2],...
    'options',opts);

Falls das nicht funktioniert, vielleicht mal Lizenzadministrator oder Technischen Support kontaktieren.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2017, 16:56     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Falls das nicht funktioniert, vielleicht mal Lizenzadministrator oder Technischen Support kontaktieren.


... hab's gerade ausprobiert - es kommt dieselbe Fehlermeldung zurück. Ich guck mal in "meine" Doku bzw. ansonsten werd' ich den Rat von Dir befolgen!

Viele Grüße,
johepet
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.06.2017, 20:17     Titel:
  Antworten mit Zitat      
Hallo,

eine Idee noch:
Code:
license('test', 'gads_toolbox')

testet, ob eine Lizenz verfügbar ist.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2017, 11:56     Titel:
  Antworten mit Zitat      
Hallo,

habe das gerade ausprobiert -

Code:

license('test', 'gads_toolbox')
 


meldet ans = 0 ... also keine Lizenz verfügbar/vorhanden, oder?

Viele Grüße,
johepet
 
Harald
Forum-Meister

Forum-Meister


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

genau.
ver zeigt die installierten Produkte an. Das muss aber nicht heißen, dass eine Lizenz verfügbar ist.
Wenn nicht klar ist, woran das liegt: Lizenzadministrator oder MathWorks Customer Support.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2017, 15:31     Titel:
  Antworten mit Zitat      
Alles klar.

- Ich hab mir heute sicherheitshalber mein Notebook ins Büro mitgenommen, da ich dort definitiv die notwendigen Lizenzen zur Verfügung habe. Hier scheint das MultiStart zu funktionieren, zumindest rechnet Matlab gerade, und die Berechnung scheint sehr lange zu dauern ... (Und dieses Multistartfenster ist offen, auch wenn zZt noch "Best function value is not available" angezeigt wird.)

Was ich etwas komisch finde ist nun folgendes: Am Notebook habe ich Matlab 2013a - hier gibt es plötzlich zwei Warnungen von ode23s "Warning: Failuer at t=1.6035. Unable to meet integration tolerances without reducing the step size below the smallest wallue allowed (5.69687e-15) at time t."

Wenn ich mit Matlab 2012a rechne gibt es keinerlei Meldungen/Warnungen von ode23s ... irgendwie finde ich das sehr strange.


Ansonsten beschäftigt mich immer noch die Wahl des Startvektors für die Optimierung bzw. die Angabe von typischen Schrittweiten bei der Variation der einzelnen Parameter. Letzteres würde ich gerne vermeiden, um das Ergebnis dadurch nicht zu sehr zu beeinflussen, andererseits werden dann manche Parameter überhaupt nicht bzw. nur in äußerst geringem Maße geändert, was auch nicht zielführend ist. Letztlich versuche ich die Optimierung so vorzunehmen, wie eine Kollegin in einem Bericht geschrieben hat, als sie das vor einiger Zeit gemacht hat. Leider gibt es weder ihr verwendetes Matlabskript noch Details zur Startwertewahl etc. ... und seit sie nicht mehr bei uns im Büro arbeitet ist sie auch irgendwie unerreichbar für alle :/

Jedenfalls steht in diesem Bericht "[...] Die optimale Anpassung wird in einer Regressionsanalyse auf Basis der Methode der kleinsten Quadrate bestimmt. Hierzu werden zunächst Startwerte sowie untere und obere Grenzen für alle Modellparameter festgelegt. Für die Startwerte und die gegebenen Belastungszeitpunkte (Startzeitpunkt d. unterschiedlichen Messdaten) wird die Lösung der Grundgleichung des Modells bestimmt und die berechnete mit der gemessenen Dehnung (eps) veglichen. Das Maß für die Abweichung ist die Summe der Fehlerquadrate. [...] Mit Hilfe eines Optimierungsalgorithmus werden die Parameter so lange wariiert, bis das Minimum der Fehlerquadratsumme min(F) und somit die optimale Anpassung gefunden ist. Dazu wird ein Trust-Region-Verfahren verwendet, das in der Optimization Toolbox der MATLAB-Suite zur Verfügung steht."

... und genau das versuche ich über lsqnonlin(), multistart(), "nachzubauen". ... Mit dem Unterschied, dass bisher bei mir der Fit nicht ganz klappen will, da wie gesagt mir manche der Parameter zu wenig variiert werden.

Viele Grüße,
johepet
 
johepet

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2017, 16:45     Titel:
  Antworten mit Zitat      
... was ich auch gerade festgestellt habe ist folgendes: wenn ich bei meinem "normalen" Fit

Code:
calcParam = lsqnonlin(@(PAR) objectiveFunction_lsq_2(PAR,timevec,epsvec,sigma0), ...
    InitialGuess, fit_lb, fit_ub);


neben den Anfangsbedingungen auch untere und obere Grenzen angebe, kommt es zu folgender Fehlermeldung

Code:
Warning: Failure at t=1.123290e+00.  Unable to meet integration tolerances without reducing the step size below the
smallest value allowed (3.990726e-15) at time t.
> In ode23s at 402
  In calc_eps at 47
  In objectiveFunction_lsq_2 at 11
  In @(PAR)objectiveFunction_lsq_2(PAR,timevec,epsvec,sigma0)
  In lsqnonlin at 197
Error using snls (line 48)
Objective function is returning undefined values at initial point. lsqnonlin cannot continue.

Error in lsqncommon (line 175)
    [xC,FVAL,LAMBDA,JACOB,EXITFLAG,OUTPUT,msgData]=...

Error in lsqnonlin (line 235)
[xCurrent,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
 


was mir sehr schleierhaft ist, da die Gleichung ansich sowohl mit den unteren, als auch den oberen Grenzen bzw. den Startwerten gelöst werden kann.

Code:

lb   ub   InitialGuess
1   40000   28120,0057319036
-4   0   -1,95139657282257
-4   0   -1,25528863850551
1   40000   2895,38015965734
1   500   247,216141333195
0   3   0,643105403403409
1   2000   3238,96522552722
1   6500   857,700921524942
1   10000000000,0000   49394016,1164262
0   2000   1050
0   200   110
0   2000   1600
0   800   670
0   200   0
 


Hach. ... entweder stelle ich mich echt dämlich an, oder Optimierungsaufgaben sind doch nicht ganz so einfach zu handeln :/

Viele Grüße,
johepet
 
Harald
Forum-Meister

Forum-Meister


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

schwer, dazu was zu sagen, ohne das komplett vor mir zu haben. Vielleicht brauchst du auch mal die Unterstützung von jemand, dessen Job das ist, z.B. Technischer Support oder Consulting von MathWorks.

Was die Kollegin mit dem Lösen der Grundgleichung meint, weiß ich nicht.

Wenn Parameter zu wenig variiert werden, würde ich das entsprechende 'TypicalX' erhöhen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2017, 12:46     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
schwer, dazu was zu sagen, ohne das komplett vor mir zu haben. Vielleicht brauchst du auch mal die Unterstützung von jemand, dessen Job das ist, z.B. Technischer Support oder Consulting von MathWorks.

Was die Kollegin mit dem Lösen der Grundgleichung meint, weiß ich nicht.


Hm. Das stimmt ... ich wusste bisher gar nicht, dass es das gibt. Also Technischen Support/Consulting von MatLab.

Nichtsdestotrotz habe ich aber meinen vollständigen bisherigen Versuch auf den Server gelegt. Die (kommentierte) Hauptdatei ist "Optimierungsalgorithmus.m", von dieser aus werden die entsprechenden Funktionen aufgerufen, Messdaten eingelesen etc.

Mit "Grundgleichung" meint sie eigentlich nur die Zielfunktion (diese "sperrige" steife DGL); in dem Bericht/Arbeit wird die so bezeichnet.

Viele Grüße,
johepet
 
johepet

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2017, 17:44     Titel:
  Antworten mit Zitat      
Hallo,

ich glaube, ich hab's nun gelöst. ... Also mit einigem Herumprobieren bin ich nun doch in die Gefilde der globalen Optimierung eingetreten und habe das über Multistart in Angriff genommen. Dafür habe ich zunächst (auf Basis der mir bekannten Parameter bzw. meines Initial-Guess') untere und obere Grenzen festgelegt und dann das entsprechende Multistart-Problem daraus gebaut und Matlab arbeiten lassen.
Auch wenn zwischendurch Meldungen aufpoppen, dass manchmal die DGL nicht lösbar ist, glaube ich, dass das aus dem Minimierungsprozess selbst herrührt.

Die entsprechende Code-Erweiterung sieht nun so aus:
Code:

fit_lb = [1;-3;-3;1;1;0;1;1;1;0;0;0;0;0];
fit_ub = [40000;0;0;40000;500;2;40000;1000;1e8;5000;500;2000;1000;500];

params = [fit_lb, fit_ub, InitialGuess];

% Multistart
 problem = createOptimProblem('lsqnonlin','x0',InitialGuess, ...
        'lb', fit_lb, 'ub', fit_ub, ...
        'objective',@(PAR) objectiveFunction_lsq(PAR, timevec, epsvec, ...
        sigma0));
    mstart = MultiStart('PlotFcns',@gsplotbestf);
    [x,fval,eflag,output,manymins] = run(mstart,problem,500);
 


Unschlüssig bin ich nur darüber, woher die Kollegin wusste, wie stark manche Parameter streuen ... vielleicht erreiche ich sie irgendwie, damit sie mir hier auf die Sprünge helfen kann. Entweder kam das aus "trial and error" oder aber aus einer sehr umfangreichen globalen Optimierung mit +1000 Iterationen bei Multistart? - Ich weiß nicht.

Viele Grüße,
johepet
 
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.