Flexible loads#

They are a special type of power loads: instead of being constant, the power will depend on the voltage measured at the load and the control applied to the load.

Equations#

The equations are the following (star loads):

\[\begin{split}\left\{ \begin{aligned} \underline{I_{\mathrm{abc}}} &= \left(\frac{ \underline{S_{\mathrm{abc}}}(\underline{V_{\mathrm{abc}}}-\underline{V_{\mathrm{n}}}) }{\underline{V_{\mathrm{abc}}}-\underline{V_{\mathrm{n}}}}\right)^{\star} \\ \underline{I_{\mathrm{n}}} &= -\sum_{p\in\{\mathrm{a},\mathrm{b},\mathrm{c}\}}\underline{I_{p}} \end{aligned} \right.\end{split}\]

And the following (delta loads):

\[\begin{split}\left\{ \begin{aligned} \underline{I_{\mathrm{ab}}} &= \left(\frac{\underline{S_{\mathrm{ab}}}(\underline{V_{\mathrm{a}}}-\underline {V_{\mathrm{b}}})}{\underline{V_{\mathrm{a}}}-\underline{V_{\mathrm{b}}}}\right)^{\star} \\ \underline{I_{\mathrm{bc}}} &= \left(\frac{\underline{S_{\mathrm{bc}}}(\underline{V_{\mathrm{b}}}-\underline {V_{\mathrm{c}}})}{\underline{V_{\mathrm{b}}}-\underline{V_{\mathrm{c}}}}\right)^{\star} \\ \underline{I_{\mathrm{ca}}} &= \left(\frac{\underline{S_{\mathrm{ca}}}(\underline{V_{\mathrm{c}}}-\underline {V_{\mathrm{a}}})}{\underline{V_{\mathrm{c}}}-\underline{V_{\mathrm{a}}}}\right)^{\star} \end{aligned} \right.\end{split}\]

The expression \(\underline{S}(U)\) depends on four parameters:

  • The theoretical power \(\underline{S^{\mathrm{th.}}}\) that the load would have if no control is applied.

  • The maximal power \(S^{\max}\) that can be injected/consumed by the load. For a PV installation, this is usually the rated power of the inverter.

  • The type of control (see here).

  • The type of projection (see here).

Detailed pages#

All these elements are detailed in the following sections:

API Reference#

class Control(type: Literal['constant', 'p_max_u_production', 'p_max_u_consumption', 'q_u'], u_min: float | Quantity[float], u_down: float | Quantity[float], u_up: float | Quantity[float], u_max: float | Quantity[float], alpha: float = 1000.0, epsilon: float = 1e-08)

Bases: JsonMixin

Control class for flexible loads.

This class contains the information needed to formulate the control equations. This includes the control type, control limits, and other factors.

The control for a PowerLoad instance can be of four possible types:
  • "constant": no control is applied. In this case, a simple PowerLoad without flexible_params could have been used instead.

  • "p_max_u_production": control the maximum production active power of the load (inverter) based on the voltage \(P^{\max}_{\mathrm{prod}}(U)\).

  • "p_max_u_consumption": control the maximum consumption active power of the load based on the voltage \(P^{\max}_{\mathrm{cons}}(U)\).

  • "q_u": control the reactive power based on the voltage \(Q(U)\).

Control constructor.

Parameters:
  • type

    The type of the control:
    • "constant": no control is applied;

    • "p_max_u_production": control the maximum production active power of the load (inverter) based on the voltage \(P^{\max}_{\mathrm{prod}}(U)\);

    • "p_max_u_consumption": control the maximum consumption active power of the load based on the voltage \(P^{\max}_{\mathrm{cons}}(U)\);

    • "q_u": control the reactive power based on the voltage \(Q(U)\).

  • u_min – The minimum voltage i.e. the one the control reached the maximum action.

  • u_down – The voltage which starts to trigger the control (lower value).

  • u_up – The voltage which starts to trigger the control (upper value).

  • u_max – The maximum voltage i.e. the one the control reached its maximum action.

  • alpha – An approximation factor used by the family function (soft clip). The bigger the factor is the closer the function is to the non-differentiable function.

  • epsilon – This value is used to make a smooth inverse function. It is only useful for P control.

property u_min: Quantity[float]

The minimum voltage i.e. the one the control reached the maximum action.

property u_down: Quantity[float]

The voltage which starts to trigger the control (lower value).

property u_up: Quantity[float]

TThe voltage which starts to trigger the control (upper value).

property u_max: Quantity[float]

The maximum voltage i.e. the one the control reached its maximum action.

property alpha: float

An approximation factor used by the family function (soft clip). The bigger the factor is the closer the function is to the non-differentiable function.

property epsilon: float

This value is used to make a smooth inverse function.

classmethod constant() Self

Create a constant control i.e no control.

classmethod p_max_u_production(u_up: float | Quantity[float], u_max: float | Quantity[float], alpha: float = 1000.0, epsilon: float = 1e-08) Self

Create a control of the type "p_max_u_production".

Parameters:
  • u_up – The voltage norm that triggers the control. A voltage higher than this value signals to the controller to start to reduce the production active power. On the figure, a normalised version \(U^{\mathrm{up}\,\mathrm{norm.}}\) is used.

  • u_max – The maximum norm voltage i.e. the one the control reached its maximum action. A voltage higher than this value signals to the controller to set the production active power to its minimal value. On the figure, a normalised version \(U^{\max\,\mathrm{norm.}}\) is used.

  • alpha – A factor used to soften the control function (soft clip) to make it more differentiable. The bigger alpha is, the closer the function is to the non-differentiable function. This parameter is noted \(\alpha\) on the figure.

  • epsilon – This value is used to make a smooth inverse function.

Returns:

The "p_max_u_production" control using the provided parameters.

classmethod p_max_u_consumption(u_min: float | Quantity[float], u_down: float | Quantity[float], alpha: float = 1000.0, epsilon: float = 1e-08) Self

Create a control of the type "p_max_u_consumption".

Parameters:
  • u_min – The minimum voltage norm i.e. the one the control reached its maximum action. A voltage lower than this value signals to the controller to set the consumption active power to its minimal value. On the figure, a normalised version \(U^{\min\,\mathrm{norm.}}\) is used.

  • u_down – The voltage norm that triggers the control. A voltage lower than this value signals to the controller to start to reduce the consumption active power. On the figure, a normalised version \(U^{\mathrm{down}\,\mathrm{norm.}}\) is used.

  • alpha – A factor used to soften the control function (soft clip) to make it more differentiable. The bigger alpha is, the closer the function is to the non-differentiable function. This parameter is noted \(\alpha\) on the figure.

  • epsilon – This value is used to make a smooth inverse function.

Returns:

The "p_max_u_consumption" control using the provided parameters.

classmethod q_u(u_min: float | Quantity[float], u_down: float | Quantity[float], u_up: float | Quantity[float], u_max: float | Quantity[float], alpha: float = 1000.0) Self

Create a control of the type "q_u".

Parameters:
  • u_min – The minimum voltage norm i.e. the one the control reached its maximum action. A voltage lower than this value signals to the controller to set the reactive power to its maximal capacitive value. On the figure, a normalised version \(U^{\min\,\mathrm{norm.}}\) is used.

  • u_down – The voltage that triggers the capacitive reactive power control. A voltage lower than this value signals to the controller to start to increase the capacitive reactive power. On the figure, a normalised version \(U^{\mathrm{down}\,\mathrm{norm.}}\) is used.

  • u_up – The voltage that triggers the inductive reactive power control. A voltage higher than this value signals to the controller to start to increase the inductive reactive power. On the figure, a normalised version \(U^{\mathrm{up}\,\mathrm{norm.}}\) is used.

  • u_max – The minimum voltage i.e. the one the control reached its maximum action. A voltage lower than this value signals to the controller to set the reactive power to its maximal inductive value. On the figure, a normalised version \(U^{\max\,\mathrm{norm.}}\) is used.

  • alpha – A factor used to soften the control function (soft clip) to make it more differentiable. The bigger alpha is, the closer the function is to the non-differentiable function. This parameter is noted \(\alpha\) on the figure.

Returns:

The "q_u" control using the provided parameters.

classmethod from_dict(data: dict[str, Any], *, include_results: bool = True) Self

Create an element from a dictionary created with to_dict().

Note

This method does not work on all classes that define it as some of them require additional information to be constructed. It can only be safely used on the ElectricNetwork, LineParameters and TransformerParameters classes.

Parameters:
  • data – The dictionary containing the element’s data.

  • include_results – If True (default) and the results of the load flow are included in the dictionary, the results are also loaded into the element.

Returns:

The constructed element.

class Projection(type: Literal['euclidean', 'keep_p', 'keep_q'], alpha: float = 1000.0, epsilon: float = 1e-08)

Bases: JsonMixin

This class defines the projection on the feasible circle for a flexible load.

The three possible projection types are:
  • "euclidean": for a Euclidean projection on the feasible space;

  • "keep_p": for maintaining a constant P;

  • "keep_q": for maintaining a constant Q.

Projection constructor.

Parameters:
  • type

    The type of the projection. It can be:
    • "euclidean": for an Euclidean projection on the feasible space;

    • "keep_p": for maintaining a constant P;

    • "keep_q": for maintaining a constant Q.

  • alpha – This value is used to make soft sign function and to build a soft projection function.

  • epsilon – This value is used to make a smooth sqrt function.

property alpha: float

This value is used to make soft sign function and to build a soft projection function.

property epsilon: float

This value is used to make a smooth sqrt function. It is only used in the Euclidean projection.

classmethod from_dict(data: dict[str, Any], *, include_results: bool = True) Self

Create an element from a dictionary created with to_dict().

Note

This method does not work on all classes that define it as some of them require additional information to be constructed. It can only be safely used on the ElectricNetwork, LineParameters and TransformerParameters classes.

Parameters:
  • data – The dictionary containing the element’s data.

  • include_results – If True (default) and the results of the load flow are included in the dictionary, the results are also loaded into the element.

Returns:

The constructed element.

class FlexibleParameter(control_p: Control, control_q: Control, projection: Projection, s_max: float | Quantity[float], q_min: float | Quantity[float] | None = None, q_max: float | Quantity[float] | None = None)

Bases: JsonMixin

Flexible parameters of a flexible load.

This class encapsulate single-phase flexibility information of a flexible load:

  • The active power Control to apply;

  • The reactive power Control to apply;

  • The Projection to use when dealing with voltage violations;

  • The apparent power of the flexible load (VA). This is the maximum power the load can consume/produce. It is

    the radius of the feasible circle used by the projection

For multi-phase loads, you need to use a FlexibleParameter instance per phase.

FlexibleParameter constructor.

Parameters:
  • control_p – The control to apply on the active power.

  • control_q – The control to apply on the reactive power.

  • projection – The projection to use to have a feasible result.

  • s_max – The apparent power of the flexible load (VA). It is the radius of the feasible circle.

  • q_min – The minimum reactive power of the flexible load (VAr). By default it is equal to -s_max, but it can be further constrained.

  • q_max – The maximum reactive power of the flexible load (VAr). By default it is equal to s_max, but it can be further constrained.

property s_max: Quantity[float]

The apparent power of the flexible load (VA). It is the radius of the feasible circle.

property q_min: Quantity[float]

The minimum reactive power of the flexible load (VAr).

property q_max: Quantity[float]

The maximum reactive power of the flexible load (VAr).

classmethod constant() Self

Build flexible parameters for a constant control with a Euclidean projection.

Returns:

A constant control i.e. no control at all. It is an equivalent of the constant power load.

classmethod p_max_u_production(u_up: float | Quantity[float], u_max: float | Quantity[float], s_max: float | Quantity[float], alpha_control: float = 1000.0, epsilon_control: float = 1e-08, type_proj: Literal['euclidean', 'keep_p', 'keep_q'] = 'euclidean', alpha_proj: float = 1000.0, epsilon_proj: float = 1e-08) Self

Build flexible parameters for production P(U) control with a Euclidean projection.

Parameters:
  • u_up – The voltage upper limit value that triggers the control. If the voltage is greater than this value, the production active power is reduced.

  • u_max – The maximum voltage i.e. the one the control reached its maximum action. If the voltage is greater than this value, the production active power is reduced to zero.

  • s_max – The apparent power of the flexible inverter (VA). It is the radius of the feasible circle.

  • alpha_control – An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function.

  • epsilon_control – This value is used to make a smooth inverse function for the control.

  • type_proj – The type of the projection to use.

  • alpha_proj – This value is used to make soft sign function and to build a soft projection function (see the diagram above).

  • epsilon_proj – This value is used to make a smooth sqrt function. It is only used in the Euclidean projection.

Returns:

A flexible parameter which performs “p_max_u_production” control.

classmethod p_max_u_consumption(u_min: float | Quantity[float], u_down: float | Quantity[float], s_max: float | Quantity[float], alpha_control: float = 1000.0, epsilon_control: float = 1e-08, type_proj: Literal['euclidean', 'keep_p', 'keep_q'] = 'euclidean', alpha_proj: float = 1000.0, epsilon_proj: float = 1e-08) Self

Build flexible parameters for consumption P(U) control with a Euclidean projection.

Parameters:
  • u_min – The minimum voltage i.e. the one the control reached the maximum action.

  • u_down – The voltage which starts to trigger the control (lower value).

  • s_max – The apparent power of the flexible load (VA). It is the radius of the feasible circle.

  • alpha_control – An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function.

  • epsilon_control – This value is used to make a smooth inverse function for the control.

  • type_proj – The type of the projection to use.

  • alpha_proj – This value is used to make soft sign function and to build a soft projection function.

  • epsilon_proj – This value is used to make a smooth sqrt function. It is only used in the Euclidean projection.

Returns:

A flexible parameter which performs “p_max_u_consumption” control.

classmethod q_u(u_min: float | Quantity[float], u_down: float | Quantity[float], u_up: float | Quantity[float], u_max: float | Quantity[float], s_max: float | Quantity[float], q_min: float | Quantity[float] | None = None, q_max: float | Quantity[float] | None = None, alpha_control: float = 1000.0, type_proj: Literal['euclidean', 'keep_p', 'keep_q'] = 'euclidean', alpha_proj: float = 1000.0, epsilon_proj: float = 1e-08) Self

Build flexible parameters for Q(U) control with a Euclidean projection.

Parameters:
  • u_min – The minimum voltage i.e. the one the control reached the maximum action.

  • u_down – The voltage which starts to trigger the control (lower value).

  • u_up – The voltage which starts to trigger the control (upper value).

  • u_max – The maximum voltage i.e. the one the control reached its maximum action.

  • s_max – The apparent power of the flexible load (VA). It is the radius of the feasible circle.

  • q_min – The minimum reactive power of the flexible load (VAr). By default it is equal to -s_max, but it can be further constrained.

  • q_max – The maximum reactive power of the flexible load (VAr). By default it is equal to s_max, but it can be further constrained.

  • alpha_control – An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function.

  • type_proj – The type of the projection to use.

  • alpha_proj – This value is used to make soft sign function and to build a soft projection function.

  • epsilon_proj – This value is used to make a smooth sqrt function. It is only used in the Euclidean projection.

Returns:

A flexible parameter which performs “q_u” control.

classmethod pq_u_production(up_up: float | Quantity[float], up_max: float | Quantity[float], uq_min: float | Quantity[float], uq_down: float | Quantity[float], uq_up: float | Quantity[float], uq_max: float | Quantity[float], s_max: float | Quantity[float], q_min: float | Quantity[float] | None = None, q_max: float | Quantity[float] | None = None, alpha_control=1000.0, epsilon_control: float = 1e-08, type_proj: Literal['euclidean', 'keep_p', 'keep_q'] = 'euclidean', alpha_proj=1000.0, epsilon_proj=1e-08) Self

Build flexible parameters for production P(U) control and Q(U) control with a Euclidean projection.

Parameters:
  • up_up – The voltage which starts to trigger the control on the production (upper value).

  • up_max – The maximum voltage i.e. the one the control (of production) reached its maximum action.

  • uq_min – The minimum voltage i.e. the one the control reached the maximum action (reactive power control)

  • uq_down – The voltage which starts to trigger the reactive power control (lower value).

  • uq_up – The voltage which starts to trigger the reactive power control (upper value).

  • uq_max – The maximum voltage i.e. the one the reactive power control reached its maximum action.

  • s_max – The apparent power of the flexible load (VA). It is the radius of the feasible circle.

  • q_min – The minimum reactive power of the flexible load (VAr). By default it is equal to -s_max, but it can be further constrained.

  • q_max – The maximum reactive power of the flexible load (VAr). By default it is equal to s_max, but it can be further constrained.

  • alpha_control – An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function.

  • epsilon_control – This value is used to make a smooth inverse function for the control.

  • type_proj – The type of the projection to use.

  • alpha_proj – This value is used to make soft sign function and to build a soft projection function.

  • epsilon_proj – This value is used to make a smooth sqrt function. It is only used in the Euclidean projection.

Returns:

A flexible parameter which performs “p_max_u_production” control and a “q_u” control.

See also

p_max_u_production() and q_u() for more details.

classmethod pq_u_consumption(up_min: float | Quantity[float], up_down: float | Quantity[float], uq_min: float | Quantity[float], uq_down: float | Quantity[float], uq_up: float | Quantity[float], uq_max: float | Quantity[float], s_max: float | Quantity[float], q_min: float | Quantity[float] | None = None, q_max: float | Quantity[float] | None = None, alpha_control: float | Quantity[float] = 1000.0, epsilon_control: float = 1e-08, type_proj: Literal['euclidean', 'keep_p', 'keep_q'] = 'euclidean', alpha_proj: float = 1000.0, epsilon_proj: float = 1e-08) Self

Build flexible parameters for consumption P(U) control and Q(U) control with a Euclidean projection.

Parameters:
  • up_min – The minimum voltage i.e. the one the active power control reached the maximum action.

  • up_down – The voltage which starts to trigger the active power control (lower value).

  • uq_min – The minimum voltage i.e. the one the control reached the maximum action (reactive power control)

  • uq_down – The voltage which starts to trigger the reactive power control (lower value).

  • uq_up – The voltage which starts to trigger the reactive power control (upper value).

  • uq_max – The maximum voltage i.e. the one the reactive power control reached its maximum action.

  • s_max – The apparent power of the flexible load (VA). It is the radius of the feasible circle.

  • q_min – The minimum reactive power of the flexible load (VAr). By default it is equal to -s_max, but it can be further constrained.

  • q_max – The maximum reactive power of the flexible load (VAr). By default it is equal to s_max, but it can be further constrained.

  • alpha_control – An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function.

  • epsilon_control – This value is used to make a smooth inverse function for the control.

  • type_proj – The type of the projection to use.

  • alpha_proj – This value is used to make soft sign function and to build a soft projection function.

  • epsilon_proj – This value is used to make a smooth sqrt function. It is only used in the Euclidean projection.

Returns:

A flexible parameter which performs “p_max_u_consumption” control and “q_u” control.

See also

p_max_u_consumption() and q_u() for more details.

classmethod from_dict(data: dict[str, Any], *, include_results: bool = True) Self

Create an element from a dictionary created with to_dict().

Note

This method does not work on all classes that define it as some of them require additional information to be constructed. It can only be safely used on the ElectricNetwork, LineParameters and TransformerParameters classes.

Parameters:
  • data – The dictionary containing the element’s data.

  • include_results – If True (default) and the results of the load flow are included in the dictionary, the results are also loaded into the element.

Returns:

The constructed element.

compute_powers(voltages: ndarray[Any, dtype[complex128]] | Quantity[ndarray[Any, dtype[complex128]]] | Quantity[Sequence[complex]] | Sequence[complex | Quantity[complex]], power: complex | Quantity[complex]) Quantity[ndarray[Any, dtype[complex128]]]

Compute the flexible powers for different voltages (norms)

Parameters:
  • voltages – The array of voltage norms to test with this flexible parameter.

  • power – The input theoretical power of the load.

Returns:

The flexible powers really consumed taking into account the control. One value per provided voltage norm.

plot_pq(voltages: ndarray[Any, dtype[float64]] | Quantity[ndarray[Any, dtype[float64]]] | Quantity[Sequence[float]] | Sequence[float | Quantity[float]], power: complex | Quantity[complex], ax: Axes | None = None, voltages_labels_mask: ndarray[Any, dtype[bool_]] | None = None) tuple[Axes, ndarray[Any, dtype[complex128]]]

Plot the “trajectory” of the flexible powers (in the (P, Q) plane) for the provided voltages and theoretical power.

Parameters:
  • voltages – Array-like of voltage norms to test with this flexible parameter.

  • power – The input theoretical power of the load.

  • ax – The optional axis to use for the plot. The current axis is used by default.

  • voltages_labels_mask – A mask to activate the plot of voltages labels. By default, no voltages annotations.

Returns:

The axis on which the plot has been drawn and the resulting flexible powers (the input if not None else the computed values).

plot_control_p(voltages: ndarray[Any, dtype[float64]] | Quantity[ndarray[Any, dtype[float64]]] | Quantity[Sequence[float]] | Sequence[float | Quantity[float]], power: complex | Quantity[complex], ax: Axes | None = None) tuple[Axes, ndarray[Any, dtype[complex128]]]

Plot the flexible active power consumed (or produced) for the provided voltages and theoretical power.

Parameters:
  • voltages – Array-like of voltage norms to test with this flexible parameter.

  • power – The input theoretical power of the load.

  • ax – The optional axis to use for the plot. The current axis is used by default.

Returns:

The axis on which the plot has been drawn and the resulting flexible powers (the input if not None else the computed values).

plot_control_q(voltages: ndarray[Any, dtype[float64]] | Quantity[ndarray[Any, dtype[float64]]] | Quantity[Sequence[float]] | Sequence[float | Quantity[float]], power: complex | Quantity[complex], ax: Axes | None = None) tuple[Axes, ndarray[Any, dtype[complex128]]]

Plot the flexible reactive power consumed (or produced) for the provided voltages and theoretical power.

Parameters:
  • voltages – Array-like of voltage norms to test with this flexible parameter.

  • power – The input theoretical power of the load.

  • ax – The optional axis to use for the plot. The current axis is used by default.

Returns:

The axis on which the plot has been drawn and the resulting flexible powers (the input if not None else the computed values).