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

Anonyme Funktion/ Function handle

 

Corleone
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2018, 14:36     Titel: Anonyme Funktion/ Function handle
  Antworten mit Zitat      
Hallo zusammen,

für meine Masterarbeit passe ich einen Code an der sehr Umfangreich ist. Ich ändere aber nur einzelne Funktionen ab bzw. passe sie an. In einer Funktion wird mit einer anonymen Funktion der Vektor x geändert sodass sich immer neue Eingabewerte ergeben. Der Code sieht folgendermaßen aus:

Code:

for p = P
    x = ones(1,3);
    if(exist('optional_config', 'var'))
        temp_deg = optional_config.motor_temp;
        Q = @(x)g04_fig_of_merit(g04_GrobauslegungV3(x(1)*P_n, x(2)*n_n, x(3)*U_n,              ), P_n, n_n,Uberlastfaktor_auslegung, optional_config);
        else
        Q = @(x)g04_fig_of_merit(g04_GrobauslegungV3(x(1)*P_n, x(2)*n_n, x(3)*U_n, ), P_n, n_n, Uberlastfaktor_auslegung);
    end
 


Ich hab einen function handle und übergebe den Wert von x an die beiden Funktionen bzw. Anwendung findet er nur in der "Grobauslegung".
Ich kann über die Debugging-stops sehen was mit x passiert:

Die Zeile von Q = ... wird sehr oft durchlaufen, es erinnert mich sehr an eine while-Schleife. Und die Einträge von X werden angepasst wie wenn einer Optimierung der Ergebnisse aus Fig_of_merrit bzw. Grobauslegung stattfindet. Wie die Funktion aber genau aussieht kann ich nicht sehen also ist wird nie eine Funktion zugewiesen in diesem Codeabschnitt. Es handelt sich dabei um eine Funktion die abgesehen von Eingabe und Ausgabe Variablen nicht mehr beinhaltet als der Code oben.


Deshalb lautet meine Frage wie kann ich die Funktion die Aufgerufen wird finden?
Es kann sein das ich mich einfach nur dumm anstelle aber ich bin aufgeschmissen ich hoffe jemand kann mir helfen.

Vielen Dank im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.09.2018, 18:25     Titel:
  Antworten mit Zitat      
Hallo,

Code:
which g04_GrobauslegungV3
edit g04_GrobauslegungV3


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Corleone
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2018, 18:39     Titel:
  Antworten mit Zitat      
Hallo Harald,

Viele Dank zunächst für deine Antwort

leider beantwortet das nicht meine Frage,

ich kenne die beiden Funktionen fig_of_Merrit und GrobauslegungV3.

Wenn ich einen Debugging-Punkt setze nach der anonymen Funktion dann kann ich beobachtet wie sich x ändert. Und somit die Eingangswerte für GrobauslegungV3. In der fig_of_merrit wird dann bewertet wie die Ergebnisse von aus der Grobauslegung zu den Werten passen die ursprünglich eingegeben wurden, also P_n, n_n und U_n. Was sich mir aber verschließt ist wie die Änderung von x zustande kommt. Da steckt eine Logik dahinter, aber in keiner der Funktionen die dem functionhandle folgen wird x verändert.


Ich hoffe so ist das Problem etwas klarer.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.09.2018, 18:53     Titel:
  Antworten mit Zitat      
Hallo,

dass das die Frage ist, war mir nicht klar.
Der vorliegende Code verändert x nicht. Ungeschickt ist, dass x = ones(1,3) gesetzt wird, was aber mit der Verwendung als anonymes Function Handle nichts zu tun hat. Letztlich ist es so, dass irgendwo anders in dem Code (dort, wo Q verwendet wird) festgelegt wird, mit welchem Eingabevektor Q aufgerufen wird. Gibt es vielleicht irgendwo ein fmincon, fminsearch oder ähnliches?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Corleone
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2018, 19:03     Titel:
  Antworten mit Zitat      
Hallo Harald,

entschuldige da hatte ich mich wohl nicht ganz exakt ausgedrückt. Ich Poste dir hier mal den komplette Code. Dort ist am ende noch ein fminsearch wie du siehst.

Das Problem ist ganz genau das mir bei manchen Konfigurationen die Werte "abhauen" heißt z.B. das x(3) ins negative abrutscht, was zumindest Momentan das Problem ist. Mir war nur nie klar an was diese X-Variation festgemacht ist.

Code:
function par = g04_iterative_design_motor(P_n, n_n, U_n)
% Aufteilung der Konstruktionsparameter in qualitative und quantitative.
% Hier werden nur quantitative Parameter variiert: P_n, n_n, U_n,
% zusammengefasst im Vektor x = [P_n, n_n, U_n]
eta = 0;
P_n=P_n
for p = P
    x = ones(1,3);
    if(exist('optional_config', 'var'))
        temp_deg = optional_config.motor_temp;
        Q = @(x)g04_fig_of_merit(g04_GrobauslegungV3(x(1)*P_n, x(2)*n_n, U_n), P_n, n_n, optional_config);
        else
        Q = @(x)g04_fig_of_merit(g04_GrobauslegungV3(x(1)*P_n, x(2)*n_n, x(3)*U_n), P_n, n_n);
    end
    [x_opt, q_val] = fminsearch(Q, x);
    par_cycle = g04_GrobauslegungV3(x_opt(1)*P_n, x_opt(2)*n_n, U_n);
    par_cycle.X = x;
    if(par_cycle.sec.eta_nom>eta&&q_val<1e-2)
        par = par_cycle;
        eta = par_cycle.sec.eta_nom;
    end
end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

fminsearch übernimmt die Variation von x. Ausgehend vom angegebenen Startwert wird ein Minimum gesucht. Die genaue Vorgehensweise findest du in der Dokumentation ziemlich weit unten unter "Algorithms".
Wenn es Nebenbedingungen für x gibt (z.B. x(3) >= 0), würde ich eher zu fmincon raten.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Corleone
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2018, 19:54     Titel:
  Antworten mit Zitat      
Hallo Harald,

okay vielen Dank, darauf wäre ich nicht gekommen das der zusammen her so zustande kommt.

Ich verwende als das ganz ungefähr so:
Code:

    A=[];
    b=[];
    Aeq=[];
    beq=[];
    lb=[0.9,0.9,0.9];
    ub=[1.1,1.1,1.1];
    [x_opt, q_val] = fmincon(Q, x,A,b,Aeq,beq,lb,ub);
 


Damit setzt ich jeweils ein oberes und unteres Limit?
Was ich jetzt nicht finden kann in der Beschreibung ist das Verfahren für eine 3D minimum zu finden. Ich habe hier einfach mal die Vorschlag übernommen wie er in der Matlab Hilfe steht.

Gibt es hier eine Möglichkeit die Iteration zu begrenzen, entweder durch z.B. 20 Schritte oder den erlaubten Fehler wie z.b. das die Annäherung im letzten Schritt kleiner als ein bestimmter Wert war und damit die Minimumsuche Abgeschlossen ist.


Vielen Dank im Voraus


[Update]

Ich habe es glaub ich gefunden, unter App kann ich in der Optimization App alles einstellen was ich bereits beschrieben habe. Momentan rechnet Matlab, wenn es funktioniert dann ist soweit alle geklärt. Schreib es dann nochmal dazu
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Damit setzt ich jeweils ein oberes und unteres Limit?

Genau.

Zitat:
Was ich jetzt nicht finden kann in der Beschreibung ist das Verfahren für eine 3D minimum zu finden.

Die Vorgehensweise ist von der Anzahl der Dimensionen unabhängig.

Zitat:
Gibt es hier eine Möglichkeit die Iteration zu begrenzen, entweder durch z.B. 20 Schritte oder den erlaubten Fehler wie z.b. das die Annäherung im letzten Schritt kleiner als ein bestimmter Wert war und damit die Minimumsuche Abgeschlossen ist.

Über die Optionen, das letzte Argument von fmincon.

Zitat:
Ich habe es glaub ich gefunden, unter App kann ich in der Optimization App alles einstellen was ich bereits beschrieben habe.

In der App kannst du auch Code generieren (File --> Generate Code).

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Corleone
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2018, 20:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

jetzt langsam komme ich voran das ich den Solver auch ans laufen bekomme, vielen Dank dafür schon einmal!

Abschließende Frage, der Code ist nun folgendermaßen:

Code:
A=[];
    b=[];
    Aeq=[];
    beq=[];
    lb=[0.9,0.9,0.9];
    ub=[1.1,1.1,1.1];
    options = optimoptions('fmincon');
    options = optimoptions(@fmincon,'MaxIterations',100,'FunctionTolerance',1e-3,'OptimalityTolerance',1e-3);
    [x_opt, q_val] = fmincon(Q,x,A,b,Aeq,beq,lb,ub,options);


Jedoch schmeißt Matlab immer einen Fehler das wegen "options" genauer Fehler ist folgender:

Error using optimfcnchk (line 99)
NONLCON must be a function.

Error in fmincon (line 421)
confcn = optimfcnchk(NONLCON,'fmincon',length(varargin),funValCheck,flags.gradconst,false,true);

Error in g04_iterative_design_motor (line 31)
[x_opt, q_val] = fmincon(Q,x,A,b,Aeq,beq,lb,ub,options);


Stehe ich mal wieder auf dem Schlauch, genau so steht es in der Matlab hilfe?! Lasse ich das "options" weg an letzter Stelle dann werden meine Optionen nicht übernommen habe beim MaxIterations dazu einmal 2 eingegeben aber abgebrochen wird nicht.

[Update]

Ok, 1. Fehler gefunden ich muss noch eine lehre Klammer einstellen vor den "options" jetzt wird kein Fehler mehr ausgegeben. Jedoch werden meine Änderungen nicht so richtig übernommen. Soll heißen es wird statt 2 mal 12 mal iteriert bis abgebrochen wird.

Vielen Dank im Voraus
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.09.2018, 21:47     Titel:
  Antworten mit Zitat      
Hallo,

wo legst du denn die 2 fest? Im Code sehe ich nur 100.
Bist du sicher, dass du die Anzahl der Iterationen des Algorithmus und die Anzahl der Funktionsauswertungen nicht verwechselst?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Corleone
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2018, 22:13     Titel:
  Antworten mit Zitat      
Hallo Harald,

ja bin mir sicher das ich da 2 eingetippt habe:

Code:
A=[];
    b=[];
    Aeq=[];
    beq=[];
    lb=[0.8,0.8,0.8];
    ub=[1.2,1.2,1.2];
    optionsnew = optimoptions('fmincon');
    optionsnew = optimoptions(@fmincon,'MaxIterations',2,'FunctionTolerance',1e-3,'OptimalityTolerance',1e-3);


Aber es ist jetzt so okay, die 2 waren auch nur um zu überprüfen das alles funktioniert. Es wirft jetzt nach einer angemessenen Zeit ab und hat einen guten Wert. Den ich so physikalisch vertreten kann.


Vielen Dank aufjedenfalls und ich lass den Threat mal offen falls sich noch einmal Fragen ergeben.
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 - 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.