Verfasst am: 11.07.2017, 06:55
Titel: Materialdatenanpassung an Messdaten mit "lsqcurvefit&qu
Hallo zusammen,
derzeit sitze ich an einer Anpassung von Daten (8 Parameter) möglichst so, dass die Messdaten über alle Messungen am besten "getroffen" werden. Dafür gibt es in MATLAB den Befehl "lsqcurvefit". In eigentlich allen Beispielen die ich bis jetzt gefunden habe, werden als Funktion dafür jedoch geschlossen darstellbare Funktionen verwendet, in meinem Fall ist das leider nicht mehr so einfach hinzuschreiben.
Ist es möglich, dass die Funktion in lsqcurvefit nicht als Einzeiler dasteht, sondern sich aus verschiedenen Rechenoperationen erst ergibt, in meinem Fall nach mehreren Koordinatentransformationen, Summationen und einer Matrixinversion.
In der Funktion müssten dann nacheinander die Rechenoperationen stehen mit einem Vektor x(1,...,8 ) , x0(1,...,8 ) und den zugehörigen 16 lb bzw. ub. Der Fit selbst soll nur für einen Messpunkt erfolgen.
Verfasst am: 12.07.2017, 19:26
Titel: Re: Materialdatenanpassung an Messdaten mit "lsqcurvefi
Hallo syLeZ,
Du kannst die zu fittende Funktion auch als Funktion schreiben und dann den Function-Handle als Input an
lsqcurvefit
liefern.
Das finde ich sogar deutlich übersichtlicher, denn anonyme Funktionen kann man nicht mit dem Debugger überprüfen.
danke für den Hinweis mit dem function handle. Bei dem Problem hat sich zwischenzeitlich eine Änderung ergeben, sodass lsqcurvefit wahrscheinlich nicht mehr funktioniert, da die Funktion abhängig von der Probe ist (Ausrichtungswinkel, Probendicke, usw.).
Jetzt habe ich das mit fmincon gelöst, wobei ich 8 Material-Entwurfsvariablen (EV) habe. Zielfunktion ist dann sum(Theorie(EV)-Messwert)^2 -> 0 (Summe der kleinsten Fehlerquadrate) für alle Proben gleichzeitig.
An sich funktioniert die Optimierung und das Ergebnis ist zunächst auch nicht so verkehrt, jedoch die Bildung der Funktion Theorie(EV) ist derzeit noch für jede Probe einzeln im Skript zu definieren, da diese (wie erwähnt) alle mithilfe andere Probeneigenschaften bestimmt werden, also bspw.:
Funktion 1: f11 mit Probe 1, Oberseite, x-Richtung
Funktion 2: f12 mit Probe 1, Oberseite y-Richtung
Funktion 3: f13 mit Probe 1, Unterseite x-Richtung
.....
und dann eben
Code:
R = @(EV)sum(f11(Parameter, xdata)-ydata(1,1))^2+sum(f12(.....)
Die Funktion selbst für x und y ist immer die gleiche, ich gebe dann halt eine Nummer ein und innerhalb der Funktion wird gesucht, welche zugehörigen Probendaten verwendet werden müssen.
Meine Frage nun: Kann man das irgendwie automatisieren ? Also das abhängig von der Probenanzahl in die Zielfunktion integriert wird, wie viele Summe der Fehlerquadrate ich woraus bilden muss ?
Zudem gibt es irgendwie noch das andere Thema, ich würde gern die Variablen überwachen (also Entwurfsvariable und fval), mit folgendem Befehl (aus dem Manual):
Als OutputFcn hätte ich zunächst mal auch das aus dem Manual kopiert:
Code:
function stop = outfun(x,optimValues,state)
stop = false;
switch state
case 'init'
hold on
case 'iter'
% Concatenate current point and objective function % value with history. x must be a row vector.
history.fval = [history.fval; optimValues.fval];
history.x = [history.x; x];
% Concatenate current search direction with % searchdir.
searchdir = [searchdir;...
optimValues.searchdirection'];
plot(x(1),x(2),'o');
% Label points with iteration number and add title. % Add .15 to x(1) to separate label from plotted 'o' text(x(1)+.15,x(2),... num2str(optimValues.iteration));
title('Sequence of Points Computed by fmincon');
case 'done'
hold off
otherwise end end
Oder geht das nicht ? Denn wenn ich dann meine Optimierung ausführe, kommt folgender Fehler:
Code:
To use 'history', you might need:
history - Datafeed Toolbox
history - Datafeed Toolbox
history - Datafeed Toolbox
history - Datafeed Toolbox
history - Datafeed Toolbox
history - Datafeed Toolbox
history - Trading Toolbox
history - Trading Toolbox
Error in outfun (line10)
history.fval = [history.fval; optimValues.fval];
Error in callAllOptimOutputFcns (line13)
stop(i) = feval(OutputFcn{i},xOutputfcn,optimValues,state,varargin{:});
Error in nlconst>callOutputAndPlotFcns (line968)
stop = callAllOptimOutputFcns(outputfcn,xOrigShape,optimValues,state,varargin{:}) || stop;
Error in nlconst (line528) [xOrigShape, optimValues, stop] = callOutputAndPlotFcns(outputfcn,plotfcns,caller,problemInfo, ...
Scheinbar ist 'history' auch als Function in den entsprechenden Toolboxen verwendet. Jedoch auch wenn ich den struct umbennene zu meinetwegen 'histories', kommt das Ergebnis, dass diese Variable undefiniert ist, selbst wenn ich sie als globale Variable setze.
Wo liegt da der Fehler, vielleicht kann jemand helfen ?
Von globalen Variablen kann man wirklich nur abraten. Sie machen einem das Debuggen und damit das Leben schwer.
Aber theoretisch sollten sie funktionieren. In Deinem Fall scheint etwas mit der Deklaration als
global
schief gegangen zu sein. Ohne den Code davon zu sehen, kann man nicht raten, was zu ändern ist.
Versuche es doch mal mit eine lokalen persistenten Variable:
switch state
case 'init'
hold on
history.x = [];
history.fval = [];
history.searchdir = [];
case 'iter'
% Concatenate current point and objective function % value with history. x must be a row vector.
history.fval = [history.fval; optimValues.fval];
history.x = [history.x; x];
% Concatenate current search direction with % searchdir.
history.searchdir = [history.searchdir;...
optimValues.searchdirection'];
plot(x(1),x(2),'o');
% Label points with iteration number and add title. % Add .15 to x(1) to separate label from plotted 'o' text(x(1)+.15,x(2),... num2str(optimValues.iteration));
title('Sequence of Points Computed by fmincon');
case 'done'
hold off
case 'gethistory'
stop = history;
otherwise end end
Vielen Dank, das funktioniert wunderbar. Lediglich die Art der Abspeichern des structs für x habe ich geändert, damit die 8 Entwurfsvariablen spaltenweise nebeneinander geschrieben werden.
Hast du auch eine Idee für das erste Problem, oder ist das so direkt nicht lösbar ?
Also wird für beide Proben die gleiche Funktion verwendet und Probe1 entscheidet welche Parameter dafür eingelesen werden. Allerdings muss ich das für fmincon diskret hinschreiben und kann nicht dynamisch einlesen wie viele Proben ich habe und dementsprechend die Optimierung aufbauen .
Ich hoffe damit wird das Problem ein wenig deutlicher
Also wird für beide Proben die gleiche Funktion verwendet und Probe1 entscheidet welche Parameter dafür eingelesen werden. Allerdings muss ich das für fmincon diskret hinschreiben und kann nicht dynamisch einlesen wie viele Proben ich habe und dementsprechend die Optimierung aufbauen .
Ich denke, wenn man weiß, worum es geht, ist das trivial. Aber solange ich keine Ahnung habe, was Du genau tust, erkenne ich den Sinn dahinter nicht.
Generell ist die Verwendung anonymer Funktionen für komplizierte Aufgaben immer eine schlechte Idee. Mit einer echten funktion hat man ja viel mehr Möglichkeiten.
Vielleicht wird es damit deutlicher, für die Berechnung 1-4 werden jeweils 2x "fun1" und "fun2" (für Richtung) verwendet. "pr_num" entscheidet über die Probe und damit die aus "data" und "z"gelesenen Daten. Die "1" oder "0" entscheidet wiederrum über die Position.
Am Schluss wird das Ganze mittels Summe der Quadrate aufsummiert und mittels fmincon minimiert. Die Normierung muss nur erfolgen, da die Werte so klein sind. Das Endergebnis passt soweit auch, aber ich muss die Funktionen "fij" (i - Probe, j-Berechnung) einzeln einfügen vorher und die Funktion R mit eingeben. Bei 10 Proben ist der Kopieraufwand noch vertretbar, jedoch bei vielen Proben ist es doch erheblich, zudem sich manchmal ergibt, das man dann nicht alle betrachten will.
Vielleicht gibt es ja doch eine Möglichkeit, dass zu automatisieren. Wie ganz oben bereits erwähnt, die Funktion vorher analytisch hinschreiben ist schwierig..
Vielen Dank schonmal!
syLez
Einstellungen und Berechtigungen
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.