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

Materialdatenanpassung an Messdaten mit "lsqcurvefit&qu

 

syLeZ
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 03.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2017, 06:55     Titel: Materialdatenanpassung an Messdaten mit "lsqcurvefit&qu
  Antworten mit Zitat      
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.

Ist so etwas möglich mit lsq ?

Vielen Dank im Voraus

syLez
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.07.2017, 19:26     Titel: Re: Materialdatenanpassung an Messdaten mit "lsqcurvefi
  Antworten mit Zitat      
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
syLeZ
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 03.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2017, 06:24     Titel:
  Antworten mit Zitat      
Hallo Jan,

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 ?

Vielen Dank im Voraus !!

sylez
Private Nachricht senden Benutzer-Profile anzeigen
 
syLeZ
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 03.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2017, 08:41     Titel:
  Antworten mit Zitat      
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):

Code:


history.x = [];
history.fval = [];
searchdir = [];
 
options = optimoptions(@fmincon,'OutputFcn',@outfun,...
    'Display','iter','Algorithm','active-set');
xsol = fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);
 


wobei entscheidend für die Abspeicherung der Variablen während der Iteration:
Code:
options = (.....'OutputFcn', @outfun)....


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 (line 10)
           history.fval = [history.fval; optimValues.fval];

Error in callAllOptimOutputFcns (line 13)
    stop(i) = feval(OutputFcn{i},xOutputfcn,optimValues,state,varargin{:});

Error in nlconst>callOutputAndPlotFcns (line 968)
            stop = callAllOptimOutputFcns(outputfcn,xOrigShape,optimValues,state,varargin{:}) || stop;

Error in nlconst (line 528)
            [xOrigShape, optimValues, stop] = callOutputAndPlotFcns(outputfcn,plotfcns,caller,problemInfo, ...

Error in fmincon (line 749)
        nlconst(funfcn,X,l,u,full(A),B,full(Aeq),Beq,confcn,options,defaultopt, ...

Error in test (line 12)
xsol = fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);
 


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 ?

Vielen Dank

sylez
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.07.2017, 13:53     Titel:
  Antworten mit Zitat      
Hallo syLeZ,

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:

Code:
function stop = outfun(x,optimValues,state)
persistent history

     stop = false;
 
     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
 

Nun kannst Du nach der Optimierung die OutputFcn fragen:
Code:
history = outfun([],[],'gethistory')

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
syLeZ
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 03.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2017, 15:45     Titel:
  Antworten mit Zitat      
Hallo Jan !

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 ?

Viele Grüße

sylez
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.07.2017, 16:48     Titel:
  Antworten mit Zitat      
Hallo syLeZ,

Welches ist nochmal genau das "erste Problem"?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
syLeZ
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 03.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2017, 19:09     Titel:
  Antworten mit Zitat      
Das eigentliche Problem derzeit ist folgendes:

In meiner Zielfunktionen sind gleiche Funktionen mehrfach verwendet, deren Input allerdings entscheidet, welche Probe verwendet wird:

Code:

R=@(x) (f11(xdata, x)-ydata(1,1))^2+(f12(xdata,x)-ydata(1,2))^2+....)
 

mit:

Code:

f11=@(x)funX(...., Probe1);
f12=@(x)funX(...,Probe2);
 


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 Smile

Vielen Dank !

SyLeZ
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.07.2017, 15:34     Titel:
  Antworten mit Zitat      
Hallo syLeZ,

Sorry, ich kann dir nicht folgen.
Zitat:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
syLeZ
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 03.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2017, 07:48     Titel:
  Antworten mit Zitat      
Nachfolgend habe ich mal den originalen Code eingefügt, damit es verständlicher wird Smile Die erforderlichen Daten werden vorher aus ".m" Files eingelesen.

zunächst der Startwert und die Mesdaten:
Code:

 x0=[...]; % Startwert    
 xdata=[...]; % Messdaten 1: 4 Messwerte
 ydata=[...]; % Messsdaten 2: 1 Messwert
 

dann die Funktion zur Berechnung des Ausgabewertes:
Code:

% Parameter: Entwurfsvariablen
% data; z: für Berechnung erforderliche Daten
% pr_num: Probennummer
  %% für 1
 f11 = @(Parameter, xdata) fun1(Parameter, xdata, data, pr_num(1,1), z, 1); % Berechnung 1 Position 1 Richtung 1
 f12 = @(Parameter, xdata) fun2(Parameter, xdata, data, pr_num(1,1),z, 1); % Berechnung 2 Position 1 Richtung 2
 f13 = @(Parameter, xdata) fun1(Parameter, xdata, data, pr_num(1,1),z, 0); % Berechnung 3 Position 2 Richtung 1
 f14 = @(Parameter, xdata) fun2(Parameter, xdata, data, pr_num(1,1),z, 0); % Berechnung 4 Position 2 Richtung 2
%% für 2: (analog, nur mit pr_num(2,1), usw..)
 

und die zu minimierende Funktion ergibt sich dann zu:
Code:

 R = @(Parameter)   ( ((f11(Parameter, xdata) - ydata(1,1))/ydata(1,1)).^2  ) +...
                              ( ((f12(Parameter, xdata) - ydata(1,2))/ydata(1,2)).^2  ) +...              
                              ( ((f13(Parameter, xdata) - ydata(1,3))/ydata(1,3)).^2  ) +...      
                              ( ((f14(Parameter, xdata) - ydata(1,4))/ydata(1,4)).^2  ) +...
 

und schließlich (nach Eingabe der RB) der fmincon Befehl:
Code:

 [X,fval,exitflag,output] = fmincon(R, x0, K, E, Keq, Eeq, lb, ub, [], opts);
 


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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