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
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2018, 10:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

lieben Dank für deine Unterstützung!
Wir haben uns nun entschieden, das Problem als linear zu vereinfachen - sollte in unserem Falle keine Auswirkungen haben. Jetzt möchte ich eine lineare Bedingung definieren, die von der Entscheidungsvariablen abhängt. Ist das möglich?

Von der Formulierung c(x) = 0 möchte ich ja nun eine Formulierung nach A*x <= b oder Aeq*x = beq.

Der Code für c(x) = 0 ist:

Code:
function [c] = capacity_vcplex(x,eta,Smax)

E(x<0) = eta*x(x<0);
S = cumsum([Smax/2; E]);
c3 = -S;
c4 = S - Smax;
c = [c3;c4];


Wie kann ich das in die Nebenbedingungen für z.B. den CPLEX Solver einbauen? Ich tue mich leider immer noch wahnsinnig schwer mit der Syntax der Optimierungsprobleme in Matlab.
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: 24.07.2018, 17:30     Titel:
  Antworten mit Zitat      
Hallo,

der Zeitpunkt der Entscheidung verwundert mich. Mit patternsearch funktioniert es doch?
Bei fmincon könnte man übrigens noch versuchen, die Gradienten analytisch zu bestimmen, siehe z.B.
https://de.mathworks.com/help/optim.....aints-with-gradients.html

Die Matrix A würde etwa so aussehen:
[1 0 0 0... 0
1 1 0 0 ... 0
1 1 1 0 ... 0
1 1 1 1 1 1 ... 1]
und das zweimal untereinander.

Dann ist das Problem für linprog geeignet. Nach CPLEX zu gehen dürfte das eher verkomplizieren.

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: 24.07.2018, 18:02     Titel:
  Antworten mit Zitat      
Hallo,

mit patternsearch habe ich leider kein sinnvolles Ergebnis gewinnen können. Da gibt es nur 6 Entlade bzw. Ladevorgänge innerhalb eines Jahres.

fmincon konnte ich leider noch nicht auf einer fähigeren Maschine probieren. Warum würde es CPLEX komplizierter machen? Ist die Problemstruktur für diesen Solver nicht die gleiche - so sieht es für mich momentan aus?

In diesem Forschungsfeld scheint CPLEX eine Art Standard zu sein. Es scheint, als solle ich mich daran halten...und als Masterstudent mit wenig eigener Erfahrung in der Optimierung vermag ich hier wenig entgegenzusetzen.

Lieder verstehe ich die Matrix A nicht. Wieso sieht die Formulierung für den Speicher so aus? Bzw. wie sieht dann b aus?

Ich weiß, ich habe dich schon viel zu sehr beansprucht und bin dir für jede Hilfe unendlich dankbar!
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: 24.07.2018, 18:25     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
mit patternsearch habe ich leider kein sinnvolles Ergebnis gewinnen können. Da gibt es nur 6 Entlade bzw. Ladevorgänge innerhalb eines Jahres.

patternsearch versucht globale Optimierung. Das ist aber in einem 8760-D Raum schwierig. Wenn du bessere Startwerte kennst, die die NB erfüllen, verwende sie. Dann wird patternsearch auch bessere Ergebnisse liefern.

Zitat:
Warum würde es CPLEX komplizierter machen?

Weil es ein externer Löser ist und du dich erst mit Aufrufsyntax etc. vertraut machen musst.

Zitat:
In diesem Forschungsfeld scheint CPLEX eine Art Standard zu sein.

Ich würde eher die Methodik (lineare Programmierung) als den Standard ansehen als den Anbieter. Wenn man so einen Standard hat, dann sollte man sich darüber klar werden, bevor man viel eigene Zeit (und die anderer) investiert.

Zitat:
Lieder verstehe ich die Matrix A nicht. Wieso sieht die Formulierung für den Speicher so aus? Bzw. wie sieht dann b aus?

Multipliziere mal A*x aus, dann dürfte es klar werden. Ebenso, was b sein muss.

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: 24.07.2018, 18:46     Titel:
  Antworten mit Zitat      
Hallo Harald,

es tut mir wirklich leid, wenn ich deine Zeit unrechtmäßigerweise bzw. aufgrund mangelnder Vorbereitung meinerseits verschwendet habe. So sehe ich es allerdings nicht, denn ich habe auf diesem Weg und durch dich eine Menge lernen können.

Leider verstehe ich die Formulierung für A noch immer nicht. Ich schätze deinen didaktischen Ansatz sehr. Aber da wir nicht nebeneinander sitzen können und so kein Hin- und Her aus Frage und Antwort entstehen kann, verlängert es den Prozess des Verstehens meinerseits und den Prozess des Erklärens deinerseits. Meinst du nicht?

Konkret verstehe ich nicht, wie der Ladezustand der Batterie zur vorherigen Stunde durch eine solche Formulierung integriert wird. Ich will doch letztlich zwei Nebenbedingungen formulieren:

Code:
E * n <= S(t-1)
E * n <= Smax - S(t-1)


Und hinzukommt, dass ich für jeden Funktionsaufruf und neuen Vektor x ja auch einen neuen Vektor E mit

Code:
E = x;
E(x>0) = eta*E(x>0);


definieren muss. Ich stehe hier wahrscheinlich mächtig auf dem Schlauch, aber die Formulierung erschließt sich mir leider nicht.
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: 24.07.2018, 20:28     Titel:
  Antworten mit Zitat      
Hallo,

wichtig ist immer, die Bedingúngen ausschließlich in Abhängigkeit der Variablen hinzuschreiben. S(t-1) ist ja auch von E abhängig, und nach meinem Verständnis waren die Gleichungen
b_1 \le \sum_{k=1}^n E_k  \le b_2 \forall n

Das sollte die Struktur von A erklären. Der untere Teil muss allerdings mit -1 multipliziert werden.

b setzt sich dann aus -b_1 und b_2 zusammen, jeweils mehrfach untereinander kopiert.

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

ich glaube, ich hab's und auf dem Weg gleich auch einen wesentlichen Fehler in meinem vorherigen Ansatz gefunden. Vielen Dank für deine Geduld.

Nur ein Problem bleibt:
Wie sage ich ihm, dass alle E > 0 mit n multipliziert werden?

Denn diese Prüfung müsste er ja nach jeder Iteration machen; schließlich können sich die Vorzeichen von x1, x2, x3, ...x8760 ja jederzeit ändern.

Für die nichtlineare Funktion hatten wir das Problem ja bereits charmant gelöst. Aber wie drücke ich das nun für den linearen Fall mit Ax <= b aus?
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: 25.07.2018, 00:10     Titel:
  Antworten mit Zitat      
Der Code für A und b sieht dann wie folgt aus:

Code:
% Constraints
a1 = eye(length(p));
a2 = a1*-1;
a3(1:length(p),1:length(p)) = eta;
a3 = tril(a3);
a4(1:length(p),1:length(p)) = -eta;
a4 = tril(a4);
Aineq = [a1; a2; a3; a4]; % Linear inequality constraint: Aineq*x <= bineq.
b1(1:2*length(p),1) = Pmax;
b2(1:length(p),1) = Smax - Smax/2;
b3(1:length(p),1) = Smax/2;
bineq = [b1; b2; b3];


Aber wie gesagt, demnach würden alle x mit eta multipliziert. Ich möchte dies jedoch nur für die positiven x. Wie kann ich das erreichen?
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: 25.07.2018, 00:56     Titel:
  Antworten mit Zitat      
Und für linprog müsste ich ebenfalls die Zielfunktion anpassen, ist das richtig?

Code:
f = p; % positive values of x indicate charging
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: 25.07.2018, 07:27     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Nur ein Problem bleibt:
Wie sage ich ihm, dass alle E > 0 mit n multipliziert werden?

Das geht bei linearer Optimierung nicht. Dadurch wird das Problem nichtlinear.

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: 25.07.2018, 16:25     Titel:
  Antworten mit Zitat      
Hi Harald,

ich hätte jedoch einen Workaround, womit das Problem wieder linear wäre. Nämlich eine Approximationsfunktion, wenn ich n definiere als:

n_neu = (1/2*(1/sqrt(n)+sqrt(n))-1/2*(1/sqrt(n)-sqrt(n))*tanh(-50x))

Mein Problem ist nur, dass ich diese Funktion nicht so ohne Weiteres in die A-Matrix bzw. den b-Vektor bekomme. Denn hier steht x ja selbst in der Funktion. Und x ließe sich dort wohl nur numerisch herauslösen zu einer Form A*x <= b.

Kann ich dem Solver diese Gleichung in anderer Form mitteilen? Ggf. ähnlich zur nonlin Funktion?

P.S.: Der fmincon läuft! Besten Dank dafür. Er ist leider - zumindest auf meiner Maschine - sehr langsam. Der Vollständigkeit halber möchte ich es jedoch auch mit dem linprog bzw. cplex lösen 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: 25.07.2018, 18:55     Titel:
  Antworten mit Zitat      
Hallo,

durch den tanh(-50x) wird es dann aber doch wieder nichtlinear.
Es gibt da wirklich nur linear oder nichtlinear und nichts dazwischen.

Schön, dass du es mit fmincon geschafft hast. Aus Neugierde: was hast du da noch geändert?

Dass das mit fmincon ein Weilchen dauert, ist bei 8760 Variablen kein Wunder. Abhilfe schaffen kann höchstens analytische Ableitungen, sofern du das nicht schon machst.

Ich habe selbst nie mit CPLEX gearbeitet und kann da somit nicht weiterhelfen.

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: 26.07.2018, 13:59     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich werde zwar weiterhin nichtlinear, aber doch stetig? Dann müsste CPLEX oder auch linprog anwendbar sein, oder?

Mein Code für fmincon lautet nun:

Code:
fun = @(x)sum(x.*p); % positive values of x indicate charging

a1 = eye(length(p));
a2 = a1*-1;
A = [a1; a2]; % Linear inequality constraint: A*x <= b.
b(1:2*length(p),1) = Pmax;
x0(1:length(p),1) = 1; % Starting solution
xcount = cumsum(x0);
idx = mod(xcount,2)==1;
x0(idx)=-1;
Aeq = []; % Linear Equality constraint: Aeq*x = beq
beq = [];
lb = []; % Lower and upper bounds
ub = [];
nonlcon = @(x) capacity_fmincon(x, eta, Smax) ; % Nonlinear inequalities or equalities: c(x) = 0 and ceq(x) = 0

% Solver - fmincon
options = optimoptions('fmincon','Display','iter','Algorithm','interior-point','MaxFunctionEvaluations',1000000);
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
 


Lieben Dank für deine Hilfe. Bestimm wird das nicht mein letzter Forumspost gewesen sein. Ich hoffe, du siehst es mir nach Smile
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: 26.07.2018, 20:26     Titel:
  Antworten mit Zitat      
Hallo,

linprog funktioniert ausschließlich für lineare Probleme.
CPLEX besteht meines Wissens aus mehreren Solvern. Ob es einen speziell für diese Problemart gibt, kann ich nicht sagen.

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
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.07.2018, 20:27     Titel:
  Antworten mit Zitat      
Hallo,

auf den ersten Blick scheint die Änderung ein anderer Startwert zu sein?

linprog funktioniert ausschließlich für lineare Probleme.
CPLEX besteht meines Wissens aus mehreren Solvern. Ob es einen speziell für diese Problemart gibt, kann ich nicht sagen.

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 Zurück  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.