makeBdc.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. # -*- coding: utf-8 -*-
  2. # =============================================================================
  3. # Copyright (C) 2018 Mercados Electricos de Centroamérica. All rights reserved
  4. # =============================================================================
  5. """
  6. Construye las matrices B para el cálculo de flujos DC
  7. """
  8. from numpy import ones, r_, zeros
  9. from scipy.sparse import csr_matrix as sparse
  10. from utils.idx_brch import BUS_I, BUS_J, X
  11. def makeBdc(bus, branch):
  12. """Construye las matrices B para el cálculo de flujos DC.
  13. Se construye primer la matriz de incidencia Cft (o matriz A, como se denomina en la formulación de substas de
  14. Derechos Firmes) y se define como:
  15. El valor será uno (1) para las líneas ij donde su nodo inicial sea igual al nodo i y menos uno (-1) para las lineas
  16. ij cuyo nodo final sea igual al nodo j.
  17. La matriz de incidencias Cft tiene dimenciones C{nbr x nb}, en donde C{nbr}es el numero de líneas (branches) y
  18. C{nb} el número de buses.
  19. Luego se calcula la matriz Bf (ZZ) de dimensiones C{nbr x nb}, en donde C{nbr} es el numero de líneas (branches) y
  20. C{nb} el número de buses, igual que la Matriz de Incidencias.
  21. Contiene los mismos elementos nulos que la matriz Cft y cuyas componentes no nulas son:
  22. 1. Para la componente correspondiente a la fila de cada circuito br,y cuya columna corresponde al nodo de
  23. llegada del circuito b
  24. :math:`Bf[br,b] = 1/Xbr`
  25. 2. Para la componente correspondiente a la fila de cada circuito br, y cuya columna corresponde al nodo de
  26. salida del circuito b
  27. :math:`Bf[br,b] = -1/Xbr`
  28. La matriz Bbus se calcula como la transpuesta de la matriz de incidencias Cft por la matriz Bf
  29. :math:`Bbus = Cft.T * Bf`
  30. .. codeauthor:: Oscar A. Leiva (MERELEC)
  31. """
  32. # constantes
  33. nb = bus.shape[0]
  34. nbr = branch.shape[0]
  35. # construye la matriz de incidencia Cft
  36. f = branch[:, BUS_I].astype(float) # lista de buses de origen
  37. t = branch[:, BUS_J].astype(float) # lista de buses de destino
  38. i = r_[range(nbr), range(nbr)] # Set doble de indices de filas
  39. # Matriz de incidencia
  40. Cft = sparse((r_[ones(nbr), -ones(nbr)], (i, r_[f, t])), (nbr, nb))
  41. #print(Cft)
  42. return Cft