Die Aufgaben müssen in ILIAS als lauffähige und dokumentierte Jupyter Notebooks inkl. Datenfiles abgegeben werden. LP-Modellierungen können als eingescannte PDFs abgegeben werden.

Aufgabe 1: Arbitrage (6 Punkte)

Sie verwenden eine Batterie, um am Energiemarkt Arbitrage zu betreiben. Arbitrage bedeutet in diesem Zusammenhang, dass Sie die Batterie zu Zeiten mit tiefen Preisen laden und zu Zeiten mit hohen Preisen entladen. Danach hat die Batterie wieder den anfänglichen Ladestand. Sie fragen sich, wie groß der Preisunterschied sein muss, damit Sie bei gegebenen Lade- und Entladeverlusten einen Gewinn erzielen.

  1. Beantworten Sie die Frage allgemein, indem Sie eine Formel herleiten, die folgende Parameter enthält:

    • \(\eta_\text{in}\), \(\eta_\text{out}\): Lade- und Entladewirkungsgrad
    • \(c_\text{low}\): niedriger Preis
    • \(c_\text{high}\): hoher Preis

    Erläutern Sie die Formel in Worten.

  2. Überprüfen Sie Ihre Formel durch folgende Simulation: \(\eta_\text{in} = \eta_\text{out} = 0.9\), \(c_\text{low} = 0.1\). Fixieren Sie die restlichen Parameter für eine Batterie Ihrer Wahl. Wählen Sie 50 Werte für \(c_\text{high}\) zwischen 0.1 EUR/kWh und 0.15 EUR/kWh, und berechnen Sie für jeden Wert von \(c_\text{high}\) über ein LP den optimalen Gewinn über zwei Zeitperioden mit den Marktpreisen \(c_\text{low}\) und \(c_\text{high}\). Bestimmen Sie, ab welchem der Werte von \(c_\text{high}\) Sie Gewinn machen, und vergleichen Sie dies mit Ihrer Formel.

Aufgabe 2: Peak Power Variation (4 Punkte)

Problemstellung

Wir betrachten eine ähnliche Situation wie im Beispiel Batterieverluste, nur dass die Batterie kleiner und der Verbrauch größer ist:

Code
import numpy as np
import matplotlib.pyplot as plt

# time:
dt = 0.25  # h
times = np.arange(start=0, stop=8 + dt, step=dt)
periods = np.arange(start=0, stop=8, step=dt)
n = len(periods)
time_indices   = range(n + 1)  # 0, 1, ..., n - 1, n
period_indices = range(n)      # 0, 1, ..., n - 1

# demand:
np.random.seed(0)
noise = np.random.normal(loc=0, scale=1.5, size=len(periods))
demand = 8 + 0.8*periods - 0.5*(periods - 4)**2 + noise

plt.figure(figsize=(5, 3))
plt.step(periods, demand, where='post', color='black', marker='.')
plt.xlabel('time (h)')
plt.ylabel('demand (kW)')
plt.grid()

# battery:
eta_in  = 0.9    # efficiency of charging
eta_out = 0.9    # efficiency of discharging
E_max   = 20.0   # kWh, maximum energy level
E_start = 15.0   # kWh, starting energy level
E_end   = 15.0   # kWh, final energy level
p_max   = 10.0   # kW, maximum (dis-)charging power

  1. Minimieren Sie mit dem Code aus Beispiel Batterieverluste die Spitzenlast (Peak Power), und stellen Sie die resultierende Netzlast grafisch dar. In der Grafik sehen Sie, dass die Netzlast teils große Schwankungen und Sprünge aufweist.
  2. Um diese zu reduzieren, modellieren und implementieren Sie das Optimierungsproblem, das die maximale Variation minimiert, daher der Name “Peak Power Variation”, siehe Dynamische Probleme: Variation. Stellen Sie die resultierende Netzlast wieder grafisch dar, und vergleichen Sie die Grafik mit jener der “Peak Power” Minimierung. Untersuchen Sie, ob man die Minimierung der “Peak Power Variation” relaxieren kann.