flujo_nacional.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from __future__ import division
  2. from pyomo.environ import *
  3. from red.read import excel2net
  4. from red.create import *
  5. from red.create1 import *
  6. from red.makeBdc import makeBdc
  7. from utils.arr2dict import arr2dict
  8. from pyomo.environ import SolverFactory
  9. from pyomo.kernel import value
  10. from numpy import zeros, array
  11. from pandas import DataFrame, ExcelWriter
  12. def setmodel(file):
  13. print("{:=^100}".format(""))
  14. print("{:^100}".format(" Modelo de Predespacho Regional"))
  15. print("{:^100}".format(" Mercados Eléctricos de Centroamérica (c) 2020 "))
  16. print("{:=^100}".format(""))
  17. # ============================================================================
  18. # Importación de datos desde archivo Excel
  19. # ============================================================================
  20. #Parametros de la linea
  21. print("Leyendo información de red...")
  22. net = excel2net(file)
  23. bus = setbus(net)#Nodos
  24. branch = setbranch(net, bus)#Set lineas
  25. bu = branch[:, 5]#potenica max de la linea
  26. bl = branch[:, 6]#potenica min de la linea
  27. xc = branch[:,3]#Reactancia de la linea
  28. rc = branch[:,4]#Resistencia de la linea
  29. nb = bus.shape[0] #Numero de nodos
  30. nbr = branch.shape[0]#Numero de lineas
  31. A = makeBdc(bus, branch)#Matriz incidente
  32. brnames = branchnames(bus, branch)#Nombre de las lineas
  33. inc = A.toarray()*-1
  34. print("Leyendo información de los Despachos nacionales")
  35. dg=read_D_G(file)
  36. dem=setvariable(dg['demanda'])
  37. gen=setvariable(dg['generacion'])
  38. # Inicio del modelo de optimización
  39. model=ConcreteModel()
  40. #sets
  41. model.i=Set(initialize=range(0, nb))#numero de nodos
  42. model.c=Set(initialize=range(0, nbr))#Numero de lineas
  43. #Parametros
  44. #Parametros de la red
  45. model.rtmw_min= Param(model.c, initialize=dict(enumerate(bl)))
  46. model.rtmw_max= Param(model.c, initialize=dict(enumerate(bu)))
  47. model.Inc = Param(model.c, model.i, initialize=arr2dict(inc))
  48. model.Xc = Param(model.c, initialize=dict(enumerate(xc)))
  49. model.Rc = Param(model.c, initialize=dict(enumerate(rc)))
  50. #Parametros de los predespachos nacionales
  51. model.D = Param(model.i, initialize=dict(enumerate(dem)))
  52. model.G = Param(model.i, initialize=dict(enumerate(gen)))
  53. #Variable problema de optimizacion
  54. model.inyeccion= Var(model.i, domain=NonNegativeReals)#Inyeccion por nodo
  55. model.retiro= Var(model.i, domain=NonNegativeReals)#Retiro por nodo
  56. model.ref_angular_nacional= Var(model.i)#Fase del voltaje en el nodo
  57. model.rtmw_nacional= Var(model.c)#Flujo DC NACIONAL
  58. print(1)
  59. def balance_inyeccion_retiro_nacional(model,i):
  60. return (model.G[i] + sum(model.Inc[c,i]*model.rtmw_nacional[c] for c in model.c) - # Al dividir entre 100 Rc
  61. 0.5*sum(((model.Inc[c,i]*model.rtmw_nacional[c])**2)*(model.Rc[c]/100) for c in model.c) # toda la ec. se pasa a p.u.
  62. == model.D[i])
  63. model.balance_inyeccion_retiro_nacional_constraint= Constraint(model.i,rule=balance_inyeccion_retiro_nacional)
  64. def rtmw_min_restriccion(model,c):
  65. return (model.rtmw_nacional[c]>=-model.rtmw_min[c])
  66. model.rtmw_min_constraint= Constraint(model.c, rule=rtmw_min_restriccion)
  67. def rtmw_max_restriccion(model,c):
  68. return (model.rtmw_nacional[c]<=model.rtmw_max[c])
  69. model.rtmw_max_constraint= Constraint(model.c, rule=rtmw_max_restriccion)
  70. def flujo_potencia_actica_nacional(model,c):
  71. return ((model.Xc[c])*model.rtmw_nacional[c]+sum(model.Inc[c,i]*model.ref_angular_nacional[i] for i in model.i)== 0)
  72. model.flujo_potencia_actica_nacional_constraint= Constraint(model.c, rule=flujo_potencia_actica_nacional)
  73. print("Construcción del modelo terminada.")
  74. opt = SolverFactory('ipopt')
  75. #opt.options['max_iter']= 15000
  76. result = opt.solve(model)
  77. model.solutions.store_to(result)
  78. # Construcción de array para grabar
  79. # =============================================================================
  80. flujos = brnames.copy()
  81. f2= array(list(model.rtmw_nacional.get_values().values()))
  82. perdidas=zeros(nbr)
  83. for c in model.c:
  84. perdidas[c]=(f2[c]**2)*rc[c]/100
  85. flujos['Flujo Nacional']=f2
  86. flujos['Perdidas Nacionales'] = perdidas
  87. writer=ExcelWriter("Resultados_predespacho_nacionales.xlsx")
  88. flujos.to_excel(writer,'IEP-RTR',index=False)
  89. writer.save()
  90. print("{:=^100}".format(""))
  91. print("{:^100}".format(" Script Finalizado "))
  92. print("{:^100}".format(" Mercados Eléctricos de Centroamérica (c) 2020 "))
  93. print("{:=^100}".format(""))
  94. #print(result)
  95. return 0