Formulations Introduction
PowerSimulations.jl enables modularity in its formulations by assigning a DeviceModel
to each PowerSystems.jl
component type existing in a defined system.
PowerSimulations.jl
has a multiple AbstractDeviceFormulation
subtypes that can be applied to different PowerSystems.jl
device types, each dispatching to different methods for populating the optimization problem variables, objective function, expressions and constraints.
Example Formulation
For example a typical optimization problem in a DecisionModel
in PowerSimulations.jl
with three DeviceModel
has the abstract form of:
\[\begin{align*} &\min_{\boldsymbol{x}}~ \text{Objective\_DeviceModelA} + \text{Objective\_DeviceModelB} + \text{Objective\_DeviceModelC} \\ & ~~\text{s.t.} \\ & \hspace{0.9cm} \text{Constraints\_NetworkModel} \\ & \hspace{0.9cm} \text{Constraints\_DeviceModelA} \\ & \hspace{0.9cm} \text{Constraints\_DeviceModelB} \\ & \hspace{0.9cm} \text{Constraints\_DeviceModelC} \end{align*}\]
Suppose this is a system with the following characteristics:
- Horizon: 48 hours
- Interval: 24 hours
- Resolution: 1 hour
- Three Buses: 1, 2 and 3
- One
ThermalStandard
(device A) unit at bus 1 - One
RenewableDispatch
(device B) unit at bus 2 - One
PowerLoad
(device C) at bus 3 - Three
Line
that connects all the buses
Now, we assign the following DeviceModel
to each PowerSystems.jl
with:
Type | Formulation |
---|---|
Network | CopperPlatePowerModel |
ThermalStandard | ThermalDispatchNoMin |
RenewableDispatch | RenewableFullDispatch |
PowerLoad | StaticPowerLoad |
Note that we did not assign any DeviceModel
to Line
since the CopperPlatePowerModel
used for the network assumes that everything is lumped in the same node (like a copper plate with infinite capacity), and hence there are no flows between buses that branches can limit.
Each DeviceModel
formulation is described in specific in their respective page, but the overall optimization problem will end-up as:
\[\begin{align*} &\min_{\boldsymbol{p}^\text{th}, \boldsymbol{p}^\text{re}}~ \sum_{t=1}^{48} C^\text{th} p_t^\text{th} - C^\text{re} p_t^\text{re} \\ & ~~\text{s.t.} \\ & \hspace{0.9cm} p_t^\text{th} + p_t^\text{re} = P_t^\text{load}, \quad \forall t \in {1,\dots, 48} \\ & \hspace{0.9cm} 0 \le p_t^\text{th} \le P^\text{th,max} \\ & \hspace{0.9cm} 0 \le p_t^\text{re} \le \text{ActivePowerTimeSeriesParameter}_t \end{align*}\]
Note that the StaticPowerLoad
does not impose any cost to the objective function or constraint but adds its power demand to the supply-balance demand of the CopperPlatePowerModel
used. Since we are using the ThermalDispatchNoMin
formulation for the thermal generation, the lower bound for the power is 0, instead of $P^\text{th,min}$. In addition, we are assuming a linear cost $C^\text{th}$. Finally, the RenewableFullDispatch
formulation allows the dispatch of the renewable unit between 0 and its maximum injection time series $p_t^\text{re,param}$.
Nomenclature
In the formulations described in the other pages, the nomenclature is as follows:
- Lowercase letters are used for variables, e.g., $p$ for power.
- Uppercase letters are used for parameters, e.g., $C$ for costs.
- Subscripts are used for indexing, e.g., $(\cdot)_t$ for indexing at time $t$.
- Superscripts are used for descriptions, e.g., $(\cdot)^\text{th}$ to describe a thermal (th) variable/parameter.
- Bold letters are used for vectors, e.g., $\boldsymbol{p} = \{p\}_{1,\dots,24}$.