PEG_opti/flux_continu.py
2023-12-12 00:16:16 +01:00

163 lines
4 KiB
Python

import numpy as np
import matplotlib.pyplot as plt
import PyQt5 as qt
def make_Y(n):
Y = np.zeros((n, n))
return Y
def connect_Y(x, y, Ys, Yp, Y):
Y[x, y] = -Ys
Y[y, x] = -Ys
Y[x, x] += Ys + Yp
Y[y, y] += Ys + Yp
def line_coor(n):
tab = []
i = 0
k = 1
while i < n:
while k < n:
tab += [[i, k]]
k += 1
i += 1
k = i + 1
return tab
def line_matrix(Y):
n = len(Y)
t = line_coor(n)
lS = np.zeros((len(t), n))
for i in range(len(t)):
e = t[i]
y = - Y[e[0], e[1]]
lS[i, e[0]] = y
lS[i, e[1]] = - y
return lS
def delta_select(i, S):
S = np.delete(S, (i), axis=0)
S = np.delete(S, (i), axis=1)
return S
def power_select(i, P):
P = np.array(P[:i].tolist() + P[i+1:].tolist())
return P
def complete_data(P, delta, i):
ndelta = np.array(delta[:i].tolist() + [0] + delta[i:].tolist())
nP = np.array(P[:i].tolist() + [-np.sum(P)] + P[i:].tolist())
return ndelta, nP
def demo1():
# Vn
Vn = 2e5
# Vecteur des puissances
P = np.array([1000, -500, -250, -250])
P = P * 1e6 # Passage en MW
# Création de la matrice d'admitances (dimension n)
Y = make_Y(4)
connect_Y(2, 3, 0.1, 0, Y)
connect_Y(1, 3, 0.15, 0, Y)
connect_Y(2, 1, 0.05, 0, Y)
connect_Y(2, 0, 0.05, 0, Y)
connect_Y(3, 0, 0.05, 0, Y)
print("Admittance matrix :", Y)
# Mise en place du système linéaire à résoudre
S = Y
S = delta_select(3, S) # dim n-1, sélection de l'angle de transport de référence (delta_3)
S *= Vn**2
print("System matrix :", S)
# Sélection des puissances (dimension n-1)
P = power_select(3, P)
print("Power input : ", P)
# Résolution (dimension n-1)
invS = np.linalg.inv(S)
print("Inverse : ", invS)
# Calcul des angles de transport (dimension n-1)
delta = np.dot(invS, P)
# Ajout de l'angle de transport d'origine et de la puissance associée (on repasse en dim n)
ndelta, nP = complete_data(P, delta, 3)
print("Power :", nP)
print("Delta (deg) :", ndelta * 180 / 3.1415)
# Calcul de la matrice de ligne
lS = line_matrix(Y)
print("Line matrix : ", lS)
# Calcul des puissances de lignes
line_power = Vn**2 * np.dot(lS, ndelta)
lcoor = line_coor(len(ndelta))
disp_line = []
for i in range(len(line_power)):
disp_line += [lcoor[i] + [line_power[i]]]
print("Line power : ", disp_line)
def demo2():
# Vn
Vn = 4e5
# Donnée de dimension
Dim = 3
NodeRef = 2
# Vecteur des puissances
P = np.array([500, 500, -1000])
P = P * 1e6 # Passage en MW
# Création de la matrice d'admitances (dimension n)
Y = make_Y(Dim)
connect_Y(0, 1, 25e-3, 0, Y)
connect_Y(0, 2, 20e-3, 0, Y)
connect_Y(1, 2, 50e-3, 0, Y)
print("Admittance matrix : \n", Y)
# Mise en place du système linéaire à résoudre
S = Y # dim n
S = delta_select(NodeRef, S) # dim n-1, sélection de l'angle de transport de référence (delta_3)
S *= Vn**2
print("System matrix : \n", S)
# Sélection des puissances (dimension n-1)
P = power_select(NodeRef, P)
print("Power input : \n", P)
# Résolution (dimension n-1)
invS = np.linalg.inv(S)
print("Inverse : \n", invS)
# Calcul des angles de transport (dimension n-1)
delta = np.dot(invS, P)
# Ajout de l'angle de transport d'origine et de la puissance associée (on repasse en dim n)
ndelta, nP = complete_data(P, delta, NodeRef)
print("Power : \n", nP)
print("Delta (deg) : \n", ndelta * 180 / 3.1415)
# Calcul de la matrice de ligne
lS = line_matrix(Y)
print("Line matrix : \n", lS)
# Calcul des puissances de lignes
line_power = Vn**2 * np.dot(lS, ndelta)
lcoor = line_coor(len(ndelta))
disp_line = []
for i in range(len(line_power)):
disp_line += [lcoor[i] + [int(line_power[i] * 1e-6)]]
print("Line power : \n", disp_line)
if __name__=="__main__":
# Exemple du cours
demo2()