Ich bin neu hier und hoffe, ihr könnt mit meinem Problem weiterhelfen, da ich deswegen langsam echt am Verzweifeln bin...
Ich habe eine Temperaturfunktion und eine Zieltemperatur gegeben und möchte nun die mittlere Temperaturabweichung in Abhängigkeit des Heizwertes minimieren. Normalerweise ist die Temperaturfunktion in Simulink implementiert. Für das folgende Minimalbeispiel habe ich die Funktion aber in den Matlab-Code geschrieben, was ja keinen Unterschied machen sollte (oder?).
Als Optimierungsalgorithmus verwende ich ein selbst implementiertes SQP-Verfahren.
Mein Problem ist nun, dass der Algorithmus quasi unendlich viele Iterationen braucht, da die einzelnen Iterationen hin- und herspringen. Und ich kann mir einfach nicht erklären, wieso...
% Parameter des Temperaturmodells
k1 = 0.05/(1.19*1006*4.36*1.8*1.5*0.5);
k2 = 25*2;
% Temperaturberechnung
lt = 100*lp+1;
T = zeros(lt,1);
T(1) = 291.15; % Anfangswert for jd=1:lp
for id=(100*jd-98):(100*jd+1)
T(id) = T(id-1) + k1*(100 + P(jd) + k2*( T_inf - T(id-1)));
end end
% Zieltemperatur
T_des = 295.15;
% Temperaturabweichung
dT = zeros(lt,1);
for id=1:lt
dT(id) = norm(T(id)-T_des);
end
% Jacobimatrix der Temperatur
jac_T = zeros(lt,lp);
for jd=1:lp
for id=100*jd-98:100*jd+1
jac_T(id,jd) = jac_T(id-1,jd)*(1-k1*k2) + k1;
end for id=100*jd+2:lt
jac_T(id,jd) = jac_T(id-1,jd)*(1-k1*k2);
end end
% Jacobimatrix der Temperaturabweichung
jac_dT = zeros(lt,lp);
for jd=1:lp
for id=1:lt
jac_dT(id,jd) = jac_T(id,jd)*(T(id)-T_des)/dT(id);
end end
erste Frage wäre: warum implementierst du SQP selber statt den entsprechenden Algorithmus von fmincon auszuwählen?
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 ;)
Die obige Zielfunktion ist nur ein Teil des ganzen Problems, d.h. ich habe eigtl. noch mehr Zielfunktionen, die dann alle normiert und gewichtet in eine Fitnessfunktion einfließen. Einige der anderen Zielfunktionen liegen allerdings nicht analytisch vor, sodass der Gradient nur numerisch berechnet werden kann. Das Gesamtproblem ist also ziemlich komplex.
Mein erster naiver Versuch war dann natürlich, dass ich erstmal fmincon auf das Ganze anzuwenden, aber dann kam immer die folgende Meldung:
fmincon stopped because the size of the current step is less than the default value of the step size tolerance and constraints are satisfied to within the default value of the constraint tolerance.
Auch hier konnte ich mir nicht richtig erklären, wieso. Deshalb habe ich angefangen das SQP-Verfahren selbst zu implementieren, um bessere Fehlerforschung betreiben zu können.
die Meldung bedeutet im Grunde "ich bin fertig, alles gut".
Gibt es denn etwas, das dich glauben lässt, dass doch nicht alles gut ist?
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 ;)
Hey! Ja, sorry, ich hätte noch dazu erwähnen sollen, dass die Meldung unabhängig vom Startpunkt direkt kam, ohne dass überhaupt eine Iteration berechnet wurde.
Aber ganz abgesehen davon, mein SQP-Code müsste im Grunde ja ähnlich aufgebaut sein wie das bereits in Matlab implementierte Verfahren und dann auch eine Lösung finden, was es aber nicht tut.
dann würde ich die Toleranz heruntersetzen.
Tritt das Problem denn auch beim MATLAB-Code auf oder nur beim Simulink-Modell?
Ich müsste mich erst in die Arbeitsweise von SQP hineinfuchsen um dann eventuell zu sehen, wo in deinem Code das Problem liegt. Die zielführendere Vorgehensweise dürfte sein, das Problem mit fmincon zu untersuchen.
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 ;)
Das habe ich leider schon direkt am Anfang probiert. Wenn ich die Toleranzen runtersetze, kommt irgendwann die Meldung, dass die Anzahl der max. Funktionsaufrufe erreicht wurde. Wenn ich diese erhöhe, kommt wiederum die erste Meldung usw.
Die Meldungen sind auch unabhängig davon, ob ich die Funktion in Matlab oder Simulink implementiere.
Mit fmincon habe ich also schon eigtl. alle möglichen Einstellungen ausprobiert, sodass ich irgendwann dazu übergegangen bin, das Verfahren selbst zu implementieren, da ich es so doch besser untersuchen kann.
Das Verfahren funktioniert auch bei anderen Testproblemen einwandfrei, nur eben mit meiner Temperaturfunktion nicht und ich kann mir leider absolut nicht erklären, wieso
Vielleicht noch ein bisschen Hintergrundinformation: die Temperaturfunktion ist ja so aufgebaut, dass der gleiche Heizwert für mehrere Zeitschritte verwendet wird (genauer: für t = 0, 0.05, 0.1,... , 5s wird P1 verwendet, für t =5.05,...,10 P2 usw). Das hat den Hintergrund, dass ich in Simulink eine Diskretisierung mit Schrittweite 0,05s habe (was nötig ist, damit ich den numerischen Gradienten der anderen Zielfunktionen annähernd richtig berechnen kann). Meine Optimierung baut jedoch auf einer Diskretisierung von 5s auf (was nötig ist, damit die Anzahl der Optimierungsvariablen sinkt, sodass man auch alle Gradienten in einer annehmbaren Rechenzeit berechnen kann).
Wenn ich allerdings beides Mal eine Diskretisierung von 1s wähle (d.h. T1 verwendet P1, usw.), funktioniert der Algorithmus auch. Nur wie gesagt, so kann ich meine Diskretisierung für das Gesamtproblem nicht wählen.
Hat vielleicht noch jemand eine Idee, wo das Problem liegen könnte?
kannst du mir das Beispiel mit fmincon schicken? Dann schaue ich mir das mal an.
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 ;)
% Parameter des Temperaturmodells
k1 = 0.05/(1.19*1006*4.36*1.8*1.5*0.5);
k2 = 25*2;
% Temperaturberechnung
lt = 100*lp+1;
T = zeros(lt,1);
T(1) = 291.15; % Anfangswert for jd=1:lp
for id=(100*jd-98):(100*jd+1)
T(id) = T(id-1) + k1*(100 + P(jd) + k2*( T_inf - T(id-1)));
end end
% Zieltemperatur
T_des = 295.15;
% Temperaturabweichung
dT = zeros(lt,1);
for id=1:lt
dT(id) = norm(T(id)-T_des);
end
% Jacobimatrix der Temperatur
jac_T = zeros(lt,lp);
for jd=1:lp
for id=100*jd-98:100*jd+1
jac_T(id,jd) = jac_T(id-1,jd)*(1-k1*k2) + k1;
end for id=100*jd+2:lt
jac_T(id,jd) = jac_T(id-1,jd)*(1-k1*k2);
end end
% Jacobimatrix der Temperaturabweichung
jac_dT = zeros(lt,lp);
for jd=1:lp
for id=1:lt
jac_dT(id,jd) = jac_T(id,jd)*(T(id)-T_des)/dT(id);
end end
was mich verwundert: für die Zielfunktionsberechnung verwendest du norm. Das ist aber doch gar nicht differenzierbar?
Wäre es dann nicht sinnvoller, einen Least Squares - Algorithmus zu verwenden?
Mit P0 = 50*ones(244,1); bekomme ich recht vernünftige Ergebnisse, man müsste allerdings die Anzahl der Iterationen erhöhen.
Bei P0 = 100*ones(244,1); ist vielleicht ein lokales Minimum
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 ;)
Doch, Normen sind im Gegensatz zum Absolutbetrag differenzierbar. Und wie gesagt, wenn ich meine Diskretisierung ändere, klappt damit ja auch alles problemlos.
SQP-Verfahren sind ja eigtl. super effizient und bei der anderen Diskretisierung, die ich oben beschrieben habe, braucht der Algorithmus nicht mal 10 Interaktionen, um zur Lösung zu kommen. Ich dachte bisher, das eine hohe Anzahl von Iterationen ein Anzeichen dafür sind, dass irgendwas noch schief läuft.
Mit Least-Square-Algorithmen kenne ich mich leider nicht aus. Das Problem ist aber, dass später ja noch weitere Zielfunktionen dazu kommen und bei diesen wird nicht immer der Mittelwert betrachtet, also bin ich mir nicht sicher, ob der Ansatz funktionieren würde
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.