|
|
Lineare Optimierung - Optimierung über mehrere Zeitschritte |
|
MatlabMathias |

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.07.2018, 14:03
Titel: Lineare Optimierung - Optimierung über mehrere Zeitschritte
|
 |
|
 |
|
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:
Es gibt zwei Constraints:
St ist der Füllstand des Speichers nach jeder Stunde und wird definiert wie folgt:
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
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.497
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 18.07.2018, 14:16
Titel:
|
 |
Hallo,
ich vermute, Werte für Pt sind gegeben?
Das Problem ist für 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 ;)
|
|
|
MatlabMathias |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.07.2018, 15:59
Titel:
|
 |
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?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.497
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 18.07.2018, 16:12
Titel:
|
 |
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 ;)
|
|
|
MatlabMathias |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.07.2018, 17:10
Titel:
|
 |
Hallo Harald,
lieben Dank für deine schnellen Rückmeldungen!
Also, die Zielfunktion definiere ich wie folgt:
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.
|
|
|
MatlabMathias |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.07.2018, 18:38
Titel:
|
 |
Harald, für die nonlineare Nebenbedingung benötige ich im Prinzip ja eine For-Schleife. Ich könnte mir eine solche Lösung vorstellen:
Was hältst du davon? Kann man das auch ohne For-Schleife darstellen?
|
|
|
MatlabMathias |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.07.2018, 20:28
Titel:
|
 |
Und für den Rest des Codes habe ich nun:
Jetzt bin ich gespannt auf dein Feedback
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.497
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 18.07.2018, 20:51
Titel:
|
 |
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:
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 ;)
|
|
|
MatlabMathias |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 19.07.2018, 10:34
Titel:
|
 |
Hallo Harald,
vielen Dank! b habe ich entsprechend angepasst und für die nonlin Bedingung nun:
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)?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.497
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 19.07.2018, 11:11
Titel:
|
 |
Hallo,
die Indizierung beginnt in MATLAB bei 1. Das musst du also noch anpassen.
cumsum sollte in etwa so gehen:
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 ;)
|
|
|
MatlabMathias |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 19.07.2018, 11:42
Titel:
|
 |
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?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.497
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 19.07.2018, 11:49
Titel:
|
 |
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 ;)
|
|
|
MatlabMathias |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 19.07.2018, 11:56
Titel:
|
 |
Super, dann kann ich das auch einordnen.
Stand jetzt sieht mein Code also wie folgt aus:
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
|
|
|
MatlabMathias |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 33
|
 |
|
 |
Anmeldedatum: 18.07.18
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 19.07.2018, 13:48
Titel:
|
 |
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?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.497
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 19.07.2018, 13:51
Titel:
|
 |
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 ;)
|
|
|
|
Gehe zu Seite 1, 2, 3, 4 Weiter
|
Einstellungen und Berechtigungen
|
|
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
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|