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

SQP Optimierung unendliche Laufzeit

 

Alisa
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 16.04.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2019, 10:36     Titel: SQP Optimierung unendliche Laufzeit
  Antworten mit Zitat      
Hallo zusammen!

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

Ich wäre für jede Hilfe sehr dankbar! Smile

Code:
function x = opttemp()

%% Zielfunktion inkl. Gradient
function varOut = temp(P,outputcase) % Temperatur in Abh. der Heizleistung
   
    lp = length(P);
   
    % Außentemperatur
    T_inf = 283.15;
   
    % 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
   
    % *** Output ***
    switch outputcase
        case 1
            varOut = sum(dT)/lt; % Mittlere Temperaturabweichung
        case 2
            varOut = sum(jac_dT)'/lt; % Gradient der mittleren Temperaturabweichung
        case 3
            varOut = abs(T-T_des); % Temperaturabweichung
    end

end

%% Initialisierung
P = 100*ones(244,1);
l = length(P);

% Startwert
x0 = P;

% Nebenbedingung
A = [-eye(l);eye(l)];
lb = zeros(l,1);
ub = 5000*ones(l,1);
b = [-lb;ub];

% Zielfunktion
f = @(P) temp(P,1);

% Gradient
gradf = @(P) temp(P,2);

% Startwert Hessematrix
Q0 = eye(l);

% Toleranzen
itmax = 1000;
tol = 1e-05;


%% Optimierung

%% Initialization
it = 0;
x = x0; % Initial point
Q = Q0; % Initial hessian
q0 = feval(gradf,x0); % Initial gradient
X(1,:) = x'; % Every iteration will be stored in this matrix
[~,n] = size(A);
stop = false;


%% Iterations
while( ~stop )

    q = q0; % gradf(x_k)
    alpha = b-A*x;
   
    % Solve the following quadratix subproblem
    %
    %           min 0.5*s'*Q*s + q's  s.t.  A*s + alpha <= 0
    %            s
   
%     s0 = zeros(n,1); % Initial point for the active set method
%     [s,~] = active_set_method(Q,q,A,alpha,s0,tol,itmax);

    s = quadprog(Q,q,A,alpha);
   
    if( max(abs(s)) < tol )
        stop = true; % --> x is the solution
    else
       
        x = x + s; % Updating the iteration x_k --> x_k+1
       
        % BFGS update for calculating an approximation of the hessian
        q_old = q; % gradf(x_k)
        q0 = feval(gradf,x); % gradf(x_k+1)
        y = q0 - q_old;
       
        if (s'*y >= 0.2*s'*Q*s)
            theta = 1;
        else
            theta = (0.8*s'*Q*s)/(s'*Q*s - s'*y);
        end
       
        y_mod = theta*y + (1-theta)*Q*s;
       
        Q = Q - (Q*(s*s')*Q)/(s'*Q*s) + (y_mod*y_mod')/(y_mod'*s); % Hessian
       
        % Next iteration
        it = it + 1;
        X(it+1,:) = x';
    end
   
    if (it >= itmax)
        stop = true; % --> Too many iterations
    end
   
end
fval = feval(f,x);
dT_opt = temp(x,3);

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: 16.04.2019, 10:50     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Alisa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 16.04.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2019, 10:59     Titel:
  Antworten mit Zitat      
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.
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: 16.04.2019, 13:08     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Alisa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 16.04.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2019, 14:29     Titel:
  Antworten mit Zitat      
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.
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: 16.04.2019, 14:34     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Alisa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 16.04.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2019, 14:49     Titel:
  Antworten mit Zitat      
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 Crying or Very sad


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? Question
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: 16.04.2019, 14:55     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Alisa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 16.04.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2019, 14:59     Titel:
  Antworten mit Zitat      
Super, vielen Dank schon mal!

Hier ist der Code:

Code:
function x = opttemp()

%% Zielfunktion inkl. Gradient
function [f,g] = temp(P) % Temperatur in Abh. der Heizleistung
   
    lp = length(P);
   
    % Außentemperatur
    T_inf = 283.15;
   
    % 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
   
    % *** Output ***
   
    f = sum(dT)/lt;
    g = sum(jac_dT)'/lt;

end

%% Initialisierung
P0 = 100*ones(244,1);
l = length(P0);

% Startwert
x0 = P0;

% Nebenbedingung
lb = zeros(l,1);
ub = 5000*ones(l,1);

% Optionen
options = optimoptions(@fmincon,'Algorithm','sqp','CheckGradients',true,...
    'SpecifyObjectiveGradient',true);

[x_opt,fval,~,output] = fmincon(@temp,x0,[],[],[],[],lb,ub,[],options);


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: 16.04.2019, 16:42     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Alisa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 16.04.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2019, 17:05     Titel:
  Antworten mit Zitat      
Hallo!

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