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

Optimierung - Ergebnisse sind sehr zappelig

 

MatlabMathias
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2018, 12:09     Titel: Optimierung - Ergebnisse sind sehr zappelig
  Antworten mit Zitat      
Hallo zusammen,

ich nutze den CPLEX Solver über die Matlab Toolbox Funktionen (ähnliche Syntax wie fmincon), um Peaks in der Stromnachfrage von Industriekunden mittels Stromspeichereinsatz zu minimieren (Thema meiner Masterarbeit). Das Ziel ist also, den Speicher gerade dann zu entladen, wenn die Stromnachfrage ihre Maxima erreicht und ihn entsprechend in Off-Peak Zeiten zu laden.

Ich will gar nicht zu sehr in den Code hineingehen, da der Solver im Prinzip seinen Zweck erfüllt. Die Peaknachfrage wird minimiert. In den Zeiten, wo der Speicher jedoch entweder nichts tun oder sich für den nächsten Peak mittels Laden vorbereiten sollte, zeigt mein Ergebnis an sehr zappeliges, unruhiges Verhalten. Manchmal entlädt er sogar, um danach gleich wieder zu laden. Dieses Verhalten verbiete ich ihm nicht aktiv - ich wüsste auch gar nicht wie. Das bedeutet, es ist ihm nicht verboten, sich so zu verhalten. Es ist ihm dazu jedoch auch überhaupt kein Anreiz gegeben. Warum tut er das also?

Zur Veranschaulichung füge ich einen Auszug aus dem Speicherfahrplan, der entsprechenden Kundennachfrage und der Addition der beiden Verläufe bei. Man sieht hier sehr schön, dass die zwei Peaks "rasiert" werden. Man sieht aber auch, das unruhige Verhalten in den Off-Peak Zeiten und dass der Speicher kurz vor dem ersten Peak noch einmal minimal entlädt.

Die Frage ist nun, kann ich dieses Verhalten in irgendeiner Weise beeinflussen? Gibt es Parameter in der Optimierung, die ich dazu einstellen muss? Muss ich z.B. eine Startlösung definieren, die eine entsprechende Form hat? Oder seht ihr eine Möglichkeit, das Profil im Anschluss an die Optimierung zu glätten? Wie geht man hier im Allgemeinen vor?

Ganz lieben Dank und Gruß,
Mathias

Unbenannt.png
 Beschreibung:
Speicherfahrplan, Kundennachfrage und Addition beider Verläufe.

Download
 Dateiname:  Unbenannt.png
 Dateigröße:  103.93 KB
 Heruntergeladen:  205 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.12.2018, 14:57     Titel:
  Antworten mit Zitat      
Hallo,

schwer zu sagen, zumal ich auch CPLEX nie verwendet habe.
Ist die Zielfunktion tatsächlich differenzierbar? Falls nicht, kann es bei fmincon helfen, FiniteDifferenceStepSize zu erhöhen.
Hast du das auch mal mit fmincon laufen lassen? Ist das Verhalten ähnlich? Wo bekommst du die besseren Ergebnisse?

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
 
MatlabMathias
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2018, 15:08     Titel:
  Antworten mit Zitat      
Hallo Harald,

mein Problem ist, dass ich ganz arg unter Zeitdruck stehe und es wohl nicht mehr schaffe, das gleiche Problem noch einmal im fmincon zu formulieren.

Im Folgenden einmal mein Code, vielleicht kannst du darin nachvollziehen, ob die Funktion differenzierbar ist? Der Code ist natürlich recht mächtig so auf einmal, aber vielleicht sieht dein geübtes Auge ja das Problem? Ich verzweifle gerade...

Laut Lösungsprotokoll findet der CPLEX eine Lösung, die konvergiert. Es gibt auch keinen vorzeitigen Abbruch oder ähnliches.

Code:
% Cost function (minimize max peak over period => minimize auxiliary variable)
        f_help = zeros(length(P_USE),1);
        f = [f_help;1]; % Vector for linear objective function: Minimize p*x (negative x for discharged/sold energy)

        % Constraints

        add_on_1 = zeros(length(P_USE),1);                      % Add-on for auxiliary variable max peak
        add_on_2 = zeros(length(P_USE)/2,1);                    % Add-on for auxiliary variable max peak

        Aineq_1a = eye(length(P_USE));                          
        Aineq_1a = [Aineq_1a, add_on_1];                          % Left side inequality: Power constraint
        Aineq_1b = Aineq_1a*-1;                                   % Left side inequality: Power constraint

        tril1 = tril(ones(length(P_USE)/2));
        tril1 = tril1 * eta_c;                                
        tril2 = tril(ones(length(P_USE)/2));
        tril2 = tril2 * eta_d;
        Aineq_2a = [tril1, tril2, add_on_2];                      % Left side inequality: Energy constraint
        Aineq_2b = Aineq_2a*-1;                                   % Left side inequality: Energy constraint

        eye_1 = [eye(length(P_USE)/2), eye(length(P_USE)/2)];
        ones_1 = ones(length(P_USE)/2,1) * -1;
        Aineq_3 = [eye_1 , ones_1];                               % Left side inequality: Peak constraint

        Aineq_4 = [zeros(length(P_USE)/2,length(P_USE)/2),eye(length(P_USE)/2),add_on_2];       % Left side inequality: Cannot charge/discharge above load
        Aineq_4 = Aineq_4*-1;

        bineq_1(1:2*length(P_USE),1) = Pmax;                        % Right side inequality: Power constraint
        bineq_2(1:length(P_USE),1) = (Smax/2)*4;                    % (x4 for 15min intervals) Right side inequality: Energy constraint

        bineq_3 = P_USE(1:(length(P_USE)/2)) * -1;                  % Right side inequality: Peak constraint

        bineq_4 = P_USE(1:length(P_USE)/2);                         % Right side inequality: Cannot charge/discharge above load

        lb1(1:length(P_USE)/2,1) = 0;                               % Lower bound: Sign of x (charging cannot be negative)
        lb2(1:length(P_USE)/2,1) = -inf;                            % Lower bound: Sign of x (discharging can be negative)
        ub1(1:length(P_USE)/2,1) = inf;                             % Upper bound: Sign of x (charging can be positive)
        ub2(1:length(P_USE)/2,1) = 0;                               % Upper bound: Sign of x (discharging cannot be positive)

        Aineq = [Aineq_1a; Aineq_1b; Aineq_2a; Aineq_2b; Aineq_3; Aineq_4]; % Linear inequality constraint: Aineq*x <= bineq.
        bineq = [bineq_1; bineq_2; bineq_3; bineq_4];

        Aeq = [];                                                   % Linear Equality constraint: Aeq*x = beq
        beq = [];
        lb = [lb1; lb2; 0];                                         % Lower bounds
        ub = [ub1; ub2; inf];                                       % Upper bounds


        % SOS Constraints indicating that only one of each pair within x can be
        % non-zero (x1 or x8761 can be non-zero)

        sostype = repmat('1', [1, length(P_USE)/2]);    
        v1 = 1:length(P_USE);                            
        v2 = reshape(v1, [], 2)';                    
        v3(1:length(P_USE)/2,1) = 0;
        v4(1:length(P_USE)/2,1) = 1;
        v5 = [v3 v4]';

        sosind = mat2cell(v2, 2, ones(1,size(v2,2)));        
        soswt = mat2cell(v5, 2, ones(1,size(v5,2)));
        ctype = repmat('C', [1, length(P_USE)+1]);          
       
        % Solver - IBM ILOG CPLEX
        options = cplexoptimset;
        options.Display = 'on';
     
        [x,fval,exitflag,output] = cplexmilp(f,Aineq,bineq,Aeq,beq,sostype,sosind,soswt,lb,ub,ctype,[],options);
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.