Note

You can download this example as a Jupyter notebook or start it in interactive mode.

Transformer with non-trivial phase shift and tap ratio

This example is a copy of pandapower’s minimal example.

[1]:
import pypsa
import numpy as np
import pandas as pd
[2]:
network = pypsa.Network()

network.add("Bus","MV bus",v_nom=20, v_mag_pu_set=1.02)
network.add("Bus","LV1 bus",v_nom=.4)
network.add("Bus","LV2 bus",v_nom=.4)

network.add("Transformer", "MV-LV trafo", type="0.4 MVA 20/0.4 kV", bus0="MV bus", bus1="LV1 bus")
network.add("Line", "LV cable", type="NAYY 4x50 SE",bus0="LV1 bus", bus1="LV2 bus", length=0.1)
network.add("Generator", "External Grid", bus="MV bus", control="Slack")
network.add("Load", "LV load", bus="LV2 bus", p_set=0.1, q_set=0.05)
[3]:
def run_pf():
    network.lpf()
    network.pf(use_seed=True)
    return pd.DataFrame({'Voltage Angles': network.buses_t.v_ang.loc['now']*180./np.pi,
                        'Volate Magnitude': network.buses_t.v_mag_pu.loc['now']})
[4]:
run_pf()
INFO:pypsa.pf:Performing linear load-flow on AC sub-network SubNetwork 0 for snapshot(s) Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Performing non-linear load-flow on AC sub-network SubNetwork 0 for snapshots Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Newton-Raphson solved in 3 iterations with error of 0.000000 in 0.021245 seconds
[4]:
Voltage Angles Volate Magnitude
Bus
MV bus 0.000000 1.020000
LV1 bus -150.760126 1.008843
LV2 bus -149.884141 0.964431
[5]:
network.transformers.tap_position = 2
run_pf()
INFO:pypsa.pf:Performing linear load-flow on AC sub-network SubNetwork 0 for snapshot(s) Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Performing non-linear load-flow on AC sub-network SubNetwork 0 for snapshots Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Newton-Raphson solved in 3 iterations with error of 0.000000 in 0.022213 seconds
[5]:
Voltage Angles Volate Magnitude
Bus
MV bus 0.000000 1.020000
LV1 bus -150.843911 0.959655
LV2 bus -149.870837 0.912713
[6]:
network.transformers.tap_position = -2
run_pf()
INFO:pypsa.pf:Performing linear load-flow on AC sub-network SubNetwork 0 for snapshot(s) Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Performing non-linear load-flow on AC sub-network SubNetwork 0 for snapshots Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Newton-Raphson solved in 3 iterations with error of 0.000000 in 0.022197 seconds
[6]:
Voltage Angles Volate Magnitude
Bus
MV bus 0.000000 1.020000
LV1 bus -150.681666 1.063133
LV2 bus -149.896634 1.021202

Now play with tap changer on LV side

[7]:
new_trafo_lv_tap = network.transformer_types.loc[["0.4 MVA 20/0.4 kV"]]
new_trafo_lv_tap.index = ["New trafo"]
new_trafo_lv_tap.tap_side = 1
new_trafo_lv_tap.T
[7]:
New trafo
f_nom 50.0
s_nom 0.4
v_nom_0 20.0
v_nom_1 0.4
vsc 6.0
vscr 1.425
pfe 1.35
i0 0.3375
phase_shift 150.0
tap_side 1
tap_neutral 0
tap_min -2
tap_max 2
tap_step 2.5
references pandapower;Oswald - Transformatoren - Vorlesun...
[8]:
network.transformer_types = network.transformer_types.append(new_trafo_lv_tap)
network.transformers.type = "New trafo"
network.transformers.tap_position = 2
run_pf()
/tmp/ipykernel_4978/2416978983.py:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  network.transformer_types = network.transformer_types.append(new_trafo_lv_tap)
INFO:pypsa.pf:Performing linear load-flow on AC sub-network SubNetwork 0 for snapshot(s) Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Performing non-linear load-flow on AC sub-network SubNetwork 0 for snapshots Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Newton-Raphson solved in 3 iterations with error of 0.000000 in 0.021798 seconds
[8]:
Voltage Angles Volate Magnitude
Bus
MV bus 0.000000 1.020000
LV1 bus -150.755820 1.059317
LV2 bus -149.964875 1.017221
[9]:
network.transformers.T
[9]:
Transformer MV-LV trafo
attribute
bus0 MV bus
bus1 LV1 bus
type New trafo
model t
x 0.058283
r 0.01425
g 0.003375
b -0.0
s_nom 0.4
s_nom_extendable False
s_nom_min 0.0
s_nom_max inf
s_max_pu 1.0
capital_cost 0.0
num_parallel 1.0
tap_ratio 1.05
tap_side 1
tap_position 2
phase_shift 150.0
build_year 0
lifetime inf
v_ang_min -inf
v_ang_max inf
sub_network 0
x_pu 0.145712
r_pu 0.035618
g_pu 0.00135
b_pu -0.0
x_pu_eff 0.152994
r_pu_eff 0.037406
s_nom_opt 0.0
[10]:
network.transformers.tap_position = -2
run_pf()
INFO:pypsa.pf:Performing linear load-flow on AC sub-network SubNetwork 0 for snapshot(s) Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Performing non-linear load-flow on AC sub-network SubNetwork 0 for snapshots Index(['now'], dtype='object', name='snapshot')
INFO:pypsa.pf:Newton-Raphson solved in 3 iterations with error of 0.000000 in 0.022144 seconds
[10]:
Voltage Angles Volate Magnitude
Bus
MV bus 0.000000 1.020000
LV1 bus -150.765232 0.958366
LV2 bus -149.789394 0.911353

Now make sure that the phase shift is also there in the LOPF

[11]:
network.generators.p_nom = 1.
network.lines.s_nom = 1.
network.lopf()
pd.DataFrame({'Voltage Angles': network.buses_t.v_ang.loc['now']*180./np.pi,
                        'Volate Magnitude': network.buses_t.v_mag_pu.loc['now']})
INFO:pypsa.opf:Performed preliminary steps
INFO:pypsa.opf:Building pyomo model using `kirchhoff` formulation
INFO:pypsa.opf:Solving model using glpk
INFO:pypsa.opf:Optimization successful
# ==========================================================
# = Solver Results                                         =
# ==========================================================
# ----------------------------------------------------------
#   Problem Information
# ----------------------------------------------------------
Problem:
- Name: unknown
  Lower bound: 0.0
  Upper bound: 0.0
  Number of objectives: 1
  Number of constraints: 8
  Number of variables: 4
  Number of nonzeros: 10
  Sense: minimize
# ----------------------------------------------------------
#   Solver Information
# ----------------------------------------------------------
Solver:
- Status: ok
  Termination condition: optimal
  Statistics:
    Branch and bound:
      Number of bounded subproblems: 0
      Number of created subproblems: 0
  Error rc: 0
  Time: 0.0022733211517333984
# ----------------------------------------------------------
#   Solution Information
# ----------------------------------------------------------
Solution:
- number of solutions: 0
  number of solutions displayed: 0
/home/docs/checkouts/readthedocs.org/user_builds/pypsa/conda/v0.19.1/lib/python3.10/site-packages/pypsa/opf.py:1293: FutureWarning: Using the level keyword in DataFrame and Series aggregations is deprecated and will be removed in a future version. Use groupby instead. df.sum(level=1) should use df.groupby(level=1).sum().
  pd.concat({c.name:
[11]:
Voltage Angles Volate Magnitude
Bus
MV bus 0.000000 1.0
LV1 bus -0.793104 1.0
LV2 bus -1.090326 1.0