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

Programmierung einer zeitabhängigen Optimierung

 

Maluco
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.06.17
Wohnort: ---
Version: R2017b
     Beitrag Verfasst am: 27.06.2017, 15:50     Titel: Programmierung einer zeitabhängigen Optimierung
  Antworten mit Zitat      
Hallo alle zusammen!

Ich versuche gerade das Paper "Grey wolf optimisation for optimal sizing of battery energy storage device to minimise operation cost of microgrid" in Matlab Code umzusetzen. Da dies jedoch mein erstes Optimierungsproblem ist, habe ich ein paar Probleme mit dem Code, zu denen ich nirgendswo eine Antwort finden konnte.

Das Paper versucht den Strombedarf in stündlicher Auflösung mittels Microturbine (MT), Fuel Cell (FC), Photovoltaik (PV) und Windkraft (WT) zu decken. Darüber hinaus kann am Markt (grid) Strom gekauft und verkauft werden. Zusätzlich kommt eine Batterie (BES) zum Einsatz, dessen Größe zusätzlich im Optimierungsproblem gelöst wird.

Zum Einsatz kommt der Gray Wolf Algorithmus, der für Constraints sog. Penalty Functions verwendet.

Ich bedanke mich schon einmal ganz herzlich bei Jedem, der sich die Zeit nimmt, dieses Problem durchzulesen.

Objective Function

Die zu minimierende Funktion ist:


<br />
\min F(X) = \sum_{t=1}^T{f_t+\mathrm{OM_{DG}+TCPD_{BES}}}
<br />

Dabei steht F für die Gesamtkosten an einem Tag Betrieb. T = 24, da die Werte stündlich berechnet werden. f_t sind die Betriebskosten jedes Generators. Sie sind aufgeteilt in:


<br />
f_t = Cost_{\mathrm{grid,}t} + Cost_{\mathrm{DG,}t} + Cost_{\mathrm{BES,}t} + SUC_{\mathrm{MT,}t} + SUC_{\mathrm{FC,}t} + SDC_{\mathrm{MT,}t} + SDC_{\mathrm{FC,}t}
<br />

Die Kosten durch das Grid "Cost_grid" werden dabei mittels Stufenfunktion berechnet, abhängig davon ob eingespeist oder bezogen wird. "B" ist dabei der Preis pro kWh, "P" die Leistung und "tax" eine Steuer. Da stündlich berechnet wird muss keine Zeitvariable "dt" verwendet werden.


<br />
Cost_{\mathrm{grid,}t}	= \left\{		\begin{array}{ll}												B_{\mathrm{grid,}t}P_{\mathrm{grid,}t}  \quad	P_{\mathrm{grid,}t} > 0	\\ 
<br />
(1-\mathrm{tax})B_{\mathrm{grid,}t} \quad	P_{\mathrm{grid,}t} 	P_{\mathrm{grid,}t} < 0	\\
<br />
0 \quad	P_{\mathrm{grid,}t} = 0	\\
<br />
\end{array}\right.
<br />

Dies habe ich mit Hilfe der heaviside Funktion umgesetzt. Dabei steht "lc" (loop counter) für die for-Schleife, die ich für jeden Zeitpunkt verwende. Alle Variablen mit "C." sind Konstanten, die ich in einem Struct Array geladen habe.

Code:
 % Cost_grid
v(4,lc)  = -(1-C.tax).*C.B_gridt(lc-1).*P(1).*heaviside(-P(1))...
               +C.B_gridt(lc-1).*P(1).*heaviside(P(1));
 


Die Kosten der Generatoren "Cost_DG" ist einfach die Summe alle Generatoren. Dabei steht die Variable "u" für an oder aus, da auch Kosten für das Hochfahren oder Runterfahren von MT und FC entstehen, die durch "SUC" und "SDC" berücksichtig werden.


<br />
Cost_{\mathrm{DG,}t} = B_{\mathrm{MT,}t}P_{\mathrm{MT,}t}u_{\mathrm{MT,}t} + B_{\mathrm{FC,}t}P_{\mathrm{FC,}t}u_{\mathrm{FC,}t} + B_{\mathrm{PV,}t}P_{\mathrm{PV,}t} + B_{\mathrm{WT,}t}P_{\mathrm{WT,}t}
<br />

Im Code ist dies ebenso umgesetzt:

Code:
% Cost_DG
v(5,lc)  = C.B_MTt*P(3)*v(15,lc)+C.B_FCt*P(4)*v(16,lc)+C.B_PVt*P(5)+C.B_WTt*P(6);          
 


Die Kosten für die Batteries sind identisch berechnet:


<br />
Cost_{\mathrm{BES,}t} = B_{\mathrm{BES,}t}P_{\mathrm{BES,}t}u_{\mathrm{BES,}t}
<br />

Mit entsprechendem Code:

Code:
% Cost_BES
v(6,lc)  = C.B_BESt*P(2)*v(14,lc);              
 


Die Hoch- bzw. Runterfahrkosten (SU = start-up, SD = shut-down) von MT und FC sind alle gleich berechnet, wobei simplerweise einfach geprüft wird, ob die Einheit hoch- oder runtergefahren wird:


<br />
SUC_{\mathrm{MT,}t} = SU_\mathrm{MT} \times \max(0,u_{\mathrm{MT,}t}-u_{\mathrm{MT,}t-1})	\\
<br />
SUC_{\mathrm{FC,}t} = SU_\mathrm{FC} \times \max(0,u_{\mathrm{FC,}t}-u_{\mathrm{FC,}t-1})	\\
<br />
SDC_{\mathrm{MT,}t} = SD_\mathrm{MT} \times \max(0,u_{\mathrm{MT,}t-1}-u_{\mathrm{MT,}t})	\\
<br />
SDC_{\mathrm{FC,}t} = SD_\mathrm{FC} \times \max(0,u_{\mathrm{FC,}t-1}-u_{\mathrm{FC,}t})	
<br />

Die Wartungskosten sind einfach bestimmte, stündlich anfallende Kosten, die mit der Betrachtungsdauer T multipliziert werden:


<br />
OM_\mathrm{DG} = (OM_\mathrm{DG} + OM_\mathrm{DG} + OM_\mathrm{DG} + OM_\mathrm{DG}) \times T
<br />

Der Code ist dementsprechend simpel:

Code:
% fixed operation and maintenance cost of distributed generators (DGs) in €ct
C.OM_DG = C.T*(C.OM_MT+C.OM_FC+C.OM_PV+C.OM_WT);  
 


Die Gesamtkosten der Batteries (TCPD = total cost per day) sind abhängig von der Kapazität der Batterie "C_BES,max". "IR" sind die Zinsen, "LT" die Laufzeit, "FC_BES" die Fixkosten und "MC_BES" die Wartungskosten:


<br />
TCPD_\mathrm{BES} = \frac{C_\mathrm{BES,max}}{365}\left(\mathrm{\frac{IR(1+IR)^{LT}}{(1+IR)^{LT}-1} FC_{BES} + MC_{BES}}\right)
<br />

Dies habe ich im Code folgendermaßen geschrieben:

Code:

TCPD = max(v(3,:))/365*((C.IR*(1+C.IR)^C.LT)/((1+C.IR)^C.LT-1)*C.FC_BES+C.MC_BES);
 


v(3,:) beinhaltet die Kapazität zu jedem Zeitpunkt in der Batterie.

Constraints

Zusätzlich gibt es noch ein paar Constraints. Upper and Lower Bounds für die Generatoren, sowie das Netz sind folgende:


<br />
P_\mathrm{MT,min}	\leq P_{\mathrm{MT,}t}	\leq P_\mathrm{MT,max}\quad	 t = 1, \ldots,T	\\
<br />
P_\mathrm{FC,min}	\leq P_{\mathrm{FC,}t}	 \leq P_\mathrm{FC,max}\quad	 t = 1, \ldots,T	\\
<br />
P_\mathrm{PV,min}	\leq P_{\mathrm{PV,}t}	 \leq P_\mathrm{PV,max}\quad	t = 1, \ldots,T	\\
<br />
P_\mathrm{WT,min}	\leq P_{\mathrm{WT,}t}	 \leq P_\mathrm{WT,max}\quad	 t = 1, \ldots,T	\\
<br />
P_\mathrm{grid,min}	 \leq P_{\mathrm{grid,}t}  \leq P_\mathrm{grid,max}\quad t = 1, \ldots,T	
<br />

Diese konnte ich noch leicht mit zwei Matrizen umsetzen (n_comp steht für die Anzahl der Berechnungen):

Code:

% Grid Constraint(1) & Active Power Constraints of DG Units (3-6)
lb([1 3:6],:) = repmat([C.P_gridmin C.P_MTmin C.P_FCmin C.P_PVtmin C.P_WTtmin]',1,n_comp);
ub([1 3:6],:) = repmat([C.P_gridmax C.P_MTmax C.P_FCmax C.P_PVtmax C.P_WTtmax]',1,n_comp);
 


Darüber hinaus muss das Netz im Gleichgewicht sein, sprich Produktion und Verbrauch müssen gleich sein:


<br />
P_{\mathrm{MT,}t}u_{\mathrm{MT,}t} + P_{\mathrm{FC,}t}u_{\mathrm{FC,}t} + P_{\mathrm{PV,}t} + P_{\mathrm{WT,}t} + P_{\mathrm{BES,}t}u_{\mathrm{BES,}t} + P_{\mathrm{grid,}t} = P_{\mathrm{D,}t} \quad t = 1, 2, \ldots, T
<br />

Dies konnte ich bis jetzt nur als Anonymous Function umsetzen (und mittels Genetic Algorithm "ga" verwenden), da ich nicht weiß, wie ich die Constraint in eine Penalty Function umwandle.

Code:
% Electrical load demand balance constraint
ceq = sum(x(2:4).*v(14:16,i))+sum(x([1 5:6]))-C.P_Dt(i);
 


Zusätzlich soll die Produktionskapazität immer eine Reservekapazität "OR" zur Verfügung haben:


<br />
P_\mathrm{MT,max}u_{\mathrm{MT,}t} + P_\mathrm{FC,max}u_{\mathrm{FC,}t} + \overline{P}_{\mathrm{BES,}t}u_{\mathrm{BES,}t} + P_\mathrm{grid,max} \geq \mathrm{OR}_t + P_{\mathrm{D,}t} \quad t = 1, 2, \ldots, T
<br />

In Matlab habe ich hier ebenso mit Anonymous Function gearbeitet und nicht mit Penalty Function:

Code:
% Operating reserve constraint
c = -(C.P_MTmax*v(15,i)+C.P_FCmax*v(16,i)+C.P_gridmax+ub(2,i)*v(14,i)-(C.OR_t(i)+C.P_Dt(i)));
 


Die Constraints für die Batterie sind weitaus komplexer. Hier wird unterschieden, ob geladen oder entladen wird. Zudem ist die Leistung vom zeitabhängigen Ladezustand abhängig.

Die Kapazität wird abhängig vom Modus berechnet.

Entladen:


<br />
C_{\mathrm{BES,}t+1} = \max\left\{ \frac{C_{\mathrm{BES,}t} - \Delta t P_{\mathrm{BES,}t}}{\eta_d}, C_{\mathrm{BES,min}} \right\} \quad	t = 1, \ldots,T
<br />

Laden:


<br />
C_{\mathrm{BES,}t+1} = \min\left\{ \left(C_{\mathrm{BES,}t} - \Delta t P_{\mathrm{BES,}t}\eta_c\right), C_{\mathrm{BES,max}} \right\} \quad	t = 1, \ldots,T
<br />

Im Matlab-Code habe ich das wieder mittels heaviside umgesetzt:

Code:
% C_BES
v(3,lc)  = max((v(3,lc-1)+(C.dt.*P(2))./C.n_d),C_BESmin).*heaviside(-P(2))...
             +min((v(3,lc-1)+C.dt.*P(2).*C.n_d),C_BESmax).*heaviside(P(2));              
 


In beiden Fällen darf die Leistung nicht das zeitabhängige Minimum unter- und Maximum überschreiten:


<br />
\underline{P}_{\mathrm{BES,}t} \leq P_{\mathrm{BES,}t} \leq \overline{P}_{\mathrm{BES,}t} \quad t = 1, \ldots,T
<br />

Diese werden wiederum folgendermaßen berechnet:


<br />
\overline{P}_{\mathrm{BES,}t}	= \min\left\{ \frac{(C_{\mathrm{BES,}t} - C_\mathrm{BES,min})\eta_d}{\Delta t}, P_{\mathrm{BES,max}} \right\} \quad	t = 1, \ldots,T	\\
<br />
\underline{P}_{\mathrm{BES,}t} = \max\left\{ \frac{C_{\mathrm{BES,}t} - C_\mathrm{BES,max}}{\eta_d\Delta t}, P_{\mathrm{BES,min}} \right\} \quad	t = 1, \ldots,T
<br />


Jetzt endlich zu meinem Problem!

Noch betrachte ich das Problem in meinem Code nicht über den ganzen Zeitraum, sondern optimiere nur f_t für jeden Zeitpunkt und ziehe dadurch Rückschlüsse auf TCPD. Demenstprechend ist meine Objective Function nur:

Code:

f_t = -(1-C.tax).*C.B_gridt(i).*x(1).*heaviside(-x(1))...
      +C.B_gridt(i).*x(1).*heaviside(x(1))...           % Cost_gridt
      +C.B_MTt*x(3)*v(15,i)+C.B_FCt*x(4)*v(16,i)...
      +C.B_PVt*x(5)+C.B_WTt*x(6)...                     % Cost_DGt
      +C.B_BESt*x(2)*v(14,i);                           % Cost_BESt
 


Daher ist mein größtes Problem:

Wie kann ich die Objective Function über den gesamten Zeitraum optimieren und somit, die oben geschreiben OF in Matlab umsetzen?

Darüber hinaus, weiß ich nicht genau, wie ich die Constraints für die Batterie korrekt umsetzen kann, da ich glaube, dass mein Ansatz falsch ist und ich ebenso mit Anonymous Functions bzw. Penalty Functions arbeiten muss.

Mein letztes Problem betrifft genau diese Penalty Functions. Ich konnte nur wenig Informationen zu ihnen finden, insbesondere ihre Umsetzung. Derzeit verwende ich zum lösen des Problem noch den Genetic Algorithm, der bereits in Matlab implementiert ist, jedoch würde ich gerne auch andere Optimizer verwenden.

Ich habe meinen Code ebenfalls hochgeladen. Es tut mir leid, wenn er etwas wirr aufgebaut ist. Ich habe versucht so viel wie möglich zu kommentieren.

Vielen Dank an alle, die sich bis dahin durchgekämpft haben!

Falls noch irgendwelche Fragen bestehen, einfach Bescheid geben.

P.S.: In der Vorschau zeigt es manche Formel nicht korrekt an und Indizes werden groß geschrieben. Falls dies auch in der veröffentlichen Version der Fall ist, bitte ich dies zu entschuldigen.

Project.rar
 Beschreibung:
Die Datei enthält alle meine erstellten Funktionen. Run_GWO ist die Hauptdatei. in MinMG ist die Objective Function.

Download
 Dateiname:  Project.rar
 Dateigröße:  6.23 KB
 Heruntergeladen:  485 mal
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.