Commit 27b4a8b7 authored by Fabian Neumann's avatar Fabian Neumann

update for summer term 2019 session

parent 379abd90
# Download
# Python Tutorials
You can download the tutorials with `git` with the following command (it should
be public):
In the tutorials we will repeatedly work with the programming language Python. If you are unfamiliar with the language, you might find the following tutorials useful.
```
The [Python notebook based notes of Robert Johansson](http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/tree/master/) are a
comprehensive kick starter.
* [Lecture 0](http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-0-Scientific-Computing-with-Python.ipynb) covers installation and getting ready.
* [Lecture 1](http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-1-Introduction-to-Python-Programming.ipynb)
zooms through most basic general python control structures (only
brush over it and stop reading early, i.e. if you read the word
`classes` you already know too much).
* [Lecture 2](http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-2-Numpy.ipynb) is the most important and closely connected to the exercises.
* You might as well stop now, but if you are hooked, have a look at [Lecture 3](http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-3-Scipy.ipynb) for more physics and [Lecture 4](http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb) for prettier graphs.
Further reference material of help is are the website-books http://python-course.eu/ (English), http://python-kurs.eu/ (German); especially of interest might be the [pandas](http://www.python-course.eu/pandas.php) bit in the end, which will make the exercises a breeze at the expense of yet another package to learn.
# Downloading Tutorial Material
You can download the tutorials with `git` with the following command:
```bash
cd /path/where/your/tutorial/folder/should/be
git clone https://git.scc.kit.edu/sp2668/esm_tutorials.git
```
or
```
```bash
cd /path/where/your/tutorial/folder/should/be
git clone git@git.scc.kit.edu:sp2668/esm_tutorials.git
```
if you have `ssh` setup at `git.scc.kit.edu`.
Alternatively, you can download the tutorials as compressed zip-file from
Alternatively, (not as nice as description above) you can download the tutorials as compressed zip-file from
https://git.scc.kit.edu/sp2668/esm_tutorials/-/archive/master/esm_tutorials-master.zip
# Installation Guide
**Make sure to follow these steps BEFORE the first tutorial (The wireless WILL
be spotty with so many heavy users and we'll loose precious tutorial time)!**
**If you happen to come across this before the tutorials start,
you may already want to follow the installation instructions already to get started right away.**
We'll be using `Python` in the tutorials. If you are unfamiliar with `Python`, [this](http://introtopython.org/) is a great start, but a quick Google search on `Python` tutorials will give you millions of great alternatives.
Install `miniconda` (or Anaconda). For instructions for your operating system
see https://conda.io/docs/user-guide/install/index.html
We recommend using the package manager and environment management system `conda` to install the packages we need.
Now create a new environment from the provided `requirements.yml` file. For
detailed instructions see
https://conda.io/docs/user-guide/tasks/manage-environments.html#creating-an-environment-from-an-environment-yml-file
Install [`miniconda`](https://conda.io/docs/user-guide/install/index.html) (or Anaconda). For instructions for your operating system
see https://conda.io/docs/user-guide/install/index.html.
Open a terminal. Creating the environment requires the following set of
commands. They take time and have to download several packages!
Create a new `conda` environment from the provided `environment.yaml` file with the following set of commands:
Windows:
```
```bash
conda env create -f requirements.yml
activate esm-tutorials
```
macOS and Linux:
```
```bash
conda env create -f requirements.yml
conda activate esm-tutorials
```
On some older Linux installations the last command can be instead
```bash
source activate esm-tutorials
```
Open a jupyter notebook with the following command in the tutorial folder (where your notebooks are):
For detailed instructions see
https://conda.io/docs/user-guide/tasks/manage-environments.html#creating-an-environment-from-an-environment-yml-file.
It will take some time!
With the `conda` environment installed and activated, open a jupyter notebook/lab with the following command in the tutorial folder (where your notebooks are):
```bash
cd /path/where/your/tutorial/folder/should/be
cd esm-tutorials
jupyter lab
```
or
```bash
cd /path/where/your/tutorial/folder/should/be
cd esm-tutorials
jupyter notebook
```
......
......@@ -3,20 +3,29 @@ channels:
- conda-forge
- defaults
dependencies:
- python
# notebooks
- jupyter
- matplotlib
- basemap
- jupyterlab
- nb_conda
# utilities
- numpy
- scipy
- networkx
- pandas
- python
- scikit-learn
- pyomo
- xarray
- netcdf4
- bottleneck
- networkx
- matplotlib
- yaml
# optimisation
- pyomo
- scikit-learn
- glpk
- pip:
- pypsa
- ipopt
# power system analysis
- pypsa
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -4,7 +4,17 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Energy System Modelling - Tutorial I.2"
"# Energy System Modelling - Tutorial I.2\n",
"\n",
"Karlsruhe Institute of Technology, Institute for Automation and Applied Informatics\n",
"***"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Note:** This can actually be solved analytically. First try without coding."
]
},
{
......@@ -22,7 +32,7 @@
"\n",
"$$\\omega = \\frac{2\\pi}{T} $$\n",
"$$T = 1 \\text{ year}$$\n",
"$$ A_W = 0.4 $$ $$ A_S = 0.75 $$ $$ A_L = 0.1 $$\n"
"$$ A_W = 0.4 $$ $$ A_S = 0.75 $$ $$ A_L = 0.1 $$"
]
},
{
......@@ -279,7 +289,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
"version": "3.7.3"
},
"varInspector": {
"cols": {
......
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -93,7 +93,7 @@
%=====================================================================
The following data are made available to you on the course home
page\footnote{\url{https://nworbmot.org/courses/esm-2018/}}:
page\footnote{\url{https://nworbmot.org/courses/esm-2019/}}:
\begin{verbatim}
de_data.csv, gb_data.csv, eu_data.csv, (wind.csv, solar.csv, load.csv).
\end{verbatim}
......@@ -194,27 +194,4 @@ The time series are normalized to
Analogously to (a), find the optimal mix \(\alpha\) as a function of \(0 \leq \gamma \leq 1\), which minimizes \(\expect{\Delta^2}\).
\end{enumerate}
\pagebreak
%=============== ======================================================
\paragraph{Remarks -- Introductions to Python}~\\
%=====================================================================
In the tutorials we will repeatedly work with the programming language Python. If you are unfamiliar with the language, you might find the following tutorials useful.\\
The Python notebook based notes of Robert Johansson are a
comprehensive kick starter\footnote{\url{http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/tree/master/}}.
\begin{itemize}
\item
\href{http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-0-Scientific-Computing-with-Python.ipynb}{Lecture~0} covers installation and getting ready.
\item
\href{http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-1-Introduction-to-Python-Programming.ipynb}{Lecture~1}
zooms through most basic general python control structures (only
brush over it and stop reading early, i.e. if you read the word
\verb+classes+ you already know too much).
\item \href{http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-2-Numpy.ipynb}{Lecture~2} is the most important and closely connected to the exercises.
\item You might as well stop now, but if you \emph{are} hooked, have a look at \href{http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-3-Scipy.ipynb}{Lecture~3} for more physics and \href{http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb}{Lecture~4} for prettier graphs.
\end{itemize}
Further reference material of help is are the website-books \url{http://python-course.eu/} (english), \url{http://python-kurs.eu/} (german); especially of interest might be the \href{http://www.python-course.eu/pandas.php}{pandas} bit in the end, which will make the exercises a breeze at the expense of yet another package to learn.
\end{document}
......@@ -8,7 +8,7 @@
}
},
"source": [
"# Energy System Modelling - Solutions to Tutorial II"
"# Energy System Modelling - Tutorial II"
]
},
{
......@@ -60,7 +60,6 @@
}
},
"source": [
"***\n",
"**(a) Compile the nodes list and the edge list.**\n",
"> **Remark:** While graph-theoretically both lists are unordered sets, let's agree on an ordering now which can serve as basis for the matrices in the following exercises: we sort everything in ascending numerical order, i.e. node 1 before node 2 and edge (1,2) before (1,4) before (2,3)."
]
......@@ -142,6 +141,13 @@
"> In graph theory and computer science, an adjacency matrix is a square matrix used to represent a finite graph. The elements of the matrix indicate whether pairs of vertices are adjacent or not in the graph."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Adjacency Matrix:"
]
},
{
"cell_type": "code",
"execution_count": 5,
......@@ -154,12 +160,12 @@
{
"data": {
"text/plain": [
"array([[ 0., 1., 0., 0., 0., 0.],\n",
" [ 1., 0., 1., 0., 1., 1.],\n",
" [ 0., 1., 0., 1., 1., 0.],\n",
" [ 0., 0., 1., 0., 1., 0.],\n",
" [ 0., 1., 1., 1., 0., 1.],\n",
" [ 0., 1., 0., 0., 1., 0.]])"
"array([[0., 1., 0., 0., 0., 0.],\n",
" [1., 0., 1., 0., 1., 1.],\n",
" [0., 1., 0., 1., 1., 0.],\n",
" [0., 0., 1., 0., 1., 0.],\n",
" [0., 1., 1., 1., 0., 1.],\n",
" [0., 1., 0., 0., 1., 0.]])"
]
},
"execution_count": 5,
......@@ -177,6 +183,13 @@
"A"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check for symmetry:"
]
},
{
"cell_type": "code",
"execution_count": 6,
......@@ -226,7 +239,7 @@
{
"data": {
"text/plain": [
"array([ 1., 4., 3., 2., 4., 2.])"
"array([1., 4., 3., 2., 4., 2.])"
]
},
"execution_count": 7,
......@@ -426,7 +439,7 @@
"***\n",
"## Problem II.2\n",
"\n",
"If you map the nodes to `0=DK, 1=DE, 2=CH, 3=IT, 4=AT,5=CZ` the network represents a small part of the European electricity network (albeit very simplified). In the repository, you can find the power imbalance time series for the six countries for January 2017 in hourly MW in the file `imbalance.csv`. They have been derived from physical flows as published by [ENTSO-E](https://transparency.entsoe.eu/transmission-domain/physicalFlow/show)"
"If you map the nodes to `0=DK, 1=DE, 2=CH, 3=IT, 4=AT, 5=CZ` the network represents a small part of the European electricity network (albeit very simplified). In the repository, you can find the power imbalance time series for the six countries for January 2017 in hourly MW at `./data/imbalance.csv`. They have been derived from physical flows as published by [ENTSO-E](https://transparency.entsoe.eu/transmission-domain/physicalFlow/show)"
]
},
{
......@@ -456,7 +469,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 14,
"metadata": {
"slideshow": {
"slide_type": "fragment"
......@@ -561,13 +574,13 @@
"2017-01-01 04:00:00 -526.15 5695.72 -3924.43 -646.2 -3393.12 2794.18"
]
},
"execution_count": 13,
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"imbalance = pd.read_csv('imbalance.csv', index_col=0, parse_dates=True)\n",
"imbalance = pd.read_csv('data/imbalance.csv', index_col=0, parse_dates=True)\n",
"imbalance.head()"
]
},
......@@ -611,7 +624,7 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 15,
"metadata": {
"slideshow": {
"slide_type": "fragment"
......@@ -624,7 +637,7 @@
"array([ 3486.25, -3403.37, -97.5 , -2867.33, 2961.68])"
]
},
"execution_count": 14,
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
......@@ -635,7 +648,7 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 16,
"metadata": {
"slideshow": {
"slide_type": "fragment"
......@@ -649,7 +662,7 @@
" -1590.03761905, 725.68619048])"
]
},
"execution_count": 15,
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
......@@ -672,7 +685,7 @@
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 22,
"metadata": {
"slideshow": {
"slide_type": "fragment"
......@@ -686,7 +699,7 @@
" -307.72047619, -712.94095238, -405.22047619, -2315.72380952])"
]
},
"execution_count": 16,
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
......@@ -705,12 +718,14 @@
},
"source": [
"***\n",
"**(b) Determine the average flow on each link for January 2017 and draw it as a directed network**"
"**(b) Determine the average flow on each link for January 2017 and draw it as a directed network**\n",
"\n",
"> **Hint:** You may want to make use of the function `np.vstack`."
]
},
{
"cell_type": "code",
"execution_count": 17,
"execution_count": 18,
"metadata": {
"slideshow": {
"slide_type": "fragment"
......@@ -723,7 +738,7 @@
},
{
"cell_type": "code",
"execution_count": 18,
"execution_count": 19,
"metadata": {
"slideshow": {
"slide_type": "fragment"
......@@ -736,7 +751,7 @@
"(8, 744)"
]
},
"execution_count": 18,
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
......@@ -747,7 +762,7 @@
},
{
"cell_type": "code",
"execution_count": 19,
"execution_count": 20,
"metadata": {
"slideshow": {
"slide_type": "fragment"
......@@ -761,7 +776,7 @@
" 421.1171115 , -277.47351895, -698.59063044, -1698.48293331])"
]
},
"execution_count": 19,
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
......@@ -788,7 +803,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
"version": "3.7.3"
},
"nav_menu": {},
"toc": {
......
......@@ -24,6 +24,7 @@
"import numpy.linalg\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('bmh')\n",
"%matplotlib inline"
]
},
......@@ -32,14 +33,13 @@
"metadata": {},
"source": [
"***\n",
"## Problem II.2"
"## Problem II.1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"***\n",
"**(a) Compile the nodes list and the edge list.**\n",
"> **Remark:** While graph-theoretically both lists are unordered sets, let's agree on an ordering now which can serve as basis for the matrices in the following exercises: we sort everything in ascending numerical order, i.e. node 1 before node 2 and edge (1,2) before (1,4) before (2,3)."
]
......@@ -75,6 +75,27 @@
"> In graph theory and computer science, an adjacency matrix is a square matrix used to represent a finite graph. The elements of the matrix indicate whether pairs of vertices are adjacent or not in the graph."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Adjacency Matrix:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check for symmetry:"
]
},
{
"cell_type": "code",
"execution_count": null,
......@@ -153,7 +174,7 @@
"***\n",
"## Problem II.2\n",
"\n",
"If you map the nodes to `0=DK, 1=DE, 2=CH, 3=IT, 4=AT,5=CZ` the network represents a small part of the European electricity network (albeit very simplified). On the [course homepage](https://nworbmot.org/courses/complex_renewable_energy_networks/), you can find the power imbalance time series for the six countries for January 2017 in hourly MW in the file `imbalance.csv`. They have been derived from physical flows as published by [ENTSO-E](https://transparency.entsoe.eu/transmission-domain/physicalFlow/show)"
"If you map the nodes to `0=DK, 1=DE, 2=CH, 3=IT, 4=AT, 5=CZ` the network represents a small part of the European electricity network (albeit very simplified). In the repository, you can find the power imbalance time series for the six countries for January 2017 in hourly MW at `./data/imbalance.csv`. They have been derived from physical flows as published by [ENTSO-E](https://transparency.entsoe.eu/transmission-domain/physicalFlow/show)"
]
},
{
......@@ -282,7 +303,7 @@
}
],
"source": [
"imbalance = pd.read_csv('imbalance.csv', index_col=0, parse_dates=True)\n",
"imbalance = pd.read_csv('data/imbalance.csv', index_col=0, parse_dates=True)\n",
"imbalance.head()"
]
},
......@@ -337,7 +358,9 @@
"metadata": {},
"source": [
"***\n",
"**(b) Determine the average flow on each link for January 2017 and draw it as a directed network**"
"**(b) Determine the average flow on each link for January 2017 and draw it as a directed network**\n",
"\n",
"> **Hint:** You may want to make use of the function `np.vstack`."
]
},
{
......@@ -364,7 +387,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
"version": "3.7.3"
},
"nav_menu": {},
"toc": {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
......@@ -85,18 +85,29 @@
%=====================================================================
\begin{document}
\begin{flushright}
\textbf{Energy System Modelling }\\
{\small Karlsruhe Institute of Technology}\\
{\small Institute for Automation and Applied Informatics}\\
{\small Summer Term 2019}\\
\end{flushright}
\vspace{-0.5em}
\hrulefill
\vspace{0.3em}
\begin{center}
\textbf{\Large Energy System Modelling }\\
{SS 2018, Karlsruhe Institute of Technology}\\
{Institute for Automation and Applied Informatics}\\ [1em]
\textbf{\textsc{\Large Solutions to Tutorial III}}\\
\small Will be worked on in the exercise session on Monday, 16 July 2018.\\[1.5em]
\textbf{\textsc{\Large Solutions III: Storage Optimisation}}\\
\small Will be worked on in the exercise session on Thursday, 13 June 2019.\\[1.5em]
\end{center}
\vspace{1em}
\vspace{-0.5em}
\hrulefill
\vspace{0.8em}
%=============== ======================================================
\paragraph{Solution III.1 \normalsize (storage adequacy).}~\\
\paragraph{Problem III.1 (analytical) -- storage optimisation without losses}~\\
%=====================================================================
\begin{wrapfigure}[11]{r}{0pt}
......@@ -118,30 +129,28 @@
\label{fig:variations}
\end{wrapfigure}
Imagine a two-node Germany. The South can install solar panels with a capacity factor $Cf_s$ to cover its load $L^S$, while the North uses wind turbines that have a capacity factor $Cf_w$
Imagine a two-node Germany. The South can install solar panels with a capacity factor $c_s$ to cover its load $L^S$, while the North uses wind turbines that have a capacity factor $c_w$
to feed their load $L^N$. Figure \ref{fig:variations} shows approximations to the daily and synoptic variations of per-unit wind and solar power generation \(G^{N}_{w}(t)\) and \(G^{S}_{s}(t)\) and a constant load \(L^{N/S}(t)\):
\vspace{-0.5em}
\begin{align*}
G_{w}^N(t) & = Cf_w(1+A_w \sin \omega_w t), \\
G_{s}^S(t) & = Cf_s(1+A_s \sin \omega_s t), \\
g_{w}^N(t) & = c_w(1+A_w \sin \omega_w t), \\
g_{s}^S(t) & = c_s(1+A_s \sin \omega_s t), \\
L^{N/S}(t) & = A_{l}^{N/S}.
\end{align*}
The capacity factors and constants are
\vspace{-0.25em}
\begin{align*}
A_{l}^{N} & = 20 \si{\giga\watt}, & A_{l}^{S} & = 30 \si{\giga\watt}, \\
Cf_w & = 0.3, & A_w & = 0.9, & \omega_w & = \frac{2\pi}{7 \text{d}}, \\
Cf_s & = 0.12, & A_s & = 1.0, & \omega_s & = \frac{2\pi}{1 \text{d}}. \\
c_w & = 0.3, & A_w & = 0.9, & \omega_w & = \frac{2\pi}{7 \text{d}}, \\
c_s & = 0.12, & A_s & = 1.0, & \omega_s & = \frac{2\pi}{1 \text{d}}.
\end{align*}
\vspace{-0.3em}
For now, assume the stores are lossless. Losses will be considered in Problem III.2.
For now, assume no power exchange between the regions and that the stores are lossless.
\begin{enumerate}[(a)]
% (a)
\begin{shaded}\item How much wind capacity $G^{N}_{w}$ must be installed in the North and solar capacity $G_s^S$ in the South?\end{shaded}
\begin{shaded}\item How much wind capacity $G^{N}_{w}$ must be installed in the North and solar capacity $G_s^S$ in the South so that on average generation matches demand?
?\end{shaded}
In the North:
......@@ -164,7 +173,7 @@ For now, assume the stores are lossless. Losses will be considered in Problem II
$$\Rightarrow \quad G^S_s = \frac{A^S_l}{Cf_s} = \frac{30\si{\giga\watt}}{0.12} = \rd{\res}\si{\giga\watt}$$
% (b)
\begin{shaded}\item What is the amount of store and dispatch power capacity $G_{st,store}=\max(-\Delta(t))$ and $G_{st,dispatch} = \max \Delta(t)$ the storage units must have in the North and in the South to account for the mismatch $\Delta(t)=L(t)-G_{w/s}\cdot G_{w/s}(t)$?\end{shaded}
\begin{shaded}\item For a system to work, generation must match demand not on average but at each location and each point in time. Storages are one way of ensuring this constraint with variable renewable generation. What is the amount of store and dispatch power capacity $G_{st,store}=\max(-\Delta(t))$ and $G_{st,dispatch} = \max \Delta(t)$ the storage units must have in the North and in the South to account for the mismatch $\Delta(t)=L(t)-G_{w/s}\cdot g_{w/s}(t)$?\end{shaded}
In the North:
......@@ -339,12 +348,6 @@ For now, assume the stores are lossless. Losses will be considered in Problem II
\end{align*}
the system cost could be reduced by approx.\ 7 \%.
%=============== ======================================================
\paragraph{Solution III.2 \normalsize (storage optimisation with PyPSA).}~\\
%=====================================================================
cf. Jupyter Notebook
\end{enumerate}
......
This diff is collapsed.
......@@ -102,17 +102,28 @@
%=====================================================================
\begin{document}
\begin{center}
\textbf{\Large Energy System Modelling }\\
{SS 2019, Karlsruhe Institute of Technology}\\
{Institute for Automation and Applied Informatics}\\ [1em]
\textbf{\textsc{\Large Solution IV: Electricity Markets}}\\
\small Will be worked on in the exercise session on Tuesday, 17 July 2018.\\[1.5em]
\end{center}
\blackrule[width=\hsize, height=1pt, depth=0.5ex]
\vspace{1em}
\begin{flushright}
\textbf{Energy System Modelling }\\
{\small Karlsruhe Institute of Technology}\\
{\small Institute for Automation and Applied Informatics}\\
{\small Summer Term 2019}\\
\end{flushright}
\vspace{-0.5em}
\hrulefill
\vspace{0.3em}
\begin{center}
\textbf{\textsc{\Large Solutions IV: Electricity Markets}}\\
\small Will be worked on in the exercise session on Friday, 14 June 2019.\\[1.5em]
\end{center}
\vspace{-0.5em}
\hrulefill
\vspace{0.8em}
%=============== ======================================================
\paragraph{Solution IV.1 \normalsize (Shadow prices of limits on consumption).}~\\
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
name,weightings
2011-01-01 00:00:00,1.0
2011-01-01 01:00:00,1.0
2011-01-01 02:00:00,1.0
2011-01-01 03:00:00,1.0
2011-01-01 04:00:00,1.0
2011-01-01 05:00:00,1.0
2011-01-01 06:00:00,1.0
2011-01-01 07:00:00,1.0
2011-01-01 08:00:00,1.0
2011-01-01 09:00:00,1.0
2011-01-01 10:00:00,1.0
2011-01-01 11:00:00,1.0
2011-01-01 12:00:00,1.0
2011-01-01 13:00:00,1.0
2011-01-01 14:00:00,1.0
2011-01-01 15:00:00,1.0
2011-01-01 16:00:00,1.0
2011-01-01 17:00:00,1.0
2011-01-01 18:00:00,1.0
2011-01-01 19:00:00,1.0
2011-01-01 20:00:00,1.0
2011-01-01 21:00:00,1.0
2011-01-01 22:00:00,1.0