Optimisierungsproblem: Parameter einer DGL optimal wählen
johepet
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 29.06.2017, 13:22
Titel:
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.
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
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
johepet
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 29.06.2017, 14:27
Titel:
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.
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
johepet
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 29.06.2017, 16:02
Titel:
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. ...
hast du mal in "deiner" Doku (also der in R2012a mit installierten) die Beispiele angesehen? Vielleicht musst du nur Kleinigkeiten in der Syntax ändern.
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
johepet
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 30.06.2017, 15:31
Titel:
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: ---
Verfasst am: 30.06.2017, 16:45
Titel:
... was ich auch gerade festgestellt habe ist folgendes: wenn ich bei meinem "normalen" Fit
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 stepsize 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 (line48)
Objective functionis returning undefined values at initial point. lsqnonlin cannot continue.
Error in lsqncommon (line175) [xC,FVAL,LAMBDA,JACOB,EXITFLAG,OUTPUT,msgData]=...
Error in lsqnonlin(line235) [xCurrent,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
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
johepet
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.07.2017, 12:46
Titel:
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: ---
Verfasst am: 03.07.2017, 17:44
Titel:
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:
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.
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.