Theory
Why do we need water values ?
Antares solves the annual unit commitment problem week by week. When long term hydraulic storages are used in Antares, a procedure is needed to determine which amount of water Antares should use for a given week and which amount Antares should keep for the rest of the year. One method to do so is to use water values.
What are water values ?
Water values are prices in euros per MWh that helps Antares, in his weekly sequentially resolution, to determine whether to use the water stocked in reservoirs during the current week or to keep it for later in the year. There is one water value per area, per week and per reservoir level. Water value reprensents the best price at which the slice of storage could sold between the given week and the end of the year. Water values are comparable to marginal prices of thermal units. A simple criterion to understand water values is the following :
During an hour, if the marginal price is greater than the water value, it’s better to turbine the water in the reservoir.
Otherwise, if the marginal price is lower than the water value multiplied by the pumping efficiency, it’s better to pump water into the reservoir, if pumping is possible.
These water values are defined by the user so they need a method to compute them.
How to compute water values ?
Water values are the derivatives of Bellman values. Bellman values are given, alike water values, for each area, each week and each reservoir level. They represent the future avoided cost in euros when considering the amount of water stored in the reservoir. They are supposed to be concave with respect to the reservoir level for a given week. In consequence, water values are supposed to be decreasing with respect to the reservoir level for a given week and this is one strong assumption of Antares.
How to compute Bellman values ?
To compute Bellman values, dynamic programming is used by solving the following optimization problems for each week and each reservoir level. This means that one begins by solving the problem of the last week of the year and then one solves the precedent week through backtracking.
We use the following notations :
representing the weeks of the year.
is the Bellman value for week and for the reservoir level at the beginning of week .
is the Bellman value at the end of the year that is supposed to be known.
is the amount of water generated () or pumped () with extreme values and . It is also called the control.
is the inflow during week .
are the rule curves for the beginning of week .
is the reward during week depending on the hazards that comprise the inflow. Hazards are represented by Monte Carlo years in Antares.
This equation means that the reward that is possible to earn between the beginning of week and the end of the year is the best compromise between the reward at week and the reward between the beginning of week and the end of the year. In other words, it is the best compromise between using water during week and keeping it for the other weeks.
How water values are used in Antares ?
Once water values have been computed by differentiating Bellman
values, the user should send them to Antares. Antares will use them
differently depending on the hydro-princing-mode :
fast: generating and pumping will be penalized for the given week at the water value of the beginning of the week for the initial level of the week similar to the explanation in What are water values ?. This mode assumes the level of storage is not going to change during the week.accurate(recommended) : Bellman values are built from water values and the objective function of Antares will be to minimize operational cost for the week minus Bellman value for the final level of stock (that represent the avoided future costs).
Practice : how water values are computed in this package ?
There are three main steps to compute water values in this package using Antares :
Compute rewards functions for all weeks and all possible hazards.
Apply the precedent equation to compute Bellman values.
Compute the derivative of Bellman values to get water values.
Each step is detailed is the following paragraphs.
Rewards functions
First of all, we assume that the reward doesn’t depend on the reservoir level so it becomes which means the reward depends only on the week, the scenario and the control of the storage.
Reward functions are computed in two steps : the first one is to
launch Antares simulation (“simulation tab” in the shiny interface or
runWaterValuesSimulation() ) and the second one is to use
the simulation results to build the reward function (“calculate water
values” tab or get_Reward()).
For the first step, the user chooses a number of controls
(nb_disc_stock) for which the reward
function will be evaluated. There is the same number of controls for
each week and each scenario but the value of the controls can change if
the maximum power of the turbine varies between weeks. For each control,
a complete Antares simulation is launched, IE for all weeks and all
Monte Carlo years. This means there is exactly one Antares simulation
per control. To evaluate the reward associated with a control, the
control of the storage is forced over the week by deactivating the
storage and creating two fictive nodes representing respectively
generating and pumping and a binding constraint linking the two nodes to
simulate the behavior of the storage. The reward is then the opposite of
the weekly operational cost.
Once all simulations are run, in the second step, simulation results
are used to build reward functions. See
vignette("Reward-interpolation") for more details.
Computation of Bellman values
Using reward functions, one can now calculate Bellman values with
Grid_Matrix(). This function computes Bellman values for
each week and each scenario using the previous reward function and the
formula given in How to compute
Bellman values ?. More details on this function are given in
vignette("grid_Matrix-parameters")
Computation of water values
This last step is very simple. The package interpolates Bellman
values to have values every 1% of storage and then calculates the
derivative of Bellman values to have one value per reservoir level and
per day (water values are constant for a given week). This is done in
function to_Antares_Format(). Water values can be written
to Antares with antaresEditObject::writeWaterValues.