Verfasst am: 19.09.2018, 13:36
Titel: Anonyme Funktion/ Function handle
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.
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 ;)
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.
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 ;)
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
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 ;)
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
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 ;)
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.
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 ;)
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.
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.