Impedance loads (Z)

They represent loads for which the impedance is considered constant, i.e. the power is proportional to the square of the voltage.

ZIP equation: \(S = 0 \times V^0 + 0 \times V^1 + z \times V^2 \implies S \propto V^2\)

Equations

The equations are the following (star loads):

\[\begin{split}\left\{ \begin{aligned} \underline{I_{\mathrm{abc}}} &= \frac{\underline{V_{\mathrm{abc}}}-\underline{V_{\mathrm{n}}}}{ \underline{Z_{\mathrm{abc}}}} \\ \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}}} &= \frac{\underline{V_{\mathrm{a}}}-\underline{V_{\mathrm{b}}}}{\underline{Z_{\mathrm{ab}}}} \\ \underline{I_{\mathrm{bc}}} &= \frac{\underline{V_{\mathrm{b}}}-\underline{V_{\mathrm{c}}}}{\underline{Z_{\mathrm{bc}}}} \\ \underline{I_{\mathrm{ca}}} &= \frac{\underline{V_{\mathrm{c}}}-\underline{V_{\mathrm{a}}}}{\underline{Z_{\mathrm{ca}}}} \end{aligned} \right.\end{split}\]

Example

import functools as ft
import numpy as np
import roseau.load_flow as rlf

# Two buses
bus1 = rlf.Bus(id="bus1", phases="abcn")
bus2 = rlf.Bus(id="bus2", phases="abcn")

# A line
lp = rlf.LineParameters(id="lp", z_line=rlf.Q_(0.35 * np.eye(4), "ohm/km"))
line = rlf.Line(id="line", bus1=bus1, bus2=bus2, parameters=lp, length=rlf.Q_(1, "km"))

# A voltage source on the first bus
un = 400 / np.sqrt(3)
voltages = rlf.Q_(un * np.exp([0, -2j * np.pi / 3, 2j * np.pi / 3]), "V")
vs = rlf.VoltageSource(id="source", bus=bus1, voltages=voltages)

# The neutral of the voltage source is fixed at potential 0
pref = rlf.PotentialRef(id="pref", element=bus1, phase="n")

# A power load on the second bus
load = rlf.ImpedanceLoad(
    id="load", bus=bus2, impedances=rlf.Q_(np.array([40 + 3j, 40 + 3j, 40 + 3j]), "ohm")
)

# Create a network and solve a load flow
en = rlf.ElectricalNetwork.from_element(bus1)
en.solve_load_flow()

# Get the impedances of the load (the result is equal to the provided impedance
load.res_voltages / load.res_currents[:3]
# array([40.+3.j, 40.+3.j, 40.+3.j]) <Unit('volt / ampere')>

# Get the voltages of the network
en.res_buses_voltages.transform([np.abs, ft.partial(np.angle, deg=True)])
# |                |   ('voltage', 'absolute') |   ('voltage', 'angle') |
# |:---------------|--------------------------:|-----------------------:|
# | ('bus1', 'an') |                   230.94  |           -6.40192e-19 |
# | ('bus1', 'bn') |                   230.94  |         -120           |
# | ('bus1', 'cn') |                   230.94  |          120           |
# | ('bus2', 'an') |                   228.948 |            0.0370675   |
# | ('bus2', 'bn') |                   228.948 |         -119.963       |
# | ('bus2', 'cn') |                   228.948 |          120.037       |

# Modify the load value to create an unbalanced load
load.impedances = rlf.Q_(np.array([40 + 4j, 20 + 2j, 10 + 1j]), "ohm")
en.solve_load_flow()

# Get the impedance of the load
load.res_voltages / load.res_currents[:3]
# array([40.+4.j, 20.+2.j, 10.+1.j]) <Unit('volt / ampere')>

# Get the voltages of the network
en.res_buses_voltages.transform([np.abs, ft.partial(np.angle, deg=True)])
# |                |   ('voltage', 'absolute') |   ('voltage', 'angle') |
# |:---------------|--------------------------:|-----------------------:|
# | ('bus1', 'an') |                   230.94  |               0        |
# | ('bus1', 'bn') |                   230.94  |            -120        |
# | ('bus1', 'cn') |                   230.94  |             120        |
# | ('bus2', 'an') |                   232.313 |              -0.792296 |
# | ('bus2', 'bn') |                   228.33  |            -118.76     |
# | ('bus2', 'cn') |                   218.703 |             119.891    |