{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Reactive Power Optimization with PandaModels.jl\n",
"\n",
"This tutorial describes how to solve some optimization problems regarding reactive power redispatch using **PandaModels**. The reactive power provision of generators, e.g., net.sgen, can be optimized for \n",
"\n",
"1) maintaining voltage setpoints \n",
"2) maintaining reactive power setpoints \n",
"3) (active) power loss reduction \\\n",
"4) branch loading reduction\n",
"\n",
"\n",
"For more details on the corresponding models, see:\n",
"* [maintaining voltage setpoints](https://github.com/e2nIEE/PandaModels.jl/blob/develop/src/models/vstab.jl)\n",
"* [maintaining reactive power setpoints](https://github.com/e2nIEE/PandaModels.jl/blob/develop/src/models/qflex.jl)\n",
"* [power loss reduction](https://github.com/e2nIEE/PandaModels.jl/blob/develop/src/models/ploss.jl)\n",
"* [branch loading reduction](https://github.com/e2nIEE/PandaModels.jl/blob/develop/src/models/loading.jl)\n",
"\n",
"**Note**:\n",
"\n",
"- **PandaModels** is still in the development stage, and the developed models for reactive power optimizations are tested with limited grids. It is possible that errors may arise when facing different grids.\n",
"- It is suggested to use **net.sn_mva=1.0** to start the optimization. Using other sn_mva values may introduce not converged OPF \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1) Maintaining Voltage Setpoints\n",
"\n",
"Grid operators want to maintain a constant voltage profile across all or a part of the system buses. Reactive power optimization, in this case, helps them identify the preferable provision of reactive power from generators. The objective is to minimize the deviation of the voltages of certain buses (here, buses of DER) from a setpoint, e.g.,$V_{\\rm setpoint}\n",
"= 1.03 p.u.$ As a result, the reactive power setpoint for each generator is calculated. The mathematical formulation of this objective function can have the following forms:\n",
"\n",
"\\begin{align}\n",
"& \\underset{\\mathcal{X} = [q, ...]}{\\text{minimize}}\n",
"& & \\sum_{i\\in \\mathcal{BI}} (V_i-V_{\\rm setpoint})^2 \\\\\n",
"& \\text{subject to}\n",
"& & g(\\mathcal{X})=0 \\\\\n",
"& & & h(\\mathcal{X}) \\leq 0\n",
"\\end{align}\n",
"\n",
"where $V_{i}$ is the voltage variable of bus $i$ in $\\mathcal{BI}$ which denotes the set of buses of DER. The $g(\\mathcal{X})$ and $h(\\mathcal{X})$, denote equality and inequality constraints, respectively. The $\\mathcal{X}$ denotes the set of variables decisions, such as reactive power $q$."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1-1: Create test grid\n",
"\n",
"How does it work? Let's first create a cigre grid with DERs(distribution energy resource) from the pandapower's network database. After running the power flow calculation, we can see that there are nine DERs (net.sgen) in the grid, and they don't provide reactive power for normal operation."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
p_mw
\n",
"
q_mvar
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0.02
\n",
"
0.0
\n",
"
\n",
"
\n",
"
1
\n",
"
0.02
\n",
"
0.0
\n",
"
\n",
"
\n",
"
2
\n",
"
0.03
\n",
"
0.0
\n",
"
\n",
"
\n",
"
3
\n",
"
0.03
\n",
"
0.0
\n",
"
\n",
"
\n",
"
4
\n",
"
0.03
\n",
"
0.0
\n",
"
\n",
"
\n",
"
5
\n",
"
0.03
\n",
"
0.0
\n",
"
\n",
"
\n",
"
6
\n",
"
0.04
\n",
"
0.0
\n",
"
\n",
"
\n",
"
7
\n",
"
0.01
\n",
"
0.0
\n",
"
\n",
"
\n",
"
8
\n",
"
1.50
\n",
"
0.0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" p_mw q_mvar\n",
"0 0.02 0.0\n",
"1 0.02 0.0\n",
"2 0.03 0.0\n",
"3 0.03 0.0\n",
"4 0.03 0.0\n",
"5 0.03 0.0\n",
"6 0.04 0.0\n",
"7 0.01 0.0\n",
"8 1.50 0.0"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandapower as pp\n",
"import pandapower.networks as nw\n",
"from copy import deepcopy\n",
"\n",
"net = nw.create_cigre_network_mv(with_der=\"pv_wind\")\n",
"pp.runpp(net) # run power flow calculation\n",
"net_org = deepcopy(net) # copy of the grid for further comparison\n",
"display(net.res_sgen) # show power flow results for DER"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(You can use the pandapower plotting module to visualize the grid model.)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"image/png": "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AwQ6ABTu7LPPzuc///kkycknn5wLLrggSW0ceU0wJcnFF1+8Nsj/7M/+bO3u+erVq5MkRx11VN761reKcupaE+vnn39+Hn300STJu9/97px11lnZZ599kiS77rprbrvttrV75rfccksOOuigJMlhhx2Wn/zkJ1m2bFkGBwfz0EMPZd68eZ35wwB0oYFOHwAAqK9areZrX/takmT69Ok54ogj1n5s3333Xe/at7/97dlpp52SJN/97nfzxBNPZMGCBWs/fuGFF+bYY48V59S111575eMf/3j+8i//cu37jj/++LV/B5PaN4zWfRG4/fbbb+3bTz/9dE499dQkycjISC699NI2nBqgdwh0ACjYM888s3a//NWvfnVmz5699mPr7p0nyeDgYF7/+tev/f1DDz203r7w9OnTW3xaesW0adPWvv3kk0/mgQceWPv7ww8/fL1rn3jiibVvT58+fb2Pr3s7ADZNoANAwdb9udMrVqzI7rvvvja0r7nmmvzXf/3XetcPDDz/n/YHH3wwP//5z5Mku+22WzbbbLM2nJhesGacPUkuu+yy9T5WqVTW+/26H997773X+/h//ud/tuiEAL1JoANAYYaHh7No0aKceuqp2XPPPde+/6c//WlGRkbytre9LUny1FNP5eMf//jaF48bHR3N9ddfv/b6Cy+8cO3bp5xySptOTy94wxvekDlz5iRJvvnNb673jZ/vfOc7a99evHhx/vZv/3bt70866aS1r5eQ1F4X4cADD8w//MM/rH3xOADq8yJxAFCA4eHh3HLLLbnyyivr/pzyJPnoRz+ao446Kq961asyOjqaJDnuuOPygQ98IHfeeWfe/va3J0m23nrrLF++PEkya9as3Hfffdlmm23a84ehJ3zqU5/Khz/84SS1kfc1PyFgjz32yK233pprrrkmH/vYx7JkyZIktdH3r33ta9ltt93W/t17oXV/zvoOO+zQnj8IQBcR6ADQIY1E+WabbZYFCxbkhhtuSFIbLz7nnHOy+eab5+yzz97kv2PKlCn51re+lde97nVNPz+9bXh4OEceeWSuu+66DT5WqVSy7kPIXXbZJV/+8pfzvve9L7/85S+TJPPnz8/g4GDuuOOOMT+/WAfYkEAHgDZqNMoPO+ywvPWtb81hhx2WLbbYIp/4xCfy13/912uvmTVrVnbffff88pe/XG9PfV3z5s3LJZdckoMPPrhVfxx63KpVq3LGGWfkwgsvTL2HjC9+8Yuz/fbb5xe/+MV67/vxj3+cl73sZfntb3+bhQsX5sorrxzz56wnYh1gDYEOAC020ShfV7Vazcc//vGcc845G/13zZgxI/vvv39OPPHEvPnNb87UqVOb+mehP91///350pe+lG9+85u5//77165XjOVlL3tZvv3tb2evvfba4GNiHWDjBDoAtEAzonwsP//5z3Peeefl8ssvz3PPPZek9srtb3rTm3Laaafl0EMP3eBVtqGZnnjiiVx44YX50pe+lAcffHDt+/fcc8+cdtppede73pUtt9xyk59HrANsSKADQJO0KsrH8uyzz2bJkiUZHR3N3LlzM3PmzMkeH8ZldHQ0S5YsyTPPPJOtttoqc+fOnfA3h8Q6QI1AB4BJaGeUQz8Q60A/E+gAME6iHNpDrAP9RqADQANEOXSWWAf6gUAHgDpEOZRJrAO9SqADwDpEOXSXO++8MwsXLszChQvFOtD1BDoAfU+UQ28Q60C3E+gA9CVRDr1NrAPdSKAD0DdEOfQnsQ50C4EOQE8bT5Qfc8wxOfzww0U59DCxDpRMoAPQc0Q50AixDpRGoAPQE0Q5MBliHSiBQAego37zm+RLX0puuSVZuTJ5yUuSd70rOfroZNq0jd9WlAOt0IpYv+ee2te6RYuSFSuSuXOT449Pjjsu2XzzZv8JgG4l0AHoiGefrYX4woXJ0FAyPFx7/8BAMjqabLNNctVVyUEHrX87UQ6002RjfdWq5D3vSb7ylWRwMBkZqb1/zde6mTOTyy5LDj+81X8SoBsIdADabvXq5LDDas8kjY6Ofc3AQO3B7KJFyX77iXKg88Yb6/Pm7ZBjj02uvrr+17pKpfbPt76V/Pmft/DwQFcQ6AC03Ze/nJxySrKp/wJVKtXMmPFEpk//oyxb9tgGHxflQKc0Euu77/6h3H3332zycw0MJFtvnTz8cDJ1arNPCnQTgQ5AW1Wryctfnvz2t5sO9Oe9LsmNSUQ5UJ76sf79JAckGWro81xxRXLssa04IdAtBDoAbXXPPcnuu4/nFqszOHhpjjzyW6IcKN6aWL/88u/lrrt+0PDtBgaSI46ojcMD/UugA9BWP/xhcsAB47lFNYcfPpJvfauxZ6AASvAf/5HMnz++2xx4YPLv/96a8wDdYaDTBwCgv8yYMb7rBwcrmTVLnAPdZbxf65Jkyy2bfw6guwh0ANpq/vxku+0av35kJPnTP23deQBaYYcdkp13rr1CeyMGBpJDD23tmYDyCXQA2mrKlNrPBB4cbOz6mTOT445r7ZkAmq1SSc48s/Hrh4aSd7+7decBuoNAB6DtzjwzmTu3sUj/9KeTzTdv/ZkAmu2EE5Jdd63F96Z87GPJi17U+jMBZRPoALTdttsmixYl229fe5bphSOgax7MfupTyWmntf98AM2w5ZbJTTclu+xS+zo38IJH3mu+1r3//cmHPtT+8wHlEegAdMRuuyW3356ce27tGaY1pk6t5vjjk5/9LPngBzt3PoBmeMlLkl/8Ivmnf0r22uv59w8NVfPWtya33pp89rON76oDvc2PWQOg46rV5J57HsmFF16cM854R1760rmdPhJAS9x77yO54IKLc/rp78jLXuZrHbA+z6AD0HGVSrLlltXMmPFspkzp9GkAWmfGjNrXuqlTO30SoEQCHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0AAAAKINABAACgAAIdAAAACiDQAQAAoAACHQAAAAog0AEAAKAAAh0A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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandapower.plotting as plot\n",
"%matplotlib inline\n",
"plot.simple_plot(net)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"### 1-2: Parametrization for optimization\n",
"Before starting the optimization, we need to configure some parameters. \n",
"In PandaModels, the uncontrollable loads and DER (net.sgen) are converted to load, and the controllable power elements are converted to generators. Accordingly, we neet to set loads as uncontrollable and set DER (net.sgen) as controllable elements. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"net_opt = deepcopy(net) # copy of the grid for further comparison \n",
"net_opt.load['controllable'] = False\n",
"net_opt.sgen['controllable'] = True"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"Now, let's set the constraints."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# lower and upper bounds for buses\n",
"net_opt.bus[\"max_vm_pu\"] = 1.1\n",
"net_opt.bus[\"min_vm_pu\"] = 0.9\n",
"\n",
"# lower and upper bounds for external grid\n",
"net_opt.ext_grid[\"max_q_mvar\"] = 10000.0\n",
"net_opt.ext_grid[\"min_q_mvar\"] = -10000.0\n",
"net_opt.ext_grid[\"max_p_mw\"] = 10000.0\n",
"net_opt.ext_grid[\"min_p_mw\"] = -10000.0"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"We keep the active power for DER constant to the calculated value from the power flow and define a constraint for the reactive power. (In this grid, there is no generator (net.gen))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
name
\n",
"
bus
\n",
"
p_mw
\n",
"
q_mvar
\n",
"
sn_mva
\n",
"
scaling
\n",
"
in_service
\n",
"
type
\n",
"
current_source
\n",
"
controllable
\n",
"
max_p_mw
\n",
"
min_p_mw
\n",
"
max_q_mvar
\n",
"
min_q_mvar
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
PV 3
\n",
"
3
\n",
"
0.02
\n",
"
0.0
\n",
"
0.02
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.02
\n",
"
0.02
\n",
"
0.00656
\n",
"
-0.00656
\n",
"
\n",
"
\n",
"
1
\n",
"
PV 4
\n",
"
4
\n",
"
0.02
\n",
"
0.0
\n",
"
0.02
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.02
\n",
"
0.02
\n",
"
0.00656
\n",
"
-0.00656
\n",
"
\n",
"
\n",
"
2
\n",
"
PV 5
\n",
"
5
\n",
"
0.03
\n",
"
0.0
\n",
"
0.03
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.03
\n",
"
0.03
\n",
"
0.00984
\n",
"
-0.00984
\n",
"
\n",
"
\n",
"
3
\n",
"
PV 6
\n",
"
6
\n",
"
0.03
\n",
"
0.0
\n",
"
0.03
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.03
\n",
"
0.03
\n",
"
0.00984
\n",
"
-0.00984
\n",
"
\n",
"
\n",
"
4
\n",
"
PV 8
\n",
"
8
\n",
"
0.03
\n",
"
0.0
\n",
"
0.03
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.03
\n",
"
0.03
\n",
"
0.00984
\n",
"
-0.00984
\n",
"
\n",
"
\n",
"
5
\n",
"
PV 9
\n",
"
9
\n",
"
0.03
\n",
"
0.0
\n",
"
0.03
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.03
\n",
"
0.03
\n",
"
0.00984
\n",
"
-0.00984
\n",
"
\n",
"
\n",
"
6
\n",
"
PV 10
\n",
"
10
\n",
"
0.04
\n",
"
0.0
\n",
"
0.04
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.04
\n",
"
0.04
\n",
"
0.01312
\n",
"
-0.01312
\n",
"
\n",
"
\n",
"
7
\n",
"
PV 11
\n",
"
11
\n",
"
0.01
\n",
"
0.0
\n",
"
0.01
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.01
\n",
"
0.01
\n",
"
0.00328
\n",
"
-0.00328
\n",
"
\n",
"
\n",
"
8
\n",
"
WKA 7
\n",
"
7
\n",
"
1.50
\n",
"
0.0
\n",
"
1.50
\n",
"
1.0
\n",
"
True
\n",
"
WP
\n",
"
True
\n",
"
True
\n",
"
1.50
\n",
"
1.50
\n",
"
0.49200
\n",
"
-0.49200
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name bus p_mw q_mvar sn_mva scaling in_service type current_source \\\n",
"0 PV 3 3 0.02 0.0 0.02 1.0 True PV True \n",
"1 PV 4 4 0.02 0.0 0.02 1.0 True PV True \n",
"2 PV 5 5 0.03 0.0 0.03 1.0 True PV True \n",
"3 PV 6 6 0.03 0.0 0.03 1.0 True PV True \n",
"4 PV 8 8 0.03 0.0 0.03 1.0 True PV True \n",
"5 PV 9 9 0.03 0.0 0.03 1.0 True PV True \n",
"6 PV 10 10 0.04 0.0 0.04 1.0 True PV True \n",
"7 PV 11 11 0.01 0.0 0.01 1.0 True PV True \n",
"8 WKA 7 7 1.50 0.0 1.50 1.0 True WP True \n",
"\n",
" controllable max_p_mw min_p_mw max_q_mvar min_q_mvar \n",
"0 True 0.02 0.02 0.00656 -0.00656 \n",
"1 True 0.02 0.02 0.00656 -0.00656 \n",
"2 True 0.03 0.03 0.00984 -0.00984 \n",
"3 True 0.03 0.03 0.00984 -0.00984 \n",
"4 True 0.03 0.03 0.00984 -0.00984 \n",
"5 True 0.03 0.03 0.00984 -0.00984 \n",
"6 True 0.04 0.04 0.01312 -0.01312 \n",
"7 True 0.01 0.01 0.00328 -0.00328 \n",
"8 True 1.50 1.50 0.49200 -0.49200 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# lower and upper bounds for DERs\n",
"net_opt.sgen[\"max_p_mw\"] = net_opt.sgen.p_mw.values\n",
"net_opt.sgen[\"min_p_mw\"] = net_opt.sgen.p_mw.values\n",
"net_opt.sgen[\"max_q_mvar\"] = net_opt.sgen.p_mw.values * 0.328\n",
"net_opt.sgen[\"min_q_mvar\"] = -net_opt.sgen.p_mw.values * 0.328\n",
"display(net_opt.sgen)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"Subsequently, let's set a high upper bound for lines and transformers to avoid congestion issues."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# lower and upper bounds for lines\n",
"net_opt.trafo[\"max_loading_percent\"] = 100.0\n",
"net_opt.line[\"max_loading_percent\"] = 100.0"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"Finally, we need to let PandaModels know which buses are of interest and what is user-defined voltage setpoint. To do this, we can add extra column called **\"pm_param/setpoint_v\"** in net.bus and set values for buses connecting DER (net.sgen)."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"net_opt.bus[\"pm_param/setpoint_v\"] = None # add extra column\n",
"net_opt.bus[\"pm_param/setpoint_v\"].loc[net_opt.sgen.bus] = 0.96 # voltage setpoints for theses buses are 0.96"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1-3: Start optimization\n",
"Now let's call the function ***pandapower.runpm_vstab()*** to start the optimizaiton for maintaining voltage setpoints. \n",
"(Note that the first time the function is called, Julia is started in the background, which may take some time.)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 2.29 seconds:\n"
]
}
],
"source": [
"try:\n",
" pp.runpm_vstab(net_opt)\n",
"except Exception as err:\n",
" print(err) "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"Also, the following parameters and options can be modified as inputs while calling the optimization from PandaModles. For this case, we can keep the default values.\n",
"\n",
"| parameter | description | type | default |\n",
"| :--- | :--- | :---: | :--- |\n",
"| correct_pm_network_data | checks if network data is correct. If not tries to correct it | bool | True |\n",
"| silence | Suppresses information and warning messages output by PowerModels | bool | True |\n",
"| pm_model | PowerModels.jl model to use | str | \"ACPPowerModel\" |\n",
"| pm_solver | \"main\" solver| str | \"ipopt\" |\n",
"| pm_mip_solver | mixed integer solver| str | \"cbc\" |\n",
"| pm_nl_solver | nonlinear solver| str | \"ipopt\" |\n",
"| pm_tol | default desired convergence tolerance for solver to use | float | 1e-8 |\n",
"| pm_log_level | solver log level in power models | int | 0 |\n",
"| delete_buffer_file | If True, the .json file used by PandaModels will be deleted after optimization. | bool | True |\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1-4: Results comparison\n",
"Let's check the results for voltage and reactive power at buses connecting DER before and after the optimization."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"3 0.951848\n",
"4 0.950094\n",
"5 0.948893\n",
"6 0.947488\n",
"8 0.949187\n",
"9 0.948264\n",
"10 0.947100\n",
"11 0.946916\n",
"7 0.952199\n",
"Name: vm_pu, dtype: float64"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- deviation from setpionts v=0.96 ---\n"
]
},
{
"data": {
"text/plain": [
"0.0010976683852842502"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# results from power flow\n",
"display(net_org.res_bus.vm_pu[net_org.sgen.bus])\n",
"v_org = net_org.res_bus.vm_pu[net_org.sgen.bus].values\n",
"print(\"--- deviation from setpionts v=0.96 ---\")\n",
"display(sum((v_org-0.96)**2)) "
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3 0.961792\n",
"4 0.960087\n",
"5 0.958920\n",
"6 0.957559\n",
"8 0.960321\n",
"9 0.959425\n",
"10 0.958299\n",
"11 0.958119\n",
"7 0.964668\n",
"Name: vm_pu, dtype: float64"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- deviation from setpionts v=0.96 ---\n"
]
},
{
"data": {
"text/plain": [
"3.900054027594424e-05"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# results from optimization\n",
"display(net_opt.res_bus.vm_pu[net.sgen.bus])\n",
"v_opt = net_opt.res_bus.vm_pu[net_opt.sgen.bus].values\n",
"print(\"--- deviation from setpionts v=0.96 ---\")\n",
"display(sum((v_opt-0.96)**2)) # devition from setpoints v=0.96 p.u."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As exected, the bus voltages after optimization are close to the defined setpoints. It is caused by the provision of reactive power of DER."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" p_mw q_mvar\n",
"0 0.02 0.006559\n",
"1 0.02 0.006559\n",
"2 0.03 0.009839\n",
"3 0.03 0.009839\n",
"4 0.03 0.009839\n",
"5 0.03 0.009839\n",
"6 0.04 0.013119\n",
"7 0.01 0.003279\n",
"8 1.50 0.127064"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- deviation from setpoints without limitation Cv = 1.0, Cq = 0. ----\n"
]
},
{
"data": {
"text/plain": [
"3.900054027594424e-05"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- deviation from setpoints with limitation Cv = 0.99, Cq = 0.01 ----\n"
]
},
{
"data": {
"text/plain": [
"0.00043781176800306845"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"print (\"--- optimized reactive power without limitation Cv = 1.0, Cq = 0. ----\")\n",
"display(net_opt.res_sgen) # show optimized reactive power without limitation\n",
"print (\"--- optimized reactive power with limitation Cv = 0.99, Cq = 0.01 ----\")\n",
"display(net_optlim.res_sgen) # show optimized reactive power with limitation\n",
"\n",
"print (\"--- deviation from setpoints without limitation Cv = 1.0, Cq = 0. ----\")\n",
"display(sum((v_opt - 0.96) ** 2)) # show optimized reactive power without limitation\n",
"print (\"--- deviation from setpoints with limitation Cv = 0.99, Cq = 0.01 ----\")\n",
"v_optlim = net_optlim.res_bus.vm_pu[net_optlim.sgen.bus].values\n",
"display(sum((v_optlim - 0.96) ** 2)) # show optimized bus voltages"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The coefficient combination is grid-dependent. For example, the picture below shows the result for one of our case studies with a realistic grid. The user can find the most suitable combination setting through several attempts.\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1-6: Time series optimizations\n",
"There are two ways to perform time series optimizations. \n",
"The first one is optimization in a loop, i.e., updating the grid condition for each time step and repeatedly calling optimization. The second one uses the \"multi-timestep\" optimization. PowerModels can solve the multi-grid optimization problem. This feature is used in PandaModels to deal with time series optimization for on specific grid by replacing the \"multi-grid\" with \"multi-timestep\" of the grid. \n",
"\n",
"Next, you will see an example."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's load the time series data."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
timestep
\n",
"
pv
\n",
"
wind
\n",
"
residential
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0
\n",
"
0.006143
\n",
"
0.622600
\n",
"
0.256022
\n",
"
\n",
"
\n",
"
1
\n",
"
1
\n",
"
0.005877
\n",
"
0.623585
\n",
"
0.248835
\n",
"
\n",
"
\n",
"
2
\n",
"
2
\n",
"
0.005505
\n",
"
0.625056
\n",
"
0.211973
\n",
"
\n",
"
\n",
"
3
\n",
"
3
\n",
"
0.005293
\n",
"
0.625897
\n",
"
0.201825
\n",
"
\n",
"
\n",
"
4
\n",
"
4
\n",
"
0.004921
\n",
"
0.627369
\n",
"
0.209164
\n",
"
\n",
"
\n",
"
5
\n",
"
5
\n",
"
0.004619
\n",
"
0.645138
\n",
"
0.198600
\n",
"
\n",
"
\n",
"
6
\n",
"
6
\n",
"
0.004286
\n",
"
0.685128
\n",
"
0.189050
\n",
"
\n",
"
\n",
"
7
\n",
"
7
\n",
"
0.003929
\n",
"
0.713267
\n",
"
0.186924
\n",
"
\n",
"
\n",
"
8
\n",
"
8
\n",
"
0.003674
\n",
"
0.719497
\n",
"
0.187007
\n",
"
\n",
"
\n",
"
9
\n",
"
9
\n",
"
0.003392
\n",
"
0.686113
\n",
"
0.183658
\n",
"
\n",
"
\n",
"
10
\n",
"
10
\n",
"
0.003029
\n",
"
0.650800
\n",
"
0.181048
\n",
"
\n",
"
\n",
"
11
\n",
"
11
\n",
"
0.002747
\n",
"
0.630733
\n",
"
0.185567
\n",
"
\n",
"
\n",
"
12
\n",
"
12
\n",
"
0.002571
\n",
"
0.639400
\n",
"
0.182282
\n",
"
\n",
"
\n",
"
13
\n",
"
13
\n",
"
0.002286
\n",
"
0.682600
\n",
"
0.192295
\n",
"
\n",
"
\n",
"
14
\n",
"
14
\n",
"
0.001995
\n",
"
0.728373
\n",
"
0.199360
\n",
"
\n",
"
\n",
"
15
\n",
"
15
\n",
"
0.001733
\n",
"
0.777240
\n",
"
0.182287
\n",
"
\n",
"
\n",
"
16
\n",
"
16
\n",
"
0.001491
\n",
"
0.807959
\n",
"
0.186546
\n",
"
\n",
"
\n",
"
17
\n",
"
17
\n",
"
0.001260
\n",
"
0.749338
\n",
"
0.192088
\n",
"
\n",
"
\n",
"
18
\n",
"
18
\n",
"
0.001056
\n",
"
0.699656
\n",
"
0.203122
\n",
"
\n",
"
\n",
"
19
\n",
"
19
\n",
"
0.000857
\n",
"
0.660600
\n",
"
0.228030
\n",
"
\n",
"
\n",
"
20
\n",
"
20
\n",
"
0.000698
\n",
"
0.629356
\n",
"
0.244633
\n",
"
\n",
"
\n",
"
21
\n",
"
21
\n",
"
0.000531
\n",
"
0.597195
\n",
"
0.240875
\n",
"
\n",
"
\n",
"
22
\n",
"
22
\n",
"
0.000355
\n",
"
0.564118
\n",
"
0.262490
\n",
"
\n",
"
\n",
"
23
\n",
"
23
\n",
"
0.000222
\n",
"
0.540456
\n",
"
0.331813
\n",
"
\n",
"
\n",
"
24
\n",
"
24
\n",
"
0.000132
\n",
"
0.535359
\n",
"
0.436350
\n",
"
\n",
"
\n",
"
25
\n",
"
25
\n",
"
0.000066
\n",
"
0.553113
\n",
"
0.501545
\n",
"
\n",
"
\n",
"
26
\n",
"
26
\n",
"
0.000011
\n",
"
0.567908
\n",
"
0.526120
\n",
"
\n",
"
\n",
"
27
\n",
"
27
\n",
"
0.000000
\n",
"
0.586867
\n",
"
0.537150
\n",
"
\n",
"
\n",
"
28
\n",
"
28
\n",
"
0.000061
\n",
"
0.607229
\n",
"
0.614585
\n",
"
\n",
"
\n",
"
29
\n",
"
29
\n",
"
0.000245
\n",
"
0.588314
\n",
"
0.631053
\n",
"
\n",
"
\n",
"
30
\n",
"
30
\n",
"
0.000367
\n",
"
0.575705
\n",
"
0.608927
\n",
"
\n",
"
\n",
"
31
\n",
"
31
\n",
"
0.000653
\n",
"
0.552257
\n",
"
0.607860
\n",
"
\n",
"
\n",
"
32
\n",
"
32
\n",
"
0.001034
\n",
"
0.531790
\n",
"
0.624715
\n",
"
\n",
"
\n",
"
33
\n",
"
33
\n",
"
0.001706
\n",
"
0.551367
\n",
"
0.670312
\n",
"
\n",
"
\n",
"
34
\n",
"
34
\n",
"
0.002437
\n",
"
0.572300
\n",
"
0.690940
\n",
"
\n",
"
\n",
"
35
\n",
"
35
\n",
"
0.022095
\n",
"
0.603033
\n",
"
0.640480
\n",
"
\n",
"
\n",
"
36
\n",
"
36
\n",
"
0.053810
\n",
"
0.620800
\n",
"
0.639200
\n",
"
\n",
"
\n",
"
37
\n",
"
37
\n",
"
0.123429
\n",
"
0.630467
\n",
"
0.636695
\n",
"
\n",
"
\n",
"
38
\n",
"
38
\n",
"
0.146629
\n",
"
0.637587
\n",
"
0.652735
\n",
"
\n",
"
\n",
"
39
\n",
"
39
\n",
"
0.319167
\n",
"
0.645700
\n",
"
0.656870
\n",
"
\n",
"
\n",
"
40
\n",
"
40
\n",
"
0.430714
\n",
"
0.627600
\n",
"
0.678112
\n",
"
\n",
"
\n",
"
41
\n",
"
41
\n",
"
0.531333
\n",
"
0.591889
\n",
"
0.648757
\n",
"
\n",
"
\n",
"
42
\n",
"
42
\n",
"
0.588714
\n",
"
0.565567
\n",
"
0.611575
\n",
"
\n",
"
\n",
"
43
\n",
"
43
\n",
"
0.653937
\n",
"
0.533422
\n",
"
0.629150
\n",
"
\n",
"
\n",
"
44
\n",
"
44
\n",
"
0.589571
\n",
"
0.533267
\n",
"
0.604570
\n",
"
\n",
"
\n",
"
45
\n",
"
45
\n",
"
0.569302
\n",
"
0.589044
\n",
"
0.614053
\n",
"
\n",
"
\n",
"
46
\n",
"
46
\n",
"
0.423933
\n",
"
0.784267
\n",
"
0.702965
\n",
"
\n",
"
\n",
"
47
\n",
"
47
\n",
"
0.311917
\n",
"
0.923333
\n",
"
0.726462
\n",
"
\n",
"
\n",
"
48
\n",
"
48
\n",
"
0.335000
\n",
"
1.005217
\n",
"
0.727100
\n",
"
\n",
"
\n",
"
49
\n",
"
49
\n",
"
0.442314
\n",
"
1.011813
\n",
"
0.730600
\n",
"
\n",
"
\n",
"
50
\n",
"
50
\n",
"
0.468524
\n",
"
0.979733
\n",
"
0.718670
\n",
"
\n",
"
\n",
"
51
\n",
"
51
\n",
"
0.483262
\n",
"
0.941833
\n",
"
0.694337
\n",
"
\n",
"
\n",
"
52
\n",
"
52
\n",
"
0.454295
\n",
"
0.901480
\n",
"
0.650027
\n",
"
\n",
"
\n",
"
53
\n",
"
53
\n",
"
0.438943
\n",
"
0.878333
\n",
"
0.632864
\n",
"
\n",
"
\n",
"
54
\n",
"
54
\n",
"
0.242460
\n",
"
0.838356
\n",
"
0.570937
\n",
"
\n",
"
\n",
"
55
\n",
"
55
\n",
"
0.148248
\n",
"
0.816720
\n",
"
0.564928
\n",
"
\n",
"
\n",
"
56
\n",
"
56
\n",
"
0.180262
\n",
"
0.797300
\n",
"
0.565415
\n",
"
\n",
"
\n",
"
57
\n",
"
57
\n",
"
0.139762
\n",
"
0.788044
\n",
"
0.523873
\n",
"
\n",
"
\n",
"
58
\n",
"
58
\n",
"
0.108638
\n",
"
0.788400
\n",
"
0.492570
\n",
"
\n",
"
\n",
"
59
\n",
"
59
\n",
"
0.106751
\n",
"
0.793954
\n",
"
0.493360
\n",
"
\n",
"
\n",
"
60
\n",
"
60
\n",
"
0.109315
\n",
"
0.802856
\n",
"
0.494898
\n",
"
\n",
"
\n",
"
61
\n",
"
61
\n",
"
0.092679
\n",
"
0.808650
\n",
"
0.481850
\n",
"
\n",
"
\n",
"
62
\n",
"
62
\n",
"
0.056399
\n",
"
0.812608
\n",
"
0.463050
\n",
"
\n",
"
\n",
"
63
\n",
"
63
\n",
"
0.035314
\n",
"
0.812680
\n",
"
0.449260
\n",
"
\n",
"
\n",
"
64
\n",
"
64
\n",
"
0.025476
\n",
"
0.809433
\n",
"
0.458250
\n",
"
\n",
"
\n",
"
65
\n",
"
65
\n",
"
0.023270
\n",
"
0.750000
\n",
"
0.508357
\n",
"
\n",
"
\n",
"
66
\n",
"
66
\n",
"
0.022214
\n",
"
0.707667
\n",
"
0.517530
\n",
"
\n",
"
\n",
"
67
\n",
"
67
\n",
"
0.021159
\n",
"
0.652778
\n",
"
0.574923
\n",
"
\n",
"
\n",
"
68
\n",
"
68
\n",
"
0.020365
\n",
"
0.611889
\n",
"
0.631390
\n",
"
\n",
"
\n",
"
69
\n",
"
69
\n",
"
0.019571
\n",
"
0.571000
\n",
"
0.695165
\n",
"
\n",
"
\n",
"
70
\n",
"
70
\n",
"
0.018976
\n",
"
0.540333
\n",
"
0.723720
\n",
"
\n",
"
\n",
"
71
\n",
"
71
\n",
"
0.017587
\n",
"
0.468778
\n",
"
0.776485
\n",
"
\n",
"
\n",
"
72
\n",
"
72
\n",
"
0.016833
\n",
"
0.488950
\n",
"
0.812940
\n",
"
\n",
"
\n",
"
73
\n",
"
73
\n",
"
0.016238
\n",
"
0.556644
\n",
"
0.859579
\n",
"
\n",
"
\n",
"
74
\n",
"
74
\n",
"
0.015452
\n",
"
0.661067
\n",
"
0.868860
\n",
"
\n",
"
\n",
"
75
\n",
"
75
\n",
"
0.014833
\n",
"
0.761600
\n",
"
0.902426
\n",
"
\n",
"
\n",
"
76
\n",
"
76
\n",
"
0.014184
\n",
"
0.754000
\n",
"
0.914777
\n",
"
\n",
"
\n",
"
77
\n",
"
77
\n",
"
0.013844
\n",
"
0.696133
\n",
"
0.904512
\n",
"
\n",
"
\n",
"
78
\n",
"
78
\n",
"
0.013103
\n",
"
0.582000
\n",
"
0.884404
\n",
"
\n",
"
\n",
"
79
\n",
"
79
\n",
"
0.012528
\n",
"
0.513667
\n",
"
0.829733
\n",
"
\n",
"
\n",
"
80
\n",
"
80
\n",
"
0.011836
\n",
"
0.463541
\n",
"
0.820933
\n",
"
\n",
"
\n",
"
81
\n",
"
81
\n",
"
0.011370
\n",
"
0.536370
\n",
"
0.795723
\n",
"
\n",
"
\n",
"
82
\n",
"
82
\n",
"
0.010671
\n",
"
0.647515
\n",
"
0.738732
\n",
"
\n",
"
\n",
"
83
\n",
"
83
\n",
"
0.010087
\n",
"
0.743303
\n",
"
0.700090
\n",
"
\n",
"
\n",
"
84
\n",
"
84
\n",
"
0.009736
\n",
"
0.800776
\n",
"
0.689043
\n",
"
\n",
"
\n",
"
85
\n",
"
85
\n",
"
0.009086
\n",
"
0.850387
\n",
"
0.677730
\n",
"
\n",
"
\n",
"
86
\n",
"
86
\n",
"
0.008686
\n",
"
0.873227
\n",
"
0.646210
\n",
"
\n",
"
\n",
"
87
\n",
"
87
\n",
"
0.008152
\n",
"
0.903680
\n",
"
0.613804
\n",
"
\n",
"
\n",
"
88
\n",
"
88
\n",
"
0.007345
\n",
"
0.932173
\n",
"
0.540327
\n",
"
\n",
"
\n",
"
89
\n",
"
89
\n",
"
0.006796
\n",
"
0.928251
\n",
"
0.499037
\n",
"
\n",
"
\n",
"
90
\n",
"
90
\n",
"
0.006384
\n",
"
0.925310
\n",
"
0.469209
\n",
"
\n",
"
\n",
"
91
\n",
"
91
\n",
"
0.005835
\n",
"
0.921388
\n",
"
0.435660
\n",
"
\n",
"
\n",
"
92
\n",
"
92
\n",
"
0.005423
\n",
"
0.918447
\n",
"
0.410870
\n",
"
\n",
"
\n",
"
93
\n",
"
93
\n",
"
0.004704
\n",
"
0.886837
\n",
"
0.344715
\n",
"
\n",
"
\n",
"
94
\n",
"
94
\n",
"
0.004143
\n",
"
0.858339
\n",
"
0.304026
\n",
"
\n",
"
\n",
"
95
\n",
"
95
\n",
"
0.003667
\n",
"
0.838370
\n",
"
0.286328
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" timestep pv wind residential\n",
"0 0 0.006143 0.622600 0.256022\n",
"1 1 0.005877 0.623585 0.248835\n",
"2 2 0.005505 0.625056 0.211973\n",
"3 3 0.005293 0.625897 0.201825\n",
"4 4 0.004921 0.627369 0.209164\n",
"5 5 0.004619 0.645138 0.198600\n",
"6 6 0.004286 0.685128 0.189050\n",
"7 7 0.003929 0.713267 0.186924\n",
"8 8 0.003674 0.719497 0.187007\n",
"9 9 0.003392 0.686113 0.183658\n",
"10 10 0.003029 0.650800 0.181048\n",
"11 11 0.002747 0.630733 0.185567\n",
"12 12 0.002571 0.639400 0.182282\n",
"13 13 0.002286 0.682600 0.192295\n",
"14 14 0.001995 0.728373 0.199360\n",
"15 15 0.001733 0.777240 0.182287\n",
"16 16 0.001491 0.807959 0.186546\n",
"17 17 0.001260 0.749338 0.192088\n",
"18 18 0.001056 0.699656 0.203122\n",
"19 19 0.000857 0.660600 0.228030\n",
"20 20 0.000698 0.629356 0.244633\n",
"21 21 0.000531 0.597195 0.240875\n",
"22 22 0.000355 0.564118 0.262490\n",
"23 23 0.000222 0.540456 0.331813\n",
"24 24 0.000132 0.535359 0.436350\n",
"25 25 0.000066 0.553113 0.501545\n",
"26 26 0.000011 0.567908 0.526120\n",
"27 27 0.000000 0.586867 0.537150\n",
"28 28 0.000061 0.607229 0.614585\n",
"29 29 0.000245 0.588314 0.631053\n",
"30 30 0.000367 0.575705 0.608927\n",
"31 31 0.000653 0.552257 0.607860\n",
"32 32 0.001034 0.531790 0.624715\n",
"33 33 0.001706 0.551367 0.670312\n",
"34 34 0.002437 0.572300 0.690940\n",
"35 35 0.022095 0.603033 0.640480\n",
"36 36 0.053810 0.620800 0.639200\n",
"37 37 0.123429 0.630467 0.636695\n",
"38 38 0.146629 0.637587 0.652735\n",
"39 39 0.319167 0.645700 0.656870\n",
"40 40 0.430714 0.627600 0.678112\n",
"41 41 0.531333 0.591889 0.648757\n",
"42 42 0.588714 0.565567 0.611575\n",
"43 43 0.653937 0.533422 0.629150\n",
"44 44 0.589571 0.533267 0.604570\n",
"45 45 0.569302 0.589044 0.614053\n",
"46 46 0.423933 0.784267 0.702965\n",
"47 47 0.311917 0.923333 0.726462\n",
"48 48 0.335000 1.005217 0.727100\n",
"49 49 0.442314 1.011813 0.730600\n",
"50 50 0.468524 0.979733 0.718670\n",
"51 51 0.483262 0.941833 0.694337\n",
"52 52 0.454295 0.901480 0.650027\n",
"53 53 0.438943 0.878333 0.632864\n",
"54 54 0.242460 0.838356 0.570937\n",
"55 55 0.148248 0.816720 0.564928\n",
"56 56 0.180262 0.797300 0.565415\n",
"57 57 0.139762 0.788044 0.523873\n",
"58 58 0.108638 0.788400 0.492570\n",
"59 59 0.106751 0.793954 0.493360\n",
"60 60 0.109315 0.802856 0.494898\n",
"61 61 0.092679 0.808650 0.481850\n",
"62 62 0.056399 0.812608 0.463050\n",
"63 63 0.035314 0.812680 0.449260\n",
"64 64 0.025476 0.809433 0.458250\n",
"65 65 0.023270 0.750000 0.508357\n",
"66 66 0.022214 0.707667 0.517530\n",
"67 67 0.021159 0.652778 0.574923\n",
"68 68 0.020365 0.611889 0.631390\n",
"69 69 0.019571 0.571000 0.695165\n",
"70 70 0.018976 0.540333 0.723720\n",
"71 71 0.017587 0.468778 0.776485\n",
"72 72 0.016833 0.488950 0.812940\n",
"73 73 0.016238 0.556644 0.859579\n",
"74 74 0.015452 0.661067 0.868860\n",
"75 75 0.014833 0.761600 0.902426\n",
"76 76 0.014184 0.754000 0.914777\n",
"77 77 0.013844 0.696133 0.904512\n",
"78 78 0.013103 0.582000 0.884404\n",
"79 79 0.012528 0.513667 0.829733\n",
"80 80 0.011836 0.463541 0.820933\n",
"81 81 0.011370 0.536370 0.795723\n",
"82 82 0.010671 0.647515 0.738732\n",
"83 83 0.010087 0.743303 0.700090\n",
"84 84 0.009736 0.800776 0.689043\n",
"85 85 0.009086 0.850387 0.677730\n",
"86 86 0.008686 0.873227 0.646210\n",
"87 87 0.008152 0.903680 0.613804\n",
"88 88 0.007345 0.932173 0.540327\n",
"89 89 0.006796 0.928251 0.499037\n",
"90 90 0.006384 0.925310 0.469209\n",
"91 91 0.005835 0.921388 0.435660\n",
"92 92 0.005423 0.918447 0.410870\n",
"93 93 0.004704 0.886837 0.344715\n",
"94 94 0.004143 0.858339 0.304026\n",
"95 95 0.003667 0.838370 0.286328"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"\n",
"# load time series data for 96 time steps\n",
"time_series = pd.read_json(\"cigre_timeseries_15min.json\")\n",
"time_series.sort_index(inplace=True)\n",
"\n",
"# show time series\n",
"display(time_series) \n",
"\n",
"# set load type and sgen type in the cigre grid\n",
"net[\"load\"].loc[:, \"type\"] = \"residential\"\n",
"net.sgen.loc[:, \"type\"] = \"pv\"\n",
"net.sgen.loc[8, \"type\"] = \"wind\"\n",
"\n",
"# get rated power\n",
"load_p = net[\"load\"].loc[:, \"p_mw\"].values\n",
"sgen_p = net[\"sgen\"].loc[:7, \"p_mw\"].values\n",
"wind_p = net[\"sgen\"].loc[8, \"p_mw\"]\n",
"\n",
"# create dataframe for loads and sgens\n",
"load_ts = pd.DataFrame(index=time_series.index.tolist(), columns=net.load.index.tolist())\n",
"sgen_ts = pd.DataFrame(index=time_series.index.tolist(), columns=net.sgen.index.tolist())\n",
"for t in range(96):\n",
" load_ts.loc[t] = load_p * time_series.at[t, \"residential\"]\n",
" sgen_ts.loc[t][:8] = sgen_p * time_series.at[t, \"pv\"]\n",
" sgen_ts.loc[t][8] = wind_p * time_series.at[t, \"wind\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, we perform the time series optimizations in a loop."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.02 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.02 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.02 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.06 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.06 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.06 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.06 seconds:\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.05 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.04 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.02 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_vstab') is finished in 0.03 seconds:\n"
]
}
],
"source": [
"########################################################################\n",
"####################### Optimization in a loop #########################\n",
"########################################################################\n",
"\n",
"y_loop = []\n",
"for t in range(96):\n",
" \n",
" # Update operating points for each time step\n",
" net_opt.load.p_mw = load_ts.loc[t]\n",
" net_opt.sgen.p_mw = sgen_ts.loc[t]\n",
" \n",
" # If required, we also need to update the constraints, e.g., Qmax- and Qmin-value, for each time step. \n",
" net_opt.sgen.max_p_mw = sgen_ts.loc[t] # for load: max_p_mw == min_p_mw, because they are not controllable.\n",
" net_opt.sgen.min_p_mw = sgen_ts.loc[t]\n",
" net_opt.sgen.max_q_mvar = net_opt.sgen.max_q_mvar\n",
" net_opt.sgen.min_q_mvar = net_opt.sgen.min_q_mvar\n",
" \n",
" # run optimization for time step t\n",
" try:\n",
" pp.runpm_vstab(net_opt)\n",
" except:\n",
" print(\"[WinError 3] The system cannot find the path specified to the python39.dll\")\n",
" \n",
" # save the mean voltage value for each time step\n",
" y_loop.append(net_opt.res_bus.vm_pu[net_opt.sgen.bus].values.mean())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alternatively, we can do it using multi-timestep optimization."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_multi_vstab') is finished in 5.87 seconds:\n"
]
}
],
"source": [
"########################################################################\n",
"####################### multi-timestep optimization ####################\n",
"########################################################################\n",
"\n",
"from pandapower.control import ConstControl\n",
"from pandapower.timeseries import DFData\n",
"\n",
"# For this method, we need to add the time series data into the pandapower.controller.\n",
"net_opt.controller.drop(net.controller.index, inplace=True) # remove the existing controllers\n",
"\n",
"# Add time series for load and sgen.\n",
"ConstControl(net_opt, element=\"load\", variable=\"p_mw\",\n",
" element_index=net.load.index.tolist(), profile_name=net.load.index.tolist(),\n",
" data_source=DFData(load_ts))\n",
"ConstControl(net_opt, element=\"sgen\", variable=\"p_mw\",\n",
" element_index=net.sgen.index.tolist(), profile_name=net.sgen.index.tolist(),\n",
" data_source=DFData(sgen_ts))\n",
"\n",
"# If required, we also need to creat a time series for the constraints, e.g., Qmax- and Qmin-value, for each time step. \n",
"df_qmax, df_qmin = sgen_ts.copy(), sgen_ts.copy()\n",
"df_qmax[df_qmax.columns] = net_opt.sgen.max_q_mvar\n",
"df_qmin[df_qmin.columns] = net_opt.sgen.min_q_mvar\n",
"\n",
"# Then create controllers for them.\n",
"ConstControl(net_opt, element=\"sgen\", variable=\"max_p_mw\",\n",
" element_index=net.sgen.index.tolist(), profile_name=net.sgen.index.tolist(),\n",
" data_source=DFData(sgen_ts))\n",
"ConstControl(net_opt, element=\"sgen\", variable=\"min_p_mw\",\n",
" element_index=net.sgen.index.tolist(), profile_name=net.sgen.index.tolist(),\n",
" data_source=DFData(sgen_ts))\n",
"ConstControl(net_opt, element=\"sgen\", variable=\"max_q_mvar\",\n",
" element_index=net.sgen.index.tolist(), profile_name=net.sgen.index.tolist(),\n",
" data_source=DFData(df_qmax))\n",
"ConstControl(net_opt, element=\"sgen\", variable=\"min_q_mvar\",\n",
" element_index=net.sgen.index.tolist(), profile_name=net.sgen.index.tolist(),\n",
" data_source=DFData(df_qmin))\n",
"\n",
"# For the multi-timestep optimization, we need to call another PandaModels-function.\n",
"try:\n",
" pp.runpm_multi_vstab(net_opt, from_time_step=0, to_time_step=96)\n",
"except:\n",
" print(\"[WinError 3] The system cannot find the path specified to the python39.dll\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Note that**, currently, the function ***pp.runpm_multi_vstab()*** doesn't support using of the multi-objective function for saving reactive power.\n",
"\n",
"The results for each time step are saved in **net.res_ts_opt**. Let's get them."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"y_multi = []\n",
"for t in range(96):\n",
" y_multi.append(net_opt.res_ts_opt[str(t)].res_bus.vm_pu[net_opt.sgen.bus].values.mean())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And then plot them."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'mean voltage value for DER-buses [p.u.]')"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n",
"ax1.plot(range(96), y_loop)\n",
"ax1.set_title(\"results for \\n optimization in a loop\")\n",
"ax2.plot(range(96), y_multi)\n",
"ax2.set_title(\"results for \\n multi-timestep optimization\")\n",
"\n",
"for ax in ax1, ax2:\n",
" ax.grid(True)\n",
" ax.label_outer()\n",
" ax.set_xlabel(\"time step [15min]\")\n",
"ax1.set_ylabel(\"mean voltage value for DER-buses [p.u.]\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As the plot above shows, both methods have the same results.\n",
"\n",
"**For a long-term time series optimization (>500 timesteps), we suggest using the first method, optimization in a loop.**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2) Maintaining Reactive Power Setpoints\n",
"\n",
"The motivation for this objective is to minimize the deviations of reactive power injection at the TSO-DSO interface from a target value, e.g., $Q_{\\rm setpoint}= 2 \\rm MVar$. It is formulated by the following equation:\n",
"\n",
"\\begin{align}\n",
"& \\underset{\\mathcal{X} = [q, ...]}{\\text{minimize}}\n",
"& & \\sum_{i\\in \\mathcal{interfaces}} (Q_i-Q_{\\rm setpoint})^2 \\\\\n",
"\\end{align}\n",
"\n",
"We use the same grid model to introduce the example. As the picture low shows, the marked bus (or interface) is observed.\n",
"\n",
"\n",
"\n",
"\n",
"First, let's create the grid and check the reactive power injection at this interface."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"-5.941540318632734"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandapower as pp\n",
"import pandapower.networks as nw\n",
"from copy import deepcopy\n",
"\n",
"net = nw.create_cigre_network_mv(with_der=\"pv_wind\")\n",
"pp.runpp(net)\n",
"net_org = deepcopy(net)\n",
"\n",
"display(net.res_trafo.q_lv_mvar[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Without optimization, the reactive power injection at this interface is -5.942 MVAr.\n",
"\n",
"Let's configure optimization parameters and define a target value for this interface, $Q_{\\rm setpoint}= -5 \\rm MVAr$, i.e., we optimize the reactive power provision of DER to achieve this target."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
name
\n",
"
bus
\n",
"
p_mw
\n",
"
q_mvar
\n",
"
sn_mva
\n",
"
scaling
\n",
"
in_service
\n",
"
type
\n",
"
current_source
\n",
"
controllable
\n",
"
max_p_mw
\n",
"
min_p_mw
\n",
"
max_q_mvar
\n",
"
min_q_mvar
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
PV 3
\n",
"
3
\n",
"
0.02
\n",
"
0.0
\n",
"
0.02
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.02
\n",
"
0.02
\n",
"
0.00656
\n",
"
-0.00656
\n",
"
\n",
"
\n",
"
1
\n",
"
PV 4
\n",
"
4
\n",
"
0.02
\n",
"
0.0
\n",
"
0.02
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.02
\n",
"
0.02
\n",
"
0.00656
\n",
"
-0.00656
\n",
"
\n",
"
\n",
"
2
\n",
"
PV 5
\n",
"
5
\n",
"
0.03
\n",
"
0.0
\n",
"
0.03
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.03
\n",
"
0.03
\n",
"
0.00984
\n",
"
-0.00984
\n",
"
\n",
"
\n",
"
3
\n",
"
PV 6
\n",
"
6
\n",
"
0.03
\n",
"
0.0
\n",
"
0.03
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.03
\n",
"
0.03
\n",
"
0.00984
\n",
"
-0.00984
\n",
"
\n",
"
\n",
"
4
\n",
"
PV 8
\n",
"
8
\n",
"
0.03
\n",
"
0.0
\n",
"
0.03
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.03
\n",
"
0.03
\n",
"
0.00984
\n",
"
-0.00984
\n",
"
\n",
"
\n",
"
5
\n",
"
PV 9
\n",
"
9
\n",
"
0.03
\n",
"
0.0
\n",
"
0.03
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.03
\n",
"
0.03
\n",
"
0.00984
\n",
"
-0.00984
\n",
"
\n",
"
\n",
"
6
\n",
"
PV 10
\n",
"
10
\n",
"
0.04
\n",
"
0.0
\n",
"
0.04
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.04
\n",
"
0.04
\n",
"
0.01312
\n",
"
-0.01312
\n",
"
\n",
"
\n",
"
7
\n",
"
PV 11
\n",
"
11
\n",
"
0.01
\n",
"
0.0
\n",
"
0.01
\n",
"
1.0
\n",
"
True
\n",
"
PV
\n",
"
True
\n",
"
True
\n",
"
0.01
\n",
"
0.01
\n",
"
0.00328
\n",
"
-0.00328
\n",
"
\n",
"
\n",
"
8
\n",
"
WKA 7
\n",
"
7
\n",
"
1.50
\n",
"
0.0
\n",
"
1.50
\n",
"
1.0
\n",
"
True
\n",
"
WP
\n",
"
True
\n",
"
True
\n",
"
1.50
\n",
"
1.50
\n",
"
0.49200
\n",
"
-0.49200
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name bus p_mw q_mvar sn_mva scaling in_service type current_source \\\n",
"0 PV 3 3 0.02 0.0 0.02 1.0 True PV True \n",
"1 PV 4 4 0.02 0.0 0.02 1.0 True PV True \n",
"2 PV 5 5 0.03 0.0 0.03 1.0 True PV True \n",
"3 PV 6 6 0.03 0.0 0.03 1.0 True PV True \n",
"4 PV 8 8 0.03 0.0 0.03 1.0 True PV True \n",
"5 PV 9 9 0.03 0.0 0.03 1.0 True PV True \n",
"6 PV 10 10 0.04 0.0 0.04 1.0 True PV True \n",
"7 PV 11 11 0.01 0.0 0.01 1.0 True PV True \n",
"8 WKA 7 7 1.50 0.0 1.50 1.0 True WP True \n",
"\n",
" controllable max_p_mw min_p_mw max_q_mvar min_q_mvar \n",
"0 True 0.02 0.02 0.00656 -0.00656 \n",
"1 True 0.02 0.02 0.00656 -0.00656 \n",
"2 True 0.03 0.03 0.00984 -0.00984 \n",
"3 True 0.03 0.03 0.00984 -0.00984 \n",
"4 True 0.03 0.03 0.00984 -0.00984 \n",
"5 True 0.03 0.03 0.00984 -0.00984 \n",
"6 True 0.04 0.04 0.01312 -0.01312 \n",
"7 True 0.01 0.01 0.00328 -0.00328 \n",
"8 True 1.50 1.50 0.49200 -0.49200 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"net_opt = deepcopy(net) # copy of the grid for further comparison \n",
"net_opt.load['controllable'] = False\n",
"net_opt.sgen['controllable'] = True\n",
"\n",
"# lower and upper bounds for buses\n",
"net_opt.bus[\"max_vm_pu\"] = 1.1\n",
"net_opt.bus[\"min_vm_pu\"] = 0.9\n",
"\n",
"# lower and upper bounds for external grid\n",
"net_opt.ext_grid[\"max_q_mvar\"] = 10000.0\n",
"net_opt.ext_grid[\"min_q_mvar\"] = -10000.0\n",
"net_opt.ext_grid[\"max_p_mw\"] = 10000.0\n",
"net_opt.ext_grid[\"min_p_mw\"] = -10000.0\n",
"\n",
"# lower and upper bounds for DERs\n",
"net_opt.sgen[\"max_p_mw\"] = net_opt.sgen.p_mw.values\n",
"net_opt.sgen[\"min_p_mw\"] = net_opt.sgen.p_mw.values\n",
"net_opt.sgen[\"max_q_mvar\"] = net_opt.sgen.p_mw.values * 0.328\n",
"net_opt.sgen[\"min_q_mvar\"] = -net_opt.sgen.p_mw.values * 0.328\n",
"display(net_opt.sgen)\n",
"\n",
"# lower and upper bounds for lines\n",
"net_opt.trafo[\"max_loading_percent\"] = 100.0\n",
"net_opt.line[\"max_loading_percent\"] = 100.0\n",
"\n",
"######################################################\n",
"####################### Attention ####################\n",
"######################################################\n",
"\n",
"# We need to let PandaModels know which interface is of interest and what is user-defined setpoint. \n",
"# So, we need to add extra column called **\"pm_param/setpoint_q\"** in net.trafo and set target value. \n",
"\n",
"net_opt.trafo[\"pm_param/setpoint_q\"] = None # add extra column\n",
"net_opt.trafo[\"pm_param/setpoint_q\"][0] = -5 # reactive power setpoint for trafo 0 is -5 MVAR\n",
"\n",
"# Also, we need to tell PandaModels which side is observed.\n",
"net_opt.trafo[\"pm_param/side\"] = None\n",
"net_opt.trafo[\"pm_param/side\"][0] = \"lv\" # the observed side is the low-voltage side\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After parametrization, we can start the optimization using ***pp.runpm_qflex()***."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_qflex') is finished in 0.03 seconds:\n"
]
}
],
"source": [
"try:\n",
" pp.runpm_qflex(net_opt)\n",
"except:\n",
" print(\"[WinError 3] The system cannot find the path specified to the python39.dll\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check the optimization results."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"-5.356245826038442"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
p_mw
\n",
"
q_mvar
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0.02
\n",
"
0.00656
\n",
"
\n",
"
\n",
"
1
\n",
"
0.02
\n",
"
0.00656
\n",
"
\n",
"
\n",
"
2
\n",
"
0.03
\n",
"
0.00984
\n",
"
\n",
"
\n",
"
3
\n",
"
0.03
\n",
"
0.00984
\n",
"
\n",
"
\n",
"
4
\n",
"
0.03
\n",
"
0.00984
\n",
"
\n",
"
\n",
"
5
\n",
"
0.03
\n",
"
0.00984
\n",
"
\n",
"
\n",
"
6
\n",
"
0.04
\n",
"
0.01312
\n",
"
\n",
"
\n",
"
7
\n",
"
0.01
\n",
"
0.00328
\n",
"
\n",
"
\n",
"
8
\n",
"
1.50
\n",
"
0.49200
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" p_mw q_mvar\n",
"0 0.02 0.00656\n",
"1 0.02 0.00656\n",
"2 0.03 0.00984\n",
"3 0.03 0.00984\n",
"4 0.03 0.00984\n",
"5 0.03 0.00984\n",
"6 0.04 0.01312\n",
"7 0.01 0.00328\n",
"8 1.50 0.49200"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(net_opt.res_trafo.q_lv_mvar[0]) # show Q-injection at the interface after optimization\n",
"display(net_opt.res_sgen) # show optimized reactiv power provision of DER"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the results above, we can see that the Q-injection at the interface is closer to the setpoint after the optimization but not achieved. The reason is that the Q-maximum is limited. We can modify the Q-maximum and try again."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_qflex') is finished in 0.02 seconds:\n"
]
},
{
"data": {
"text/plain": [
"-5.0000000238509115"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
p_mw
\n",
"
q_mvar
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0.02
\n",
"
0.001931
\n",
"
\n",
"
\n",
"
1
\n",
"
0.02
\n",
"
0.001945
\n",
"
\n",
"
\n",
"
2
\n",
"
0.03
\n",
"
0.004184
\n",
"
\n",
"
\n",
"
3
\n",
"
0.03
\n",
"
0.004198
\n",
"
\n",
"
\n",
"
4
\n",
"
0.03
\n",
"
0.004140
\n",
"
\n",
"
\n",
"
5
\n",
"
0.03
\n",
"
0.004168
\n",
"
\n",
"
\n",
"
6
\n",
"
0.04
\n",
"
0.006959
\n",
"
\n",
"
\n",
"
7
\n",
"
0.01
\n",
"
0.000483
\n",
"
\n",
"
\n",
"
8
\n",
"
1.50
\n",
"
0.881054
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" p_mw q_mvar\n",
"0 0.02 0.001931\n",
"1 0.02 0.001945\n",
"2 0.03 0.004184\n",
"3 0.03 0.004198\n",
"4 0.03 0.004140\n",
"5 0.03 0.004168\n",
"6 0.04 0.006959\n",
"7 0.01 0.000483\n",
"8 1.50 0.881054"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"net_opt.sgen[\"max_q_mvar\"] = net_opt.sgen.p_mw.values * 0.628\n",
"net_opt.sgen[\"min_q_mvar\"] = -net_opt.sgen.p_mw.values * 0.628\n",
"try:\n",
" pp.runpm_qflex(net_opt)\n",
"except:\n",
" print(\"[WinError 3] The system cannot find the path specified to the python39.dll\")\n",
"display(net_opt.res_trafo.q_lv_mvar[0]) # show Q-injection at the interface after optimization\n",
"display(net_opt.res_sgen)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, the Q-injection at the interface is optimized to -5 MVAr. \n",
"\n",
"Similar to the **maintaining voltage setpoints**, if you are interested in time series optimizations, you can do it through a loop or use ***pp.runpm_multi_qflex()***."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3) Power Loss Reduction and Branch Loading Reduction\n",
"\n",
"The corresponding objective functions are formulated as follows: \n",
"\n",
"- loss reduction\n",
"\\begin{align}\n",
"& \\underset{\\mathcal{X} = [q, ...]}{\\text{minimize}}\n",
"& & \\sum_{(i, j)\\in \\mathcal{N}} (S_{ij}+S_{ji})^2 \\\\\n",
"\\end{align}\n",
"\n",
"\n",
"- loading reduction\n",
"\\begin{align}\n",
"& \\underset{\\mathcal{X} = [q, ...]}{\\text{minimize}}\n",
"& & \\sum_{(i, j)\\in \\mathcal{N}} (i_{i->j, target}-0)^2 \\\\\n",
"\\end{align}\n",
"\n",
"We still use the cigre medium voltage grid to introduce the case studies. First, let's create the grid, add constraints, and define the observed branches."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"import pandapower as pp\n",
"import pandapower.networks as nw\n",
"from copy import deepcopy\n",
"\n",
"net = nw.create_cigre_network_mv(with_der=\"pv_wind\")\n",
"net.load['controllable'] = False\n",
"net.sgen['controllable'] = True\n",
"net.sgen[\"max_p_mw\"] = net.sgen.p_mw.values\n",
"net.sgen[\"min_p_mw\"] = net.sgen.p_mw.values\n",
"net.sgen[\"max_q_mvar\"] = net.sgen.p_mw.values * 0.328\n",
"net.sgen[\"min_q_mvar\"] = -net.sgen.p_mw.values * 0.328\n",
"net.bus[\"max_vm_pu\"] = 1.1\n",
"net.bus[\"min_vm_pu\"] = 0.9\n",
"net.ext_grid[\"max_q_mvar\"] = 10000.0\n",
"net.ext_grid[\"min_q_mvar\"] = -10000.0\n",
"net.ext_grid[\"max_p_mw\"] = 10000.0\n",
"net.ext_grid[\"min_p_mw\"] = -10000.0\n",
"net.trafo[\"max_loading_percent\"] = 100.0\n",
"net.line[\"max_loading_percent\"] = 100.0\n",
"\n",
"# add an additional column named \"pm_param/target_branch\" to let PandaModels know the observed branches.\n",
"net.line[\"pm_param/target_branch\"] = True \n",
"net.switch.loc[:, \"closed\"] = True\n",
"\n",
"# run power flow calculation\n",
"pp.runpp(net)\n",
"net_loss = deepcopy(net)\n",
"net_loading = deepcopy(net)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As you see, the power flow results without optimization are stored in the grid ***net***, and the grids ***net_loss*** and ***net_loading*** are going to used for optimization. Now we call the functions ***pp.runpm_ploss*** and ***pp.runpm_loading*** to reduce the power loss and line loading percent."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_ploss') is finished in 2.19 seconds:\n",
"hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n",
"hp.pandapower.opf.run_pandamodels - INFO: Optimization ('run_pandamodels_loading') is finished in 0.07 seconds:\n"
]
}
],
"source": [
"pp.runpm_ploss(net_loss)\n",
"pp.runpm_loading(net_loading)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's compare the results."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"loss without optimization: 0.070711475427468\n",
"loss with optimization: 0.06241656797117738\n",
"++++++++++++++++++++++++++++++++++++++++++++++\n",
"loading without optimization: 260.54100720602156\n",
"loading with optimization: 247.549588132589\n"
]
}
],
"source": [
"print(\"loss without optimization:\", net.res_line.pl_mw.values.sum())\n",
"print(\"loss with optimization:\", net_loss.res_line.pl_mw.values.sum())\n",
"print(\"++++++++++++++++++++++++++++++++++++++++++++++\")\n",
"print(\"loading without optimization:\", net.res_line.loading_percent.values.sum())\n",
"print(\"loading with optimization:\", net_loading.res_line.loading_percent.values.sum())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Also, we can reduce loss or loading percent of transformers:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"no costs are given - overall generated power is minimized\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"loss without optimization: 0.06354567913302844\n",
"loss with optimization: 0.0629529981193997\n"
]
}
],
"source": [
"net_loss.line.drop(columns=[\"pm_param/target_branch\"], inplace=True)\n",
"net_loss.trafo[\"pm_param/target_branch\"] = True\n",
"pp.runpm_ploss(net_loss)\n",
"print(\"loss without optimization:\", net.res_trafo.pl_mw.values.sum())\n",
"print(\"loss with optimization:\", net_loss.res_trafo.pl_mw.values.sum())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"execution": {
"allow_errors": true,
"timeout": 300
},
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}