import dependencies
import cmath
import numpy as np
import pandas as pd
from IPython.display import display, HTML
import itertools
from nummath import graphing
# fundamentele netfrequentie
f1 = 50.0 # Hz
w1 = 2.0 * np.pi * f1 # rad/s
# lijnspanning van het net
U_l = cmath.rect(404.0, 0.0) # V
Capaciteit
C = 77.0e-6 # F (Farad)
Nominale spanning
U_cn = cmath.rect(500.0, 0.0) # V (Volt)
Nominale impedantie
Z_cn = complex(0.0, -1.0/(w1 * C)) # Ohm
Nominale stroom
I_cn = U_cn / Z_cn # A
display(HTML(f'Nominale stroom van de condensator = <b>{abs(I_cn):.3f}</b> A'))
Reactief vermogen van de schakeltrappen
Q_t1 = Q_t2 = 3 * U_l ** 2 / Z_cn # VAr
display(HTML(f'3fasig reactief vermogen van de trappen 1 and 2 = <b>{abs(Q_t1):.3f}</b> VAr'))
Gecombineerde impedantie van de parallelgeschakelde condensatoren
Z_cp = 1 / (2 * (1 / Z_cn))
Reactief vermogen van de schakeltrappen
Q_t3 = Q_t4 = 3 * U_l ** 2 / Z_cp # VAr
display(HTML(f'3fasig reactief vermogen van de trappen 3 and 4 = <b>{abs(Q_t3):.3f}</b> VAr'))
Reactief vermogen van de schakelcombinaties
# lijst van de reactieve vermogens van elke schakeltrap
Q = [Q_t1, Q_t2, Q_t3, Q_t4]
# zoek alle mogelijke combinaties van schakeltrappen en bereken het totaal reactief vermogen van elke combinatie
Q_comb = []
for r in range(1, len(Q) + 1):
combinations = itertools.combinations(Q, r)
for combination in combinations:
Q_comb.append(sum(combination))
# verwijder identieke resultaten uit de lijst en sorteer de lijst van klein naar groot
Q_comb = list(set(Q_comb))
Q_comb.sort(key=lambda Q: abs(Q))
# geef het reactief vermogen weer van elke unieke schakelcombinatie
results = ['<ul>']
for i, Q in enumerate(Q_comb):
results.append(f'<li>Combinatie <b>{i + 1}</b>: reactief vermogen = <b>{abs(Q):.3f}</b> VAr</li>')
results.append('</ul>')
display(HTML(''.join(results)))
Impedantie en overeenkomstige capaciteit van de schakelcombinaties in driehoek
Zd_comb = [3 * U_l ** 2 / Q for Q in Q_comb]
Cd_comb = [-1j/(w1 * Z) for Z in Zd_comb]
results = ['<ul>']
for i, C in enumerate(Cd_comb):
results.append(f'<li>Combinatie <b>{i + 1}</b>: capaciteit = <b>{C.real:.3e}</b> F</li>')
results.append('</ul>')
display(HTML(''.join(results)))
Driehoek-ster-transformatie van de schakelcombinaties
Het driefasig netwerk wordt herleid naar een equivalent eenfasig netwerk t.b.h. van de netwerkberekeningen. Daartoe moeten de driehoek geschakelde schakelcombinaties worden getransformeerd naar equivalente sterschakelingen.
Zy_comb = [Z / 3 for Z in Zd_comb]
Cy_comb = [-1j/(w1 * Z) for Z in Zy_comb]
# Geef de capaciteit van de schakelcombinaties weer indien voorgesteld door een equivalente sterschakeling
results = ['<ul>']
for i, C in enumerate(Cy_comb):
results.append(f'<li>Combinatie <b>{i + 1}</b>: capaciteit = <b>{C.real:.3e}</b> F</li>')
results.append('</ul>')
display(HTML(''.join(results)))
Impedantie en inductiecoëfficiënt van de transformator
De ohmse weerstand en de reactantie van de transformator bij de fundamentele netfrequentie (50 Hz) zijn gegeven.
# Transformatorimpedantie bij 50 Hz (fundamentele netfrequentie)
R_tr = 8.7494e-3
X_tr = 26.8336e-3
Z_tr = complex(R_tr, X_tr)
Daarmee kan de inductiecoëfficiënt van de transformator worden berekend:
# Inductiecoëfficiënt
L_tr = X_tr / w1
display(HTML(f'Inductiecoëfficiënt = <b>{L_tr:.3e}</b> H'))
We injecteren in de parallelschakeling een harmonische stroom met effectieve waarde van 1 A:
# harmonische bronstroom die naar de parallelschakeling stroomt: 1 A
I_h = complex(1.0, 0.0)
We zullen dit herhalen voor frequenties gaande van 50 Hz tot en met 1.250 Hz:
# frequentiebereik [Hz]
f_range = np.arange(50.0, 1300.0, 1)
w_range = 2 * np.pi * f_range # pulsatiefrequentie [rad/s]
# harmonische rangorde
h_range = f_range / f1
Voor elke mogelijke schakelcombinatie van de condensatorbatterij worden in het codeblok hieronder berekend:
results = []
# voor elke schakelcombinatie...
for C in Cy_comb:
r = {}
# resonantiepulsatiefrequentie [rad/s]
r['w_res'] = np.sqrt(1 / (L_tr * C) - (R_tr / L_tr) ** 2)
# resonantiefrequentie [Hz]
r['f_res'] = (r['w_res'] / (2 * np.pi)).real
# harmonische orde
r['h_res'] = int(round(r['f_res'] / f1))
# impedantie van de parallelschakeling bij resonantie [ohm]
r['Z_res'] = L_tr / (R_tr * C)
# impedantie van de schakelcombinatie van de condensatorbatterij
r['Z_cb'] = -1j / (w_range * C)
# impedantie van de transformator
r['Z_tr'] = R_tr + 1j * w_range * L_tr
# impedantie van de parallelschakeling
r['Z_par'] = 1 / (1 / r['Z_cb'] + 1 / r['Z_tr'])
# spanning over de parallelschakeling
r['U_par'] = r['Z_par'] * I_h
# stroom door de transformator
r['I_tr'] = r['U_par'] / r['Z_tr']
# stroom door de condensatorbatterij
r['I_cb'] = r['U_par'] / r['Z_cb']
results.append(r)
results_ = ['<ul>']
for i, r in enumerate(results):
results_.append(f"<li>Combinatie <b>{i + 1}</b>: resonantiefrequentie = <b>{r['f_res']:.3f}</b> Hz (= orde <b>{r['h_res']})</b></li>")
results_.append('</ul>')
display(HTML(''.join(results_)))
graph = graphing.Graph(fig_size=[8, 8], dpi=96)
for i, r in enumerate(results):
graph.add_data_set(name=f"combinatie {i + 1}", x=h_range, y=np.abs(r['Z_par']))
graph.add_legend()
graph.set_axis_titles(x_title='harmonische orde', y_title='modulus impedantie [Ohm]')
graph.scale_x_axis(lim_min=1, lim_max=int(h_range[-1]), tick_step=1)
graph.turn_grid_on()
graph.draw_graph()
graph.show_graph()
graph = graphing.Graph(fig_size=[8, 8], dpi=96)
for i, r in enumerate(results):
graph.add_data_set(name=f"combinatie {i + 1}", x=h_range, y=np.degrees(np.angle(r['Z_par'])))
graph.add_legend()
graph.set_axis_titles(x_title='harmonische orde', y_title='argument impedantie [°]')
graph.scale_x_axis(lim_min=1, lim_max=int(h_range[-1]), tick_step=1)
graph.scale_y_axis(lim_min=-100, lim_max=100, tick_step=10)
graph.turn_grid_on()
graph.draw_graph()
graph.show_graph()
graph = graphing.Graph(fig_size=[8, 8], dpi=96)
for i, r in enumerate(results):
graph.add_data_set(name=f"combinatie {i + 1}", x=h_range, y=np.abs(r['U_par']))
graph.add_legend()
graph.set_axis_titles(x_title='harmonische orde', y_title='effectieve spanning [V]')
graph.scale_x_axis(lim_min=1, lim_max=int(h_range[-1]), tick_step=1)
graph.turn_grid_on()
graph.draw_graph()
graph.show_graph()
graph = graphing.Graph(fig_size=[8, 8], dpi=96)
for i, r in enumerate(results):
graph.add_data_set(name=f"combinatie {i + 1}", x=h_range, y=np.abs(r['I_cb']))
graph.add_legend()
graph.set_axis_titles(x_title='harmonische orde', y_title='effectieve lijnstroom condensatorbatterij [A]')
graph.scale_x_axis(lim_min=1, lim_max=int(h_range[-1]), tick_step=1)
graph.turn_grid_on()
graph.draw_graph()
graph.show_graph()
Noteer dat harmonische stromen in de installatie met een frequentie rond de resonantiefrequentie van de parallelschakeling van transformator en condensatorbatterij stromen door de condensatorbatterij veroorzaken die vele keren groter zijn (stroomopslingering).
De berekende stromen zijn de lijnstromen naar de condensatorbatterij. Om de fasestromen te bekomen die door de driehoekgeschakelde condensatoren vloeien, dienen deze lijnstromen nog gedeeld door de vierkantswortel van 3:
graph = graphing.Graph(fig_size=[8, 8], dpi=96)
for i, r in enumerate(results):
graph.add_data_set(name=f"combinatie {i + 1}", x=h_range, y=np.abs(r['I_cb']) / np.sqrt(3))
graph.add_legend()
graph.set_axis_titles(x_title='harmonische orde', y_title='effectieve fasestroom condensatorbatterij [A]')
graph.scale_x_axis(lim_min=1, lim_max=int(h_range[-1]), tick_step=1)
graph.turn_grid_on()
graph.draw_graph()
graph.show_graph()