En esta ocasión traigo un breve tutorial realizado en iPython de como calcular la matriz Ybus sin la necesidad de ciclos que sólo entorpecen el programa. Se utilizan matrices de conectividad y transformaciones lineales para llegar al objetivo. La teoría la he documentado en un pdf.
Formación de la matriz Ybus
In [1]:
# Importamos las librerías necesarias
from cvxopt import matrix, spmatrix, sparse, mul, div, exp
import numpy as np
from cmath import pi
In [2]:
# Número de nodos del sistema
m = 5
# Número de líneas
nl = 7
# Resistencia de las líneas
R = matrix([0.02, 0.08, 0.06, 0.06, 0.04, 0.01, 0.08])
# Reactancia inductiva de las líneas
X = matrix([0.06, 0.24, 0.18, 0.18, 0.12, 0.93, 0.24])
# Un medio de la suceptancia de carga en las líneas
B = matrix([0.03, 0.025, 0.02, 0.02, 0.015, 0.01, 0.025])
# En este caso no se tienen inyecciones de potencia activa ni reactiva. Las matrices serán de ceros
Bs = matrix(0,(m,1),'d')
Gs = matrix(0,(m,1),'d')
# Vector complejo (se requiere que sea complejo más adelante)
# con el tap en el que se encuentra el transformador. Para el caso de líneas es 1
Tap = matrix(1,(nl,1),'z')
# Angulo de defasamiento para los transformadores defasadores. Para el caso de líneas es 0
Angulo = matrix(0,(nl,1),'d')
# Lista que indica si está activo el elemento. 1=Activo, 0= Inactivo o abierto
Activo = matrix(1,(nl,1),'d')
# Índices de los nodos de envío. Se utiliza n-1, siendo n el nodo real, debido a la indexación
# de Pyton que comienza desde el 0 y no desde el 1
NP = [0, 0, 1, 1, 1, 2, 3]
# Índices de los nodos de llegada
NQ = [1, 2, 2, 3, 4, 3, 4]
In [3]:
Ys = div(Activo, (R + 1j * X))
print Ys
In [4]:
Bc = mul(Activo, B)
print Bc
In [5]:
Tap = mul(Tap, exp(Angulo * pi * 1j / 180))
print Tap
In [6]:
Ypp = Ys + 1j * Bc
print Ypp
In [7]:
Yqq = div(Ypp, mul(Tap, Tap.H.T))
print Yqq
In [8]:
Ypq = -div(Ys, Tap.H.T)
print Ypq
In [9]:
Yqp = -div(Ys, Tap)
print Yqp
In [10]:
Ysh = (Gs + 1j * Bs)
print Ysh
In [11]:
Cp = spmatrix(1, range(nl), NP, (nl, m))
print Cp
In [12]:
Cq = spmatrix(1, range(nl), NQ, (nl, m))
print Cq
In [13]:
i = 2 * range(nl)
print i
In [14]:
Yp = spmatrix(np.r_[Ypp, Ypq], i, np.r_[NP, NQ], (nl, m), 'z')
Yq = spmatrix(np.r_[Yqp, Yqq], i, np.r_[NP, NQ], (nl, m), 'z')
print Yp
print Yq
In [15]:
Ybus = Cp.T * Yp + Cq.T * Yq + spmatrix(Ysh, range(m), range(m), (m, m), 'z')
print Ybus
No hay comentarios:
Publicar un comentario