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

Lineare Optimierung - Optimierung über mehrere Zeitschritte

 

MatlabMathias
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2018, 14:03     Titel: Lineare Optimierung - Optimierung über mehrere Zeitschritte
  Antworten mit Zitat      
Liebe Community,

ich bin auf diesem Problem total festgefahren und würde mich über eure Ideen sehr freuen:

Ich versuche eine Lösung zu einem linearen Optimierungsproblem zu finden. Dabei will ich die Arbitragesumme über ein gesamtes Jahr maximieren. Für jede Stunde des Jahres wird Arbitrage als das Produkt aus Preis (Pt) und Energie (Et) definiert. Et ist positiv, wenn Energie gekauft wird, und negativ, wenn Energie verkauft wird.

Die Zielfunktion kann folgendermaßen geschrieben werden:

Code:
max [(Pt*Et) summiert über ein Jahr (t=1 to t=8670)]


Es gibt zwei Constraints:

Code:
0 <= St <= Smax (Smax = Energy Capacity, constant)
-Pmax <= Et <= Pmax (Pmax = Power Limit, constant)


St ist der Füllstand des Speichers nach jeder Stunde und wird definiert wie folgt:

Code:
St = St-1 + Et * n , if Et => 0 (mit St-1 als der Füllstand der vorherigen Stunde und n bzw. m als Wirkungsgrad der Speicherung)
St = St-1 + Et * m , if Et < 0


Das Programm soll mir die Energiemenge pro Stunde zurückgeben, die entweder gekauft oder verkauft wurde (+ oder -), sodass die Summe der Arbitrage Funktion maximal wird. Ich will also nicht nur über einen Zeitpunkt optimieren, sondern über ein gesamtes Jahr. Falls das zu viel Rechenzeit beanspruchen sollte, könnte dieser Zeitraum auch auf 2 Wochen reduziert werden. Das Prinzip ist das gleiche.

Ich habe schon einiges an Doku (v.a. linprog) dazu gelesen, konnte aber keine Lösung entwickeln. Kommt ihr auf einen Ansatz?

Ganz lieben Dank und Gruß,
Mathias
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: 18.07.2018, 14:16     Titel:
  Antworten mit Zitat      
Hallo,

ich vermute, Werte für Pt sind gegeben?

Das Problem ist für m \ne n nicht linear. Ich würde es daher mit fmincon versuchen.

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: 18.07.2018, 15:59     Titel:
  Antworten mit Zitat      
Oh, bitte entschuldige. Pt ist pro Stunde gegeben.
m und n könnte ich ggf. in einer Funktion approximieren, die dann von Et abhängig ist.

Mein Problem ist vor allem, dass keinen Programmieransatz finde. Muss ich 8760 Entscheidungsvariablen abbilden? Gibt es da einen anderen, iterativen Weg?
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: 18.07.2018, 16:12     Titel:
  Antworten mit Zitat      
Hallo,

ja, du wirst 8760 Variablen haben. Solver wie fmincon haben damit aber kein Problem.

Zitat:
m und n könnte ich ggf. in einer Funktion approximieren, die dann von Et abhängig ist.

Das ist aus Sicht der Optimierung egal, da das so oder so nichtlinear wird.

Fang doch mal an, die Zielfunktion und die nichtlineare Nebenbedingungsfunktion für fmincon zu schreiben.

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: 18.07.2018, 17:10     Titel:
  Antworten mit Zitat      
Hallo Harald,

lieben Dank für deine schnellen Rückmeldungen!

Also, die Zielfunktion definiere ich wie folgt:

Code:
fun = @(x)sum(x.*p);


Bei der nichtlinearen Nebenbedingung sowie der Gleichheitsbedingung für den Füllstand habe ich allerdings ein Brett vor dem Kopf. Vielleicht fehlt mir auch schlicht die Erfahrung in der Syntax.
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: 18.07.2018, 18:38     Titel:
  Antworten mit Zitat      
Harald, für die nonlineare Nebenbedingung benötige ich im Prinzip ja eine For-Schleife. Ich könnte mir eine solche Lösung vorstellen:

Code:
function [c,ceq] = capacity(x)

S(0)= Smax/2;

for i = 1:length(x)
    if x >= 0
        c = Smax - S(i-1) - x * n;
        S(i)=S(i-1) + x * n;
    else
        c = Smax - S(i-1) - x * m;
        S(i)=S(i-1) + x * m;
    end
end

ceq = [];


Was hältst du davon? Kann man das auch ohne For-Schleife darstellen?
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: 18.07.2018, 20:28     Titel:
  Antworten mit Zitat      
Und für den Rest des Codes habe ich nun:

Code:

fun = @(x)sum(x.*p);

a1(1:length(p)) = 1;
a2(1:length(p)) = -1;
A = [a1; a2]; % Linear inequality constraint: A*x ≤ b.
b = Pmax;
x0(1:length(p)) = 0; % Starting solution
Aeq = []; % Linear Equality constraint: Aeq*x = beq
beq = [];
lb = []; % Lower and upper bounds: lb ≤ x ≤ ub
ub = [];
nonlcon = @capacity; % Nonlinear inequalities or equalities: c(x) ≤ 0 and ceq(x) = 0
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon);
 


Jetzt bin ich gespannt auf dein Feedback Wink
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: 18.07.2018, 20:51     Titel:
  Antworten mit Zitat      
Hallo,

Zielfunktion passt.

Bei der nichtlinearen NB kannst du cumsum verwenden, um die for-Schleife zu vermeiden. Wichtig ist in jedem Fall, dass jede Komponente von c einer Ungleichung entspricht. Momentan überschreibst du c in jedem Schritt und hast somit nur eine (die letzte) Ungleichung.
Zudem sehe ich die Bedingung 0 <= St noch nicht.

b wird wahrscheinlich so nicht verstanden. Klarer in jedem Fall, wenn ich das richtig verstehe:
Code:
b = [Pmax; Pmax];


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: 19.07.2018, 10:34     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank! b habe ich entsprechend angepasst und für die nonlin Bedingung nun:

Code:


function [c,ceq] = capacity(x)

S(0)= Smax/2;

for i = 1:length(x)
    if x >= 0
        c(i) = S(i-1) + x * n - Smax;
        c(i+length(x)) = -S(i-1) - x * n;
        S(i) = S(i-1) + x * n;
    else
        c(i) = S(i-1) + x * m - Smax;
        S(i) = S(i-1) + x * m;
        c(i+length(x)) = -S(i-1) - x * m;
    end
end

ceq = [];

 


Damit sollte c genauso viele Ungleichungen haben wie x. Was hältst du von diser Lösung?

Wie ich cunsum einbinde, sodass die for-Schleife nicht benötigt wird, ist mir jedoch noch nicht klar. Und wirft length(x) denn keinen Fehler, wenn noch nicht alle 8760 x bestimmt sind? Vielleicht besser length(p)?
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: 19.07.2018, 11:11     Titel:
  Antworten mit Zitat      
Hallo,

die Indizierung beginnt in MATLAB bei 1. Das musst du also noch anpassen.

cumsum sollte in etwa so gehen:

Code:
E = m*x;
E(x<0) = n*x(x<0);
S = cumsum([Smax/2; E]);
c1 = -S;
c2 = S - Smax;
c = [c1; c2]


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: 19.07.2018, 11:42     Titel:
  Antworten mit Zitat      
Hallo Harald,

lieben Dank für deine Hilfe.
Jetzt habe ich Feedback von einem amerikanischen Kollegen bekommen, der sagt, ich solle fmincon nicht nutzen (ohne Erklärung), sondern mir folgenden Link anschauen: https://ch.mathworks.com/help/optim.....lizer-blending-plant.html

Dort werden Funktionen wie optimproblem und optimvar eingesetzt. Was ist deine Meinung dazu?
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: 19.07.2018, 11:49     Titel:
  Antworten mit Zitat      
Hallo,

das ist einfach eine andere Herangehensweise, die es seit kurzem gibt. Wenn ich das richtig sehe, kannst du das aber nur auf lineare Probleme anwenden. Dein Problem ist aber durch die Fallunterscheidung nichtlinear.
Für mich ist fmincon klarer. Es kann aber auch daran liegen, dass ich fmincon seit Jahren kenne.
Wenn du das soweit schon für fmincon vorbereitet hast, gibt es m.M.n. keinen Grund, davon abzurücken.

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: 19.07.2018, 11:56     Titel:
  Antworten mit Zitat      
Super, dann kann ich das auch einordnen.

Stand jetzt sieht mein Code also wie folgt aus:

Code:
fun = @(x)sum(x.*p);

a1(1:length(p)) = 1;
a2(1:length(p)) = -1;
A = [a1; a2]; % Linear inequality constraint: A*x <= b.
b = [Pmax; Pmax];
x0(1:length(p)) = 0; % Starting solution
Aeq = []; % Linear Equality constraint: Aeq*x = beq
beq = [];
lb = []; % Lower and upper bounds: lb ? x ? ub
ub = [];
nonlcon = @capacity; % Nonlinear inequalities or equalities: c(x) ? 0 and ceq(x) = 0
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon);


Code:
function [c,ceq] = capacity(x)

E = m*x;
E(x<0) = n*x(x<0);
S = cumsum([Smax/2; E]);
c1 = -S;
c2 = S - Smax;
c = [c1; c2];

% With For-Loop
% S(1)= Smax/2;
% for i = 1:length(x)
%     if x >= 0
%         c(i) = S(i) + x * n - Smax;
%         c(i+length(x)) = -S(i) - x * n;
%         S(i+1) = S(i) + x * n;
%     else
%         c(i) = S(i) + x * m - Smax;
%         c(i+length(x)) = -S(i) - x * m;
%         S(i+1) = S(i) + x * m;        
%     end
% end

ceq = [];


Damit würde ich die Optimierung jetzt einmal anstoßen und dann Schritt für Schritt validieren. Falls dir noch ein klarer Fehler, wie der der Indexierung auffällt, schreibe mir gern.

Ich bin wirklich dankbar für dein Feedback und die Zeit, die du investiert hast.

Viele Grüße,
Mathias
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: 19.07.2018, 13:48     Titel:
  Antworten mit Zitat      
Hi Harald,

leider bekomme ich folgende Fehlermeldung:

Error using fmincon (line 609)
Supplied objective function must return a scalar value.

Es scheint als sei meine Zielfunktion doch nicht korrekt?
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: 19.07.2018, 13:51     Titel:
  Antworten mit Zitat      
Hallo,

schau dir das mal mit dem Debugger an.
Sind z.B. die Dimensionen von p und x gleich? Sollten beides Zeilen- oder Spaltenvektoren gleicher Länge sein.

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
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3, 4  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.