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

Optimization TB: Lineare Optimierung unter Nebenbedingungen

 

Kai.

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2009, 09:53     Titel: Optimization TB: Lineare Optimierung unter Nebenbedingungen
  Antworten mit Zitat      
Hallo liebe Community,

ich schreibe momenten meine Studienarbeit und bin neu in Matlab. Nun geht es für mich darum herauszufinden, ob es mittels bintprog oder ähnlichen Funktionen möglich ist mein Problem zu lösen.

Ich habe (aufs einfachste heruntergebrochen) diese Funktion zu Optimieren:

Gewinn = Strompreis * x1 (verkaufen) - Strompreis * x2 (kaufen)

x1 und x2 sind hierbei binär. Soweit so gut.
Nun habe ich aber Nebenbedingungen, welche Variablen enthalten, die nicht in der Zielfunktion vorkommen.

Neben x1 + x2 <= 1
habe ich zum Beispiel den Speicherinhalt V ( oder x3 oder wie auch immer), welcher zwischen 0 und vmax liegen muss.

Außerdem soll nicht im weiteren Schritt dann natürlich nicht die einfache Funktion optimiert werden, sondern eine etwas komplexere vom folgenden Typ:

maximiere Gewinn = Summe über alle Zeitpunkte t (strompreis(t) * x1 - strompreis(t) * x2)

Geht das überhaupt? Wenn ja könntet Ihr mir Ansätze liefern?

Vielen Dank im Voraus,

Kai


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 26.05.2009, 11:03     Titel:
  Antworten mit Zitat      
Hallo Kai,

ich versuche mal, das Problem mit meinen Worten wiederzugeben. Bitte korrigiere mich, wenn nötig.

Das vereinfachte Problem:
Du möchtest wissen, ob Du beim gegebenen Strompreis eine Einheit Strom kaufen (x2=1) oder verkaufen (x1=1) solltest, um den Gewinn zu maximieren.

Das vereinfachte Problem ist leicht zu lösen: Du musst verkaufen, denn sonst machst Du keinen Gewinn. Da sowohl die Menge als auch der Strompreis hier konstant sind, kann Gewinn nur zwei Werte annehmen: +Strompreis, wenn x1 = 1 und -Strompreis, wenn x2 = 1 ist. Ich glaube, dass ist nicht wirklich Dein Problem. Wir sollten also gleich das richtige Problem angehen.

Das richtige Problem:
Du möchtest für jeden Zeitpunkt wissen, ob Du bei dem aktuellen Strompreis eine Einheit Strom kaufen oder verkaufen sollst, um insgesamt den Gewinn zu maximieren. Dabei soll zu jedem Zeitpunkt die Strommenge im Speicher eine Obergrenze nicht überschreiten. Die Strommenge im Speicher hängt natürlich davon ab, ob Stromeinheiten gekauft oder verkauft werden, also von x1(t) und x2(t).

Dieses Problem kann in Matlab modelliert und mit bintprog gelöst werden. Ich frage mich allerdings, ob die Strommengen, die gekauft oder verkauft werden, nicht auch variabel sein sollten. Dann hätte man ein ganz normales lineares Optimierungsproblem, das mit linprog gelöst werden könnte.

Wenn die Problemformulierung feststeht, helfe ich gern bei der Umsetzung.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Kai
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.05.09
Wohnort: Rodgau
Version: R2008a
     Beitrag Verfasst am: 26.05.2009, 11:27     Titel:
  Antworten mit Zitat      
Vielen Dank schonmal für die Information.
Ich werde dann mal etwas weiter ausholen müssen Smile

Aufgabenstellung:

Ich habe die Strompreise der EEX(European Energy Exchange) der letzten, sagen wir mal 2 Jahre. Sowohl den Verkaufspreis, als auch den Einkaufspreis für Strom.

Nun soll ich mein Kraftwerk (Druckluftspeicherkraftwerk mit Gasturbine, sprich ich habe einen Speicher, in welchen in meinen eingekauften Strom in Form von Luft einspeichern kann) so optimieren, als wenn es die vergangenen 2 Jahre optimal, sprich gewinnmaximiert betrieben worden wäre. Die Strompreise liegen für jeweils alle 15 Minuten vor.

Nun geht es darum, den Gewinn unter gewissen Nebenbedingungen zu maximieren.

Code:

Gewinnfunktion = SUM(i=0:t) (verkaufspreis * variable AusspeicherLeistung * x_verkaufen - einkaufspreis *  variable EinspeicherLeistung * x_einkaufen - Konstante)
 


unter den Nebenbedingungen:

Ich kann zu einem Zeitpunkt nur einspeichern oder ausspeichern:
Code:

x_v_t+x_k_t <=1
 


es muss mindestens eine Periode zwischen ein und ausspeichern liegen:
Code:

x_v_t + x_k_t-1 <=1
x_k_t + x_v_t-1 <=1
 


Speichergröße liegt zwischen 0 und vmax:
Die Leistungen sind höchstens = Pmax

und noch ein paar mehr, aber die würde ich dann schon selber hinbekommen. Es ist eher so, dass mir der Gesamtüberblick fehlt und ich erstmal einen Anstoß bräuchte.

Über eure Hilfe freue ich mich sehr. Super eine solche Plattform zu haben.

Danke im Voraus,
euer Kai
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 26.05.2009, 13:40     Titel:
  Antworten mit Zitat      
Hallo Kai,

das sieht für mich jetzt schon sinnvoller aus. Smile Mit den neuen Nebenbedingungen verstehe ich auch, warum man binäre Variablen braucht.

Allerdings sind die Speicherleistungen ja nicht binär. Und die neue Zielfunktion ist leider nicht mehr linear, da Terme wie "AusspeicherLeistung * x_verkaufen" vorkommen, also Optimierungsvariable miteinander multipliziert werden. Man hätte damit ein "Mixed Integer Nonlinear Problem", genannt MINLP. bintprog geht also für dieses Problem nicht mehr.

Ehrlich gesagt, gibt es keine Matlab-Funktion für Mixed-Integer-Probleme. Du hast nun ein paar Möglichkeiten.
1. Du benutzt eine Optimierungsfunktion aus dem Matlab File Exchange für nichtlineare Mixed Integer Programmierung, z.B. das hier oder das hier. Dabei müsstest Du keine Abstriche beim Problem stellen, hast aber keine gute Dokumentation und wir können auch nicht richtig helfen.
2. Du versuchst, das Problem umzuformulieren, sodass es entweder ohne binäre Variablen oder ohne Nichtlinearität/nichtbinäre Variablen auskommt. Dann könntest Du Standard-Matlab-Algorithmen verwenden.
3. Du verwendest nicht Matlab, sondern einen anderen Optimierungssolver, der standardmäßig auch nichtlineare Mixed-Integer-Probleme lösen kann.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Kai
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.05.09
Wohnort: Rodgau
Version: R2008a
     Beitrag Verfasst am: 26.05.2009, 16:21     Titel:
  Antworten mit Zitat      
Also Stand der Dinge ist, dass ich Matlab nutzen soll (soweit möglich), da mein Betreuer die Arbeit in seine mit einbauen möchte und er eben mit Matlab arbeitet.

Soweit ich das überblicken kann, sollte es mit einigen Vereinfachungen (Leistung ist konstant Pmax) möglich sein, das ganze auf ein Gemischt Ganzzahliges Problem runterzubrechen.

Ich würde mich damit nochmal genauer auseinander setzen und dann nochmal melden. Für einen konkreten Imlementierungsvorschlag wäre ich nämlich dann sehr sehr dankbar.

Bis dahin schonmal danke schön und bis bald,

Kai
Private Nachricht senden Benutzer-Profile anzeigen
 
Kai
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.05.09
Wohnort: Rodgau
Version: R2008a
     Beitrag Verfasst am: 27.05.2009, 10:07     Titel:
  Antworten mit Zitat      
Ok wir können davon ausgehen, dass die Ein- / und Ausspeicherleistung konstant Pmax sind. Somit hätten wir ja jetzt ein MILP oder?

Könnte mir jetzt jemand dabei helfen das ganze erstmal zu implementieren?
Ich weis nämlich ehrlich gesagt nicht wie ich das angehen soll, vorallem da ich ja die Summe der Einzelentscheidungen optimieren soll und nicht einfach die Summe der Optimierten Einzelentscheidungen bilden kann.

Ich hoffe es ist klar was ich meine Smile

danke für eure Hilfe
Kai
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 27.05.2009, 11:39     Titel:
  Antworten mit Zitat      
Hallo Kai,

ja, mir ist klar, was Du meinst. Smile
Zum Glück ist es aber kein MILP, sondern ein reines binäres lineares Problem, wenn die Ein- und Ausspeicherleistung konstant Pmax sind.

Für die Implementierung musst Du zunächst die Preise einlesen. Ich gehe hier davon aus, dass sie in zwei Vektoren, p_e und p_v (für Einkaufs- und Verkaufspreise) vorliegen.

Code:
% Beispieldaten für 20 Zeitpunkte
p_e = 100*rand(1,20);
p_v = p_e - 10;
n = length(p_e); % Anzahl der Zeitschritte
Pmax = 10;


Dann muss klar sein, dass die Optimierungsvariablen x_e und x_v (für Einkauf und Verkauf) Vektoren sind, die genauso lang sind wie p_e und p_v.

Für die Zielfunktion multipliziert man jetzt den (Zeilen-)Vektor der Preise mit dem (Spalten-)Vektor der Entscheidungsvariablen (und der konstanten Leistung). Herauskommt eine skalare Zahl, die Summe über die gewählten Einkaufs- bzw. Verkaufspreise. Halt: Die Einkaufspreise müssen natürlich mit -1 multipliziert werden. Die Multiplikation mit dem Entscheidungsvariablenvektor macht Matlab von allein, wir müssen nur den Zeilenvektor der Koeffizienten angeben:

Code:
f = Pmax*[p_v,-p_e];


Alle Nebenbedingungen müssen in Matrixschreibweise gebracht werden. Also eine große Koeffizientenmatrix A und ein Ergebnisvektor b, sodass die Bedingungen in der Form A*x <= b vorliegen.

Code:
% x_v + x_e <= 1 für alle Zeitpunkte
A1 = [eye(n),eye(n)];
b1 = ones(n,1);
% x_v_t + x_k_t-1 <=1 und x_k_t + x_v_t-1 <=1
A2 = [eye(n-1),zeros(n-1,2),eye(n-1);
      zeros(n-1,1),eye(n-1),eye(n-1),zeros(n-1,1)];
A = [A1;A2];
b = [b1;b2];


Und dann kann es losgehen:
Code:
x = bintprog(-f, A, b); % -f, da bintprog standardmäßig minimiert.


Was man dann sieht: Um den Gewinn zu maximieren, muss man tatsächlich immer verkaufen. Es fehlt jetzt noch die Begrenzung des Speichers, dass man also nicht mehr verkaufen kann, als man hat. Dafür fehlt mir aber noch etwas das Verständnis. Es gibt doch bestimmt einen initialen Speicherstand, V0 oder so. Wie ändert sich der, wenn zum ersten Zeitpunkt Strom eingekauft und mit Pmax eingespeichert wird? Und wie, bei einer Ausspeicherung? Ich hoffe mal, dass es sich um einen linearen Zusammenhang handelt. Wink

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Kai
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.05.09
Wohnort: Rodgau
Version: R2008a
     Beitrag Verfasst am: 27.05.2009, 12:00     Titel:
  Antworten mit Zitat      
Uiuiui Smile das wird ja was .. auf was habe ich mich da eingelassen *g*

Ja es gibt einen Initialspeicherzustand

Code:


%% s = Speicherinhalt

s(t) = s(t-1)* e^(d*delta_t) + n_e * x_e * P_ein *delta_t - 1/n_a *P_aus * x_v * delta_t

 


Erklärung dazu:

Speicher zum Zeitpunkt T ist gleich Speicher zum vorigen Zeitpunkt * Selbstentladungskonstante + Wirkungsgrad beim Einspeichern * x_e * konstante Einspeicherleistung * Zeitdauer der Einspeicherung (delta T, in unserem Fall 15 minuten) - 1 geteilt durch Wirkungsgrad beim Ausspeichern * konstante Ausspeicherleistung * x_v * Zeitdauer der Ausspeicherung (delta T , ebenfalls 15 minuten).

Ich finde es sehr bemerkenswert wie selbstverständlich und nett mir hier geholfen wird, ich danke dir Bijick und allen die eventuell noch antworten werden ganz recht herzlich. Ohne eure Hilfe wäre ich wohl sehr aufgeschmissen.

Grüße
Kai
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 27.05.2009, 12:16     Titel:
  Antworten mit Zitat      
Hallo Kai,

schau Dir mal für eine kleine Anzahl Zeitschritte die bisherigen Nebenbedingungen an, ob Du damit was anfangen kannst. Die neue wird nämlich noch mal komplizierter. Es ist aber auf jeden Fall möglich, das aufzudröseln.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Kai
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.05.09
Wohnort: Rodgau
Version: R2008a
     Beitrag Verfasst am: 27.05.2009, 12:19     Titel:
  Antworten mit Zitat      
werde ich mal tun.
danke sehr
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 27.05.2009, 13:48     Titel:
  Antworten mit Zitat      
So, da bin ich wieder. Das war nicht leicht, und es könnte eventuell Probleme mit dem Speicherplatz geben, da die Matrizen riesig werden, und die Funktion toeplitz, die ich zum Basteln verwende, irgendwann streikt. Also probiere die Optimierung erstmal für kleine Anzahlen von Zeitschritten.

Erstmal definiere ich Konstanten für die Übersichtlichkeit:
Code:
n_e = ...
n_a = ...
d = ...
s0 = ... % Initialspeicherstand
Vmax = ...
delta_t = 15;
K1 = exp(d*delta_t);
K2 = n_e*Pmax*delta_t;
K3 = 1/n_a*Pmax*delta_t;


Dann lautet die erste Nebenbedingung zum Zeitpunkt 1:
s1 = s0*K1 + K2*x_e(1) - K3*x_v(1) <= Vmax

Zum Zeipunkt 2:
s2 = s1*K1 + K2*x_e(2) - K3*x_v(2)
= (s0*K1 + K2*x_e(1) - K3*x_v(1))*K1 + K2*x_e(2) - K3*x_v(2)
= s0*K1^2 + K1*K2*x_e(1) + K2*x_e(2) - K1*K3*x_v(1) - K3*x_v(2) <= Vmax

Die früheren Variablen kommen also alle noch vor und die Faktoren K1 kommen vielfach vor. Umgestellt für das Schema A*x <= b:

Code:
% Achtung: Kein Matlab-Code
| K2    0    0  0  ...  0    K3      0  0  0  ...  0|  * x   <=  |Vmax-K1*s0|
|K1*K2  K2   0  0  ...  0  K1*K3  K3 0  0  0  ...  0|            |Vmax-K1^2*s0|


Bei den nächsten Zeitschritten setzt sich das fort und es kommen immer höhere Exponenten für K1 vor. Wenn K1 also sehr groß oder sehr klein und n sehr groß ist, kommt nur noch Murks raus (0 oder Inf). Also hier aufpassen!

Die Konstruktion der Matrix geht jetzt am knappsten mit toeplitz und tril. Siehe dazu die Hilfe.

Code:
K1_mat = tril(K1.^(toeplitz(1:n)));
K1_vec = K1.^(1:n)';

% s(t) <= Vmax für alle t
A3 = [K2*K1_mat,-K3*K1_mat];
b3 = Vmax - K1_vec*s0;

% s(t) >= 0 für alle t
A4 = -A3;
b4 = K1_vec*s0;


Und dann los:
Code:
A = [A1;A2;A3;A4];
b = [b1;b2;b3;b4];
x = bintprog(-f, A, b);


Mit Fantasiewerten habe ich noch kein befriedigendes Ergebnis erzielt (nur x_e(t) = 0, x_v(t) = 0 für alle t). Ich hoffe, dass liegt an den Werten.

Viel Spaß beim Ausprobieren und herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Kai
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.05.09
Wohnort: Rodgau
Version: R2008a
     Beitrag Verfasst am: 27.05.2009, 14:14     Titel:
  Antworten mit Zitat      
Danke dir, ich habe jetzt ja erstmal Ansätze und werde schauen in wie weit das überhaupt möglich ist mein Problem damit zu lösen, denn es gibt ja letztendlich noch mehr Nebenbedingungen.

Ich danke dir fürs erste und würde mich freuen bei meinem weiteren Vorgehen auf dich zurückgreifen zu dürfen.

Viele Grüße
Kai
Private Nachricht senden Benutzer-Profile anzeigen
 
Kai
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.05.09
Wohnort: Rodgau
Version: R2008a
     Beitrag Verfasst am: 28.05.2009, 08:43     Titel:
  Antworten mit Zitat      
Mir ist aufgefallen, dass in der deklaration b2 fehlt., vielleicht könntest du da nochmal schauen.

Muss mich jetzt sowieso erstmal in deinen Code richtig reinarbeiten um alles zu verstehen.

Gruß
Kai
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 28.05.2009, 09:04     Titel:
  Antworten mit Zitat      
Hallo Kai,

Du kannst ja mal versuchen, b2 selbst zu konstruieren. Smile Ich helfe aber sonst gerne weiter.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Kai
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.05.09
Wohnort: Rodgau
Version: R2008a
     Beitrag Verfasst am: 02.06.2009, 13:23     Titel:
  Antworten mit Zitat      
Mir scheint ich komme weiter Smile

folgende Sachen habe ich erstmal geändert:

Einkaufspreis = Verkaufspreis -> Es gibt in der Realität nur ein Preis zum kaufen und verkaufen. Das vereinfacht die ganze Sache und erklärt glaube ich auch, warum du keine sinnvollen Werte hattest. Bei dir waren die Einkaufspreise ja immer höher waren als die Verkaufspreise.

Wie auch immer mit folgendem Code bekomme ich erste Ergebnisse die schonmal nicht ganz falsch aussehen. Muss ich jetzt halt mal verifizieren und durchgehen.

Danke für die Hilfe bisher. Ich weis nicht ob ich da alleine drauf gekommen wäre.

Beste Grüße
Kai

Code:

% Variablen deklarieren

% Beispieldaten für 5 Zeitpunkte
p = 20*rand(1,4); % Preise
n = length(p); % Anzahl der Zeitschritte
Pmax = 1;

n_e = 1;
n_a = 1;
d = 0.04;
s0 = 2; % Initialspeicherstand
Emax = 3;
delta_t = 1;
K1 = 1; %exp(-log(d)*delta_t);
K2 = n_e*Pmax*delta_t;
K3 = 1/n_a*Pmax*delta_t;

f = Pmax*[p,-p];

% x_v + x_e <= 1 für alle Zeitpunkte
A1 = [eye(n),eye(n)];
b1 = ones(n,1);
% x_v_t + x_e_t-1 <=1 und x_e_t + x_v_t-1 <=1
A2 = [eye(n-1),zeros(n-1,2),eye(n-1);
      zeros(n-1,1),eye(n-1),eye(n-1),zeros(n-1,1)];
b2 = [ones(2*n-2,1)];

A = [A1;A2];
b = [b1;b2];


K1_mat = tril(K1.^(toeplitz(1:n)));
K1_vec = K1.^(1:n)';

% s(t) <= Vmax für alle t
A3 = [K2*K1_mat,-K3*K1_mat];
b3 = Emax - K1_vec*s0;

% s(t) >= 0 für alle t
A4 = -A3;
b4 = K1_vec*s0;

A = [A1;A2;A3;A4];
b = [b1;b2;b3;b4];
x = bintprog(-f, A, b)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.