Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Modelo de Flujo Optimo de Potencia Utilizando Tecnicas de Optimizacion
Modelo de Flujo Optimo de Potencia Utilizando Tecnicas de Optimizacion
INGENIERO ELECTRICISTA
POR:
OCTUBRE 2011
ANTIGUO CUSCATLN, EL SALVADOR, C.A.
RECTOR
ANDREU OLIVA DE LA ESPERANZA, S.J.
SECRETARIA GENERAL
CELINA PREZ RIVERA
LECTOR
DAVID ADONAY MURCIA ANDRADE
RESUMEN EJECUTIVO
Hoy en da, la electricidad es, sin lugar a dudas, el principal motor que impulsa las actividades en
cualquier pas y permite su desarrollo.
Un sistema elctrico de potencia (SEP), es el conjunto de centrales generadoras, de lneas de
transmisin interconectadas mediante centros de transformacin (subestaciones) y redes de
distribucin esenciales para el suministro de energa elctrica.
Todos los sistemas de potencia deben estar diseados para adaptarse a sus usuarios respetando
varios criterios de calidad en el servicio. Estos criterios se refieren a los valores mnimo y mximo
de la tensin en los puntos de entrega, la frecuencia de mxima excursin en el valor nominal, etc.
El problema de flujo de potencia es calcular la magnitud del voltaje y el ngulo de fase en cada bus
de un sistema de potencia en condiciones de estado estable trifsico. Como subproducto de este
clculo, se pueden calcular flujos de potencia real y reactiva en equipo como lneas de transmisin
y transformadores, as como prdidas de equipo.
El punto de partida para un problema de flujo de potencia es un diagrama unifilar del sistema de
potencia, a partir del cual se pueden obtener los datos de entrada para las soluciones por
computadora.
Es de tener en cuenta que no solo importa la solucin de flujos de potencia para la satisfaccin de
la demanda, tambin es muy importante el aspecto econmico, por lo cual en este trabajo de
graduacin tambin se enfatizara en la resolucin de flujos de potencia ptimo. Su principal
objetivo es optimizar las condiciones de operacin en estado estacionario de un sistema elctrico
de potencia. Un OPF ajusta las cantidades controlables para optimizar una funcin objetivo
mientras satisface un conjunto de restricciones operativas.
Una funcin objetivo puede incorporar aspectos econmicos, de seguridad o medioambientales,
que se resuelve utilizando tcnicas de optimizacin adecuadas. Las restricciones son leyes fsicas
que gobiernan a los generadores, el sistema de transmisin, lmites constructivos de los equipos
elctricos y estrategias operativas.
ii
NDICE
RESUMEN EJECUTIVO .......................................................................................................................i
NDICE DE FIGURAS ..........................................................................................................................v
PRLOGO ......................................................................................................................................... vii
CAPITULO 1. MODELADO DE LOS ELEMENTOS DEL SISTEMA DE POTENCIA ........................ 1
1.1 Modelado de lneas de transmision .......................................................................................... 1
1.1.1 CIircuitos equivalentes de lneas de transmision ............................................................... 2
1.2 Modelado de los transformadores............................................................................................. 5
1.2.1 Circuitos equivalentes por unidad de transformadores trifsicos balanceados de dos
devanados ................................................................................................................................... 6
1.2.2 Transformadores de tres devanados ................................................................................. 7
CAPITULO 2. FLUJOS DE POTENCIA .............................................................................................. 9
2.1 Introduccion ............................................................................................................................... 9
2.2 Metodo de Newton-Raphson .................................................................................................. 10
2.3 El problema de flujo de potencia ............................................................................................. 13
2.4 Solucion de flujos de potencia por el mtodo de Newton-Raphson ....................................... 15
CAPITULO 3. PROGRAMA DE FLUJOS DE POTENCIA ................................................................ 19
3.1 Mosulos de programacin en PYTHON .................................................................................. 20
3.2 Modulo de Carga .................................................................................................................... 21
3.3 Modulo de ybus ...................................................................................................................... 22
3.4 Modulo Newton ....................................................................................................................... 23
3.5 Modulo fpotencia ..................................................................................................................... 25
3.6 Modulo salida .......................................................................................................................... 26
3.7 Ejemplo de flujo de potencia .................................................................................................. 27
3.8 Flujo de potencia en un sistema de catorce nodos................................................................. 32
CAPITULO 4. FLUJO PTIMO DE POTENCIA ............................................................................... 35
4.1 Introduccion ............................................................................................................................. 35
4.2 El problema de flujo optimo de potencia ................................................................................. 36
4.2.1 Formulacion general ........................................................................................................ 36
4.2.2 Variables .......................................................................................................................... 37
4.2.3 Funcion objetivo ............................................................................................................... 38
4.2.4 Restricciones de igualdad ................................................................................................ 39
4.2.5 Restricciones de desigualdad .......................................................................................... 39
4.3 Casos de flujo optimo de potencia (OPF). .............................................................................. 41
iii
4.3.1 OPF de un sistema de dos nodos y modelado AC: sin restricciones de desigualdad. Por
mtodo de Newton-Raphson ..................................................................................................... 41
4.3.2 OPF de un sistema multimodal y modelado DC: sin restricciones de desigualdad. Por
mtodo de Newton-Raphson ..................................................................................................... 47
CAPITULO 5. CONCLUSIONES Y RECOMENDACIONES ............................................................. 55
5.1 Conclusiones ........................................................................................................................... 55
5.2 Recomendaciones ................................................................................................................... 55
BIBLIOGRAFIA .................................................................................................................................. 57
ANEXOS
ANEXO A. PROGRAMA DE FLUJOS DE POTENCIA
ANEXO B. PROGRAMA DE FLUJO OPTIMO DEPOTENCIA (OPF) MODELO AC
ANEXO C. PROGRAMA DE FLUJO OPTIMO DE POTENCIA (OPF) MODELO DC
iv
INDICE DE FIGURAS
Figura 1.1 Modelo lnea corta ............................................................................................................. 1
Figura 1.2 Modelo lnea media ............................................................................................................ 1
Figura 1.3 Modelo lnea larga ............................................................................................................. 2
Figura 1.4 Modelo
nominal .............................................................................................................. 2
equivalente......................................................................................................... 4
vi
PRLOGO
El objetivo principal de este trabajo es el disear un programa que sea capaz de solucionar el
problema de flujo de carga para cualquier sistema elctrico de potencia que se desee analizar. As
como implementar un programa capaz de resolver problemas de flujo ptimo de potencia. En base
a esto se tiene que tener en cuenta que:
Para la aplicacin de cualquier mtodo para la solucin de un flujo de carga, requiere un
conocimiento detallado de los elementos que componen un sistema de potencia. En este sentido el
capitulo 1 presenta una revisin a los componentes o elementos que se tomaran en cuenta para el
anlisis del flujo de potencia, presentando como se modela cada uno de estos componentes.
En el capitulo 2, se presenta el mtodo de solucin para el flujo de carga, detallando el mtodo de
una forma general y grafica para la comprensin de este. Se plantea tambin el problema del flujo
de potencia el cual es calcular la magnitud del voltaje y el ngulo de fase en cada uno de los buses
del sistema. Al final del capitulo se presenta la solucin del flujo de potencia por el mtodo de
Newton-Raphson.
A lo largo del capitulo 3 se elabora el programa para la solucin del flujo de potencia, as como los
mdulos que conforman este programa detallando cada uno de estos. Tambin se presenta un
problema sencillo de un sistema de 3 nodos al cual se le aplica el programa elaborado para la
solucin de este. Adems se resuelve un sistema de potencia compuesto por 14 nodos
presentando sus resultados y comparndolos con otro programa.
En el capitulo 4 y ultimo, se define lo que es un flujo optimo de potencia, as como el problema de
flujo optimo de potencia. Se presenta su formulacin general, variables y sus restricciones, por
ltimo se resuelve 2 sistemas de potencia, uno modelando AC y el otro modelado DC el cual se
proceder a realizar un programa de forma general para el modelo DC.
vii
viii
CIRCUITO
NOMINAL
nominal
es:
Ec.1.1
Ec.1.4
es la tensin en el extremo emisor y
Ec.1.6
Sustituyendo
en
se tiene:
Ec.1.7
Donde:
Ec.1.8
Ec.1.9
Ec.1.10
La constante B es la relacin
sin carga.
Ec.1.11
CIRCUITO
EQUIVALENTE
nominal, son:
Ec.1.12
Ec.1.13
Ec.1.14
equivalente
Ec.1.15
Ec.1.16
con Ec.1.13
Ec.1.17
del circuito
nominal,
Ec.1.18
En donde
por unidad
De modo similar, igualando la ecuacin (1.1.12) con
Ec.1.19
por unidad,
Ec.1.20
Usando la ecuacin (1.1.17) y la identidad
del circuito
nominal,
Ec.1.22
En donde
por unidad
Ec.1.23
equivalente.
En el caso de estudio se utiliza un modelo PI equivalente para la lnea, el cual, a travs de sus
elementos, representa los efectos fsicos producidos en la lnea de transmisin.
Con este modelo se establece la relacin entre las corrientes y tensiones a travs de la matriz
compleja de admitancias. Las magnitudes de los elementos del modelo PI, son utilizados por el
OPF (Flujo Optimo de Potencia) para calcular la matriz de admitancia nodal compleja del sistema
completo. sta participa directamente en las ecuaciones de flujo de potencia y determina las
prdidas en las lneas de transmisin.
Al igual que en el caso de las lneas de transmisin, se establece la relacin entre las corrientes y
tensiones travs de la matriz de admitancias.
1.2.1
del neutro.
En la figura 1.6 (b) se muestra el circuito equivalente por unidad de este transformador ideal para la
operacin trifsica balanceada.
Por convencin, se adoptaran las dos reglas siguientes para seleccionar las cantidades bases:
1. Se selecciona una
para que sea igual a la relacin de las tensiones nominales lnea a lnea,
.
en las terminales con punto. Por unidad las ecuaciones quedan as:
Ec.1.26
Ec.1.27
en proporcin a las tensiones nominales de los devanados. El circuito equivalente por unidad
mostrado en la figura 1.7 (b) satisface estas dos relaciones por unidad. En el circuito del
transformador practico de tres devanados que se muestra en la figura 1.7 (c), tambin se incluye la
impedancia externa en serie y las ramas de admitancia en derivacin.
pruebas de cortocircuito.
Note que cada uno de los devanados en un transformador de tres de ellos puede tener una
capacidad nominal diferente en KVA. Si las impedancias de dispersin de las pruebas de
cortocircuito se expresan por unidad, con base en las capacidades nominales de los devanados,
primero deben convertirse por unidad respecto a una
ecuaciones.
Ec.2.1
Sean
las
correcciones que, al hacerse a la primera suposicin, dan la solucin real. Por lo tanto,
Ec.2.2
Al desarrollar estas ecuaciones en serie de Taylor con la suposicin inicial, se tiene
Donde
con respecto a
, evaluadas en
Ec.2.3
y se evala en
con
10
son entonces
,
Ec.2.6
Las iteraciones se continan hasta que la ecuacin (2.1) se satisfaga para cualquier exactitud
deseada, es decir,
(un valor especificado);
Ec.2.7
REPRESENTACION GRAFICA
Este mtodo, el cual es un mtodo iterativo, es uno de los ms usados y efectivos. El mtodo de
Newton-Raphson no trabaja sobre un intervalo sino que basa su frmula en un proceso iterativo.
Supongamos una funcin
11
Se supone que
Pero en el punto
Note que el mtodo de Newton-Raphson no trabaja con intervalos donde nos asegure que
encontraremos la raz, y de hecho no tenemos ninguna garanta de que nos aproximaremos a
dicha raz. Desde luego, existen ejemplos donde este mtodo no converge a la raz, en cuyo caso
se dice que el mtodo diverge. Sin embargo, en los casos donde si converge a la raz lo hace con
una rapidez impresionante, por lo cual es uno de los mtodos preferidos por excelencia.
Tambin observe que en el caso de que
vemos geomtricamente que esto significa que la recta tangente es horizontal y por lo tanto no
intercepta al eje
raz de
12
mismo es una
, ngulo de fase
y potencia activa
abastecida al
bus.
Bus k
Carga
L
Cada bus
Bus compensador: Solo hay un bus compensador, que por conveniencia en este trabajo se
le asigna el numero 1. El bus compensador es una referencia para la cual
13
, por lo
comn 1.0
y
Sus instrucciones, por as decirlo, es hacer lo que sea necesario para mantener el
equilibrio de potencia real en el sistema, esto significa mantener el ngulo de tensin
constante.
Bus de carga:
. La mayor parte de los buses en un programa normal de flujo de potencia son de carga.
Bus de voltaje controlado:
calcula
. Como ejemplos estn los buses a los que estn conectados los
puede suministrar son tambin datos de entrada. Otro ejemplo es un bus al que esta
conectado un transformador con cambiador de derivaciones; el programa de flujo de
potencia calcula entonces la posicin del cambiador.
Observe que cuando el bus k es un bus de carga sin ninguna generacin,
es
negativo; es decir que la potencia real suministrada al bus k en la figura 2.2 es negativa. Si la
carga es inductiva,
es negativa.
la figura 1.5.
Los datos de entrada para cada lnea de transmisin son la impedancia
derivacin
del circuito
y la admitancia de
equivalente por unidad, los dos buses a los que esta conectada la
lnea y la capacidad mxima en MVA. De manera similar, los datos de entrada para cada
transformador son las impedancias de derivacin por unidad
excitacin por unidad
, la admitancia de la rama de
son:
terminan en el nodo.
Elementos fuera de la diagonal:
14
Esta ecuacin puede ser reescrita en trminos de la matriz de admitancia de bus como
Ec.2.15
En la ecuacin anterior, j incluye bus i. Expresando esta ecuacin en forma polar, tenemos
Ec.2.16
La potencia compleja en el bus i es
Ec.2.17
Sustituyendo la ecuacin (2.13) en (2.14)
Ec.2.18
15
En el conjunto de ecuaciones anterior, el bus numero 1 es asumido como el bus slack. La matriz
Jacobiana da la relacin entre cambios pequeos en el ngulo del voltaje
voltaje
y la magnitud del
. Los
elementos de la matriz jacobiana son las derivadas parciales de (2.19) y (2.20), evaluados en
y
Ec.2.21
Para el bus controlado por voltaje, la magnitud del voltaje es conocida. Por lo tantos si m buses de
el sistema son controlados por voltaje, m ecuaciones involucran
y las columnas
. El
es de orden
restricciones
es de orden
. El
, y el
16
es de orden
son
es de orden
.
Ec.2.22
Ec.2.23
La diagonal y los elementos fuera de la diagonal de
son
Ec.2.24
Ec.2.25
son
Ec.2.26
Ec.2.27
son
Ec.2.28
Ec.2.29
Los trminos
. Para
son
5. La nueva magnitud de voltaje y ngulo de fase son calculados por (2.32) y (2.33).
6. El proceso se continua hasta que los residuos
especificada
17
Ec.2.34
Ec.2.35
18
19
20
21
22
23
Despus de formadas las submatrices hay que formar la matriz Jacobiana completa
Cuando la matriz Jacobiana ya esta completa para la primera iteracin y las siguientes que se
formaran se invierte y multiplica por los deltas que para el caso de la primera iteracin los deltas
corresponden a los valores inicialmente calculados en la primera etapa de este modulo.
Luego se despejan los nuevos valores calculados para Voltaje y ngulos y se procede nuevamente
desde la primera etapa hasta lograr la convergencia cuando los deltas de potencia son
comparados que el nivel de tolerancia establecido para nuestro caso de 0.001.
24
25
26
Slack Bus
Solucin
Las impedancias de lnea se convierten en admitancias:
Convirtiendo la matriz de admitancia de bus a forma polar con sus ngulos en radianes
27
Los elementos de la matriz Jacobiana son obtenidas por las derivadas parciales con respecto a
y
,y
pu.
28
con
29
Para encontrar los flujos en las lneas, primero se encuentran las corrientes de lnea
30
El diagrama de flujo de potencia es mostrado en la figura 3.2, indicando la direccin del flujo tanto
de potencia activa como reactiva.
218.423
179.362
170.968
118.734
39.061
101.947
38.878
238.878
400
229.032
250
140.852
22.118
21.569
167.746
200
148.053
146.177
Flujo en MW
Flujo en Mvar
Comparando los resultados anteriores con los obtenidos con el programa desarrollado en Python,
los resultados son exactamente los mismos.
31
El sistema esta compuesto por catorce buses, lneas en paralelo, transformadores de dos y tres
devanados, generadores y cargas.
32
Primeramente se introducen los datos a nuestra interfaz como se muestra en la figura 3.4
33
En los perfiles de voltaje de la simulacin se puede apreciar que para los buses de carga los
voltajes de dichos buses son inferiores a los voltajes nominales de cada uno de ellos, esto es
debido al efecto que las cargas producen por la gran demanda de potencia en conjunto con las
perdidas de las lneas de transmisin, lo contrario para los buses de generacin o compensadores,
el voltaje se mantiene en su nominal debido a la inyeccin de potencia y a que en estos las
perdidas de las lneas son compensadas por la generacin propia de cada bus.
Los resultados obtenidos se compararon con los resultados que se obtienen de PSAT, teniendo
resultados similares con ambos programas.
34
35
Programacin cuadrtica.
36
4.2.2 Variables
Las variables de control y de estado a considerar en el OPF se resumen en la Figura 4.1.
Se considera la simbologa estndar utilizada en la literatura relacionada.
G
,
su ngulo respectivamente.
de la carga o consumo.
37
el conjunto de
Ec.4.3
Si en el arco (ij) existe un transformador, entonces los parmetros de la matriz de admitancia nodal
consideran implcitamente el efecto del tap.
Ec.4.4
Ec.4.5
38
Ec.4.12
Ec.4.13
39
Donde
i-esimo generador;
Donde
los nodos j e i.
Perfiles de voltaje.- Debido a que el voltaje en los nodos es uno de los criterios de seguridad e
ndice de calidad de servicio ms importante, incluir una restriccin que mejore el perfil de
voltaje de los nodos de carga del sistema es un aspecto importante a ser considerado en el
problema de optimizacin.
Los voltajes en los nodos de generacin son constantes, mientras que el nivel de voltaje en los
nodos de carga debe mantenerse muy cercano a un voltaje de referencia. Matemticamente esta
restriccin se puede definir mediante:
Donde
40
representa la
41
Donde
: Flujo de potencia real que va del nodo 1 al nodo 2
: Flujo de potencia reactiva que va del nodo 1 al nodo 2
Sabemos que:
Anlogamente tenemos:
2. Ecuacin de LaGrange
42
3. Mtodo de Newton-Raphson
Se proceder a resolverlo mediante el mtodo de Newton-Raphson descrito en la seccin 2.2.
El mtodo esta definido por.
Donde
es el vector de variables.
43
44
Reactancias:
45
Muestra el costo de generacin en dlares del generador conectado en el nodo 1, teniendo claro
que este costo es el ms econmico en lo que respecta a la generacin ya que eso es lo que se
buscaba minimizar los costos por generacin.
Tambin muestra el valor de las variables duales o costos marginales, las cuales representa la
cantidad en dlares por cada MW producido o demandado, cabe sealar que:
: Es el costo de la energa activa, al incrementar un MWh de generacin, para este caso es
coincidente con el precio nodal de la demando (costo marginal de la demanda), al requerir un MWh
adicional.
: Es el costo de la energa activa al incrementar un MWh en la demanda en el nodo dos,
observamos que el precio de la energa en este nodo es mayor que el precio en el nodo 1 debido
principalmente a las prdidas producidas por la impedancia de la lnea.
: Costo de la energa reactiva en el nodo de generacin, para el caso es cero pues nuestro
modelo esta basado en costos de generacin activa y no reactiva.
: Costo de la energa reactiva en el nodo de carga, en este caso es aproximadamente cero, pero
no cero, debido a los costos de traslado y perdidas del sistema.
Figura 4.4 Diagrama Unifilar con flujos en las lneas y costos marginales AC
A partir del anlisis mostrado del OPF de un sistema de dos nodos modelado AC, podemos
observar que la solucin no es trivial ya que el Hessiano formado es demasiado grande, lo cual
para un sistema compuesto por ms nodos se complicara el anlisis y la elaboracin del
programa. Por ende se opta por enfocarse y enfatizar mas en el modelado DC que se presenta a
continuacin.
46
4.3.2 OPF de un sistema multimodal y modelado DC: sin restricciones de desigualdad. Por
mtodo de Newton-Raphson
El supuesto bsico del modelo de flujo DC, es que este solo se centra en las potencias activas
tanto en las generadas como las de flujo en las lneas interconectadas entre los buses.
Por lo tanto este anlisis se realiza tomando en cuenta las reactancias de lnea as como las
potencias generadas como las demandadas. Por lo tanto se asume que no hay cambios en los
voltajes y por tanto no hay generacin ni flujos de potencia reactiva.
Las consideraciones que se toman para un anlisis DC son las siguientes:
Se ignoran las perdidas de potencia activa
Las diferencias de fase angular entre los nodos de cualquier rama son pequeos
Se considera que las magnitudes de las tensiones de nodo son aproximadamente 1 p.u.
Ec.4.14
Ec.4.15
Recordando que:
47
Ec.4.16
Donde:
: Potencia activa del nodo i
: Potencia reactiva del nodo i
: Magnitud de voltaje del nodo i
: Magnitud de voltaje del nodo j
: ngulo de fase del voltaje en el nodo i
: ngulo de fase del voltaje en el nodo j
: Conductancia de lnea entre nodos i-j
: Susceptancia de lnea entre nodos i-j
: Resistencia de lnea entre nodos i-j
: Reactancia de lnea entre nodos i-j
N: Nmero total de nodos existentes en el sistema
Para modificar el modelo AC de flujo de potencia a un modelo DC, las siguientes simplificaciones
son consideradas:
La magnitud del voltaje en por unidad para cada bus se aproxima a 1 p.u.
La resistencia de lnea es ignorada debido a que es muy pequea comparada con la
reactancia de lnea
entonces que tambin
, De esta forma
48
1. Planteamiento
Se va a plantear el problema del OPF con el unifilar de la figura 4.5
La funcin a minimizar esta compuesta por las ecuaciones de costos de cada uno de los
generadores del sistema dada por
Ec.4.22
Por lo tanto la ecuacin a minimizar esta definida como:
Min
Ec.4.23
En donde
: Es la potencia demandada en cada uno de los nodos del sistema; unidades
: Direccin de flujo de potencia de lnea interconectada entre lo nodos; unidades
: Potencia generada por cada uno de los generadores conectados a los nodos del sistema;
unidades
: Reactancia de lnea interconectada entre los nodos; unidades
A cada ecuacin nodal se le asigna un multiplicador de LaGrange ( ,
duales, las cuales son los costos marginales del sistema. Es el costo al cual se remunera la
energa producida por cada generador del sistema.
2. Ecuacin de LaGrange
Planteamos la ecuacin de LaGrange en funcin de cada una de las variables, as:
49
A continuacin planteamos las condiciones de primer orden, que son las derivadas parciales de la
ecuacin de LaGrange con respecto a cada una de las variables.
3. Mtodo de Newton-Raphson
Se proceder a resolverlo mediante el mtodo de Newton-Raphson descrito en la seccin 2.2.
El mtodo esta definido por.
Donde
es el vector de variables.
50
0
0
0
0
Por lo tanto:
51
Reactancias:
Con los datos ya introducidos, procedemos a correr nuestro programa, obteniendo los resultados
siguientes:
52
Primero se observa la magnitud de voltaje en pu de cada uno de los buses del sistema, para el
caso todos constantes ya que se esta haciendo un anlisis DC en el cual todas las magnitudes de
voltajes son constantes e iguales a 1.
Al lado de los voltajes se muestran los flujos en las lneas.
Tenemos las potencias generadas por cada generador para poder satisfacer la demanda.
Luego tenemos el costo total de generacin en dlares incluyendo ambos generadores.
El programa tambin reporta, los flujos en las lneas de transmisin, la potencia inyectada por cada
central, los costos marginales nodales.
Las variables duales representan los costos marginales de la demanda en cada nodo y son los
valores con los que remunera la energa producida por cada generador.
Este anlisis esta hecho con el objetivo de optimizar las condiciones de operacin de un sistema.
Por lo tanto se ha encontrado la solucin ms econmica en produccin, transporte y consumo.
A continuacin se muestra el diagrama del sistema con todos sus flujos y costos marginales en
cada nodo.
Figura 4.7 Diagrama Unifilar con flujos en las lneas y sus costos marginales DC
53
54
Se desarrollo una aplicacin para el OPF en modelado AC, con la limitante del anlisis de
un sistema en especfico debido a la complejidad de este tipo de modelaje que toma en
cuenta la forma de inyeccin de la potencia real y reactiva de manera sinusoidal y su
complejidad de programacin.
Las simplificaciones efectuadas al modelo AC de OPF, dieron lugar al modelaje DC, para
este ultimo se desarrollo el programa de anlisis de OPF manera general pudindose
analizar diferentes tipos de sistemas elctricos desde el punto de vista econmico.
5.2 Recomendaciones
seguir ahondando en el
presente tema de investigacin, que constituye una poderosa herramienta de anlisis para
el Ingeniero Electricista, en el campo de los SEP.
Elaborar el modelaje de un OPF para anlisis de manera general e incluir las restricciones
tcnicas de voltaje, ngulo, y lmites en la inyeccin de potencia de los generadores.
55
56
BIBLIOGRAFIA
Duncan Glover J. / Mulukutla S. Sarma. Sistemas de Potencia. Anlisis y Diseo. 3.ed. Mxico
D.F. 2003. 656 p. ISBN 970-686-291-9.
D.P. Kothari / I.J. Nagrath. Sistemas Elctricos de Potencia. . 3.ed. Mxico D.F. 2008. 685 p. ISBN
0-07-049489-4.
Federico Milano. Power System Modelling and Scripting. ETSII, University of Castilla - La Mancha
13071, Ciudad Real Spain. 551 p. ISBN 978-3-642-13668-9
Juan Eduardo Prez Retamales. [2001] Flujo de Potencia Optimo con programacin cuadrtica
secuencial. Tesis para optar al grado de Magister en gestin de operaciones. Facultad de ciencias
fsicas y matemticas, departamento de ingeniera industrial. Universidad de Chile.
Oate Yumbla Pablo Enrique. [2008] Solucin del problema de flujos de potencia optimo con
restricciones de seguridad por un optimizador de partculas modificado. Tesis Doctoral en
Ingeniera Elctrica. Centro de Investigacin y Estudios Avanzados del I.P.N. Unidad Guadalajara.
Saadat Hadi. Power System Analysis. New York: McGraw-Hill. 313 p. ISBN 0-07-012235-0.
Soares Ramos Dorel / Dias Eduardo Mario. Sistemas Elctricos de Potencia. Regime Permanente.
Volumen 2. Rio de Janeiro: Editora Guanabara Dois S.A. 224 p.
57
58
ANEXO A
PROGRAMA DE FLUJOS DE POTENCIA
59
def carga():#definiendo la funcin para cargar los datos del archivo interface
f = open('datos14.txt', 'r');
lines = f.readlines();
f.close()
global MVA
#leyendo los MVA base
MVAB=lines[2].split()
MVA=int(MVAB[0])
#leyendo los parametros de buses
ynames = lines[5].split()
y = {}
for name in ynames:
y[name] = []
s=0
while s<1:
for line in lines[6:]:
yvalues = [float(yi) for yi in line.split()]
if len(yvalues) == 0:
break
for name, value in zip(ynames, yvalues):
y[name].append(value)
s+=1
#leyendo los parametros de linea
ul=8+len(y[name])
ul1=ul+1
ynames1 = lines[ul].split()
y1 = {}
for name1 in ynames1:
y1[name1] = []
d=0
1
A-1
while d<1:
for line in lines[ul1:]:
yvalues1 = [float(yi) for yi in line.split()]
if len(yvalues1) == 0:
break
for name1, value1 in zip(ynames1, yvalues1):
y1[name1].append(value1)
d+=1
#leyendo los parametros de lineas en paralelo
ul2=11+len(y[name])+len(y1[name1])
ul3=ul2+1
ynames2 = lines[ul2].split()
y2 = {}
for name2 in ynames2:
y2[name2] = []
e=0
while e<1:
for line in lines[ul3:]:
yvalues2 = [float(yi) for yi in line.split()]
if len(yvalues2) == 0:
break
for name2, value2 in zip(ynames2, yvalues2):
y2[name2].append(value2)
e+=1
#leyendo los parametros de transformadores de 2 devanados
ul4=14+len(y[name])+len(y1[name1])+len(y2[name2])
ul5=ul4+1
ynames3 = lines[ul4].split()
y3 = {}
for name3 in ynames3:
y3[name3] = []
f=0
while f<1:
for line in lines[ul5:]:
yvalues3 = [float(yi) for yi in line.split()]
if len(yvalues3) == 0:
break
A-2
2
A-3
3
A-1
plpd=0
plph=0
cb=0
cdl=0
cp=0
#conteo de bloques de lineas en paralelo
if nbr2!=0:
for k in range(0,nbr2-1):
if nlp1[k]!=nlp1[k+1] or nrp1[k]!=nrp1[k+1]:
cp+=1
cp=cp+1
# conteo lineas en cada bloque
lan=spmatrix([],[],[],(cp,1),tc='d')
nlpf=spmatrix([],[],[],(cp,1),tc='d')
nrpf=spmatrix([],[],[],(cp,1),tc='d')
req=spmatrix([],[],[],(cp,1),tc='d')
xeq=spmatrix([],[],[],(cp,1),tc='d')
beq=spmatrix([],[],[],(cp,1),tc='d')
4
A-4
Ap=matrix(1,(cp,1),tc='d')
if cp>1:
j=spmatrix([],[],[],(cp+1,1),tc='d')
if cp==1:
j=spmatrix([],[],[],(cp,1),tc='d')
for k in range(0,nbr2):
lp[k]=nomlinp[k]-nbr1-1
if lp[k]==0:
plpd=int(nlp1[k])
plph=int(nrp1[k])
nlpf[cb]=plpd
nrpf[cb]=plph
j[cb]=0
if lp[k]!=0:
if nlp1[k]==plpd and nrp1[k]==plph:
cdl+=1
else:
plpd=int(nlp1[k])
plph=int(nrp1[k])
j[cb+1]=k
nlpf[cb+1]=plpd
nrpf[cb+1]=plph
cdl+=1
lan[cb]=cdl
cdl=0
cb+=1
if cp-1==cb and lp[k]==nbr2-1 and cp>1:
cdl+=1
lan[cb]=cdl
j[cb+1]=k
if cp==1:
cdl+=1
lan[cb]=cdl
nlpf[cb]=plpd
nrpf[cb]=plph
j[cb]=cdl
#calculo de parametros lineas en paralelo
5
A-5
if cp>1:
for k in range(0,cp):
if cp-1>k:
for i in range(int(j[k]),int(j[k+1])):
req[k]=req[k]+1/(Rp[i])
xeq[k]=xeq[k]+1/(xp[i])
beq[k]=beq[k]+1/(Bp[i])
req[k]=1/req[k]
xeq[k]=1/xeq[k]
beq[k]=1/beq[k]
if cp-1==k:
for i in range(int(j[k]),int(j[k+1])+1):
req[k]=req[k]+1/(Rp[i])
xeq[k]=xeq[k]+1/(xp[i])
beq[k]=beq[k]+1/(Bp[i])
req[k]=1/req[k]
xeq[k]=1/xeq[k]
beq[k]=1/beq[k]
if cp==1:
for k in range(0,cp):
for i in range(0,int(j[k])):
req[k]=req[k]+1/(Rp[i])
xeq[k]=xeq[k]+1/(xp[i])
beq[k]=beq[k]+1/(Bp[i])
req[k]=1/req[k]
xeq[k]=1/xeq[k]
beq[k]=1/beq[k]
6
A-6
A2=matrix(y3['a2'],(nbr3,1))#relacion de tranformacion
7
A-7
x32[k]=0.5*(xps[k]-xpt[k]+xst[k])
x33[k]=0.5*(-xps[k]+xpt[k]+xst[k])
x12[k]=x31[k]+x32[k]
x13[k]=x31[k]+x33[k]
#resistencia
r31[k]=0.5*(rps[k]+rpt[k]-rst[k])
r32[k]=0.5*(rps[k]-rpt[k]+rst[k])
r33[k]=0.5*(-rps[k]+rpt[k]+rst[k])
r12[k]=r31[k]+r32[k]
r13[k]=r31[k]+r33[k]
#susceptancia
b31[k]=0.5*(bps[k]+bpt[k]-bst[k])
b32[k]=0.5*(bps[k]-bpt[k]+bst[k])
b33[k]=0.5*(-bps[k]+bpt[k]+bst[k])
b12[k]=b31[k]+b32[k]
b13[k]=b31[k]+b33[k]
nbr=nbr1+cp+nbr3+3*nbr4
# Dimension de matrices si existen lineas en paralelo
if nbr2!=0:
A=sparse([A1,Ap,A2,A3,1,1])
A=matrix(A)
nlt=sparse([nomlin,nomlinp,nomt2,nomt3])
nlt=matrix(nlt)
R=sparse([R1,req,R2,r31,r32,r33])
R=matrix(R)
x=sparse([x1,xeq,x2,x31,x32,x33])
x=matrix(x)
B=sparse([B1,beq,B2,b31,b32,b33])
B=matrix(B)
nl=sparse([nl1,nlpf,nlt2,nlp2,nc,nc])
nl=matrix(nl)
nr=sparse([nr1,nrpf,nrt2,nc,np12,np13])
nr=matrix(nr)
#Dimension de matrices si no existen lineas en paralelo
if nbr2==0:
A=sparse([A1,A2,A3,1,1])
A=matrix(A)
8
A-8
nlt=sparse([nomlin,nomt2,nomt3])
nlt=matrix(nlt)
R=sparse([R1,R2,r31,r32,r33])
R=matrix(R)
x=sparse([x1,x2,x31,x32,x33])
x=matrix(x)
B=sparse([B1,B2,b31,b32,b33])
B=matrix(B)
nl=sparse([nl1,nlt2,nlp2,nc,nc])
nl=matrix(nl)
nr=sparse([nr1,nrt2,nc,np12,np13])
nr=matrix(nr)
9
A-9
Ypi=spmatrix([],[],[],(nnbus,nnbus))
Ypm=spmatrix([],[],[],(nnbus,nnbus))
Ypa=spmatrix([],[],[],(nnbus,nnbus))
#iniciando la formacion de Ybus, en rectangular
int()
s=0
cx=0
bx=0
while s<=nbr-1:
int(x[s,0])
cx=matrix(x[s]*1j)
xc[s,0]=cx
int(B[s,0])
bx=matrix(B[s]*1j)
bc[s,0]=bx
s+=1
z=R+xc
ds=div(y,z)
#Ybus fuera de la diagonal
for d in range(0,nbr):
if nl[d] > 0 and nr[d] > 0:
x0=int(nl[d])-1
y0=int(nr[d])-1
Y[x0,y0]=Y[x0,y0]-ds[d]/A[d]
Y[y0,x0]=Y[x0,y0]
#Ybus en la diagonal
for n in range(0,nnbus):
for k in range(0,nbr):
x1[k]=int(nl[k])-1
y1[k]=int(nr[k])-1
if x1[k]==n:
Y[n,n]=Y[n,n]+ ds[k]/(A[k]**2)+bc[k]/2
if y1[k]==n:
Y[n,n]=Y[n,n]+ ds[k]+bc[k]/2
10
A-10
for k in range(0,nnbus):
Ypr[n,k]=Y[n,k].real
Ypi[n,k]=Y[n,k].imag
#magnitud de Ybus
Ypm[n,k]=abs(Y[n,k])
if Ypr[n,k] > 0 or Ypr[n,k] < 0:
if n==k:
#angulo de Ybus en la diagonal
Ypa[n,k]=atan(Ypi[n,k]/Ypr[n,k])
if n<k or n>k:
#angulo de Ybus fuera de la diagonal
Ypa[n,k]=atan(Ypi[n,k]/Ypr[n,k])+pi
if Ypr[n,k]==0 and Ypi[n,k]>0:
Ypa[n,k]=pi/2
if Ypr[n,k]==0 and Ypi[n,k]<0:
Ypa[n,k]=-pi/2
return Y
11
A-11
aa=0
bb=0
for i in range(0,nnbus):
for k in range(0,nnbus):
#calculo de potencia real
pcal[i]= pcal[i]+ V[i]*Ypm[i,k]*V[k]*cos(Ypa[i,k]+anges[k]-anges[i])
#calculo de potencia reactiva
qcal[i]= qcal[i]-V[i]*Ypm[i,k]*V[k]*sin(Ypa[i,k]+anges[k]-anges[i])
bac=matrix(1,(cbpvpq,1),tc='d')
bacaux=matrix(1,(cbpvpq,1),tc='d')
bacc=0
for i in range(1,nnbus):
if tbuscam[i]==0:
12
A-12
bac[bacc]=nombus[i]
bacc+=1
for i in range(0,cbpvpq):
bacaux[i]=int(bac[i])-1
#conteo de buses PV y PQ
for a in range(0,nnbus):
if tbus[a] ==2:
aa = aa+1
if tbus[a] == 0:
bb = bb+1
#Declarcion de matrices
dpi=spmatrix([],[],[],(nnbus-1,1))
dqi=spmatrix([],[],[],(omj2,1))
j1=matrix(0,(omj1,omj1),tc='d')
j2=matrix(0,(omj1,omj2),tc='d')
j3=matrix(0,(omj2,omj1),tc='d')
j4=matrix(0,(omj2,omj2),tc='d')
jp=spmatrix([],[],[],(omj1,omj1))
jp1=spmatrix([],[],[],(omj1,omj1))
jp2=spmatrix([],[],[],(omj1,omj1))
npq=spmatrix([],[],[],(omj2,1))
pq=spmatrix([],[],[],(omj2,1))
jin=spmatrix([],[],[],(omj,omj))
mav3=spmatrix([],[],[],(nnbus,nnbus))
13
A-13
sang=spmatrix([],[],[],(nnbus,nnbus))
cang=spmatrix([],[],[],(nnbus,nnbus))
mav2=spmatrix([],[],[],(nnbus,nnbus))
pang=spmatrix([],[],[],(nnbus-1,nnbus-1))
pvol=spmatrix([],[],[],(nnbus-1,nnbus-1))
qang=spmatrix([],[],[],(nnbus-1,nnbus-1))
qvol=spmatrix([],[],[],(nnbus-1,nnbus-1))
mdpi=0
e=0
c=0
#seleccion de buses PQ
for b in range(0,nnbus):
if tbus[b]==0:
pq[c]=int(nombus[b])-1
c+=1
d=0
#calculo de delta potencia real
for i in range(1,nnbus):
dpi[i-1]= pes[i]-pcal[i]
if tbus[i]==0:
#calculo de delta potencia reactiva
dqi[d]= qes[int(pq[d])]-qcal[int(pq[d])]
d+=1
14
A-14
f+=1
#elementos que conformaran las submatrices jacobianas
for p in range(0,nnbus):
for q in range(0,nnbus):
if p<q or p>q:
mav3[q,p]=V[p]*V[q]*Ypm[p,q]
mav2[q,p]=V[q]*Ypm[p,q]
sang[q,p]=sin(Ypa[p,q]+anges[p]-anges[q])
cang[q,p]=cos(Ypa[p,q]+anges[p]-anges[q])
for p in range(1,nnbus):
for q in range(1,nnbus):
if p<q or p>q:
pang[q-1,p-1]=-mav3[q,p]*sang[q,p]#elementos para j1
pvol[q-1,p-1]=mav2[q,p]*cang[q,p]#elementos para j2
qang[q-1,p-1]=-mav3[q,p]*cang[q,p]#elementos para j3
qvol[q-1,p-1]=-mav2[q,p]*sang[q,p]#elementos para j4
#fuera de diagonal de j1
for p in range(0,omj1):
for q in range(0,omj1):
if p<q or p>q:
j1[q,p]=pang[q,p]
#diagonal j1
for i in range(1,omj1+1):
for j in range(0,nnbus):
if i>j or i<j:
j1[i-1,i-1]=j1[i-1,i-1]+V[i]*V[j]*Ypm[i,j]*sin(Ypa[i,j]-anges[i]+anges[j])
#diagonal de j2
for i in range(1,omj1+1):
for j in range(0,nnbus):
jp1[i-1,i-1]=jp1[i-1,i-1]+V[j]*Ypm[i,j]*cos(Ypa[i,j]-anges[i]+anges[j])
jp1[i-1,i-1]=jp1[i-1,i-1]+V[i]*Ypm[i,i]*cos(Ypa[i,i])
for i in range(0,omj1):
pvol[i,i]=jp1[i,i]
15
A-15
#diagonal de j3
for i in range(1,omj1+1):
for j in range(0,nnbus):
if i>j or i<j:
jp[i-1,i-1]=jp[i-1,i-1]+V[i]*V[j]*Ypm[i,j]*cos(Ypa[i,j]-anges[i]+anges[j])
for i in range(0,omj1):
qang[i,i]=jp[i,i]
#diagonal para j4
for i in range(1,omj1+1):
for j in range(0,nnbus):
jp2[i-1,i-1]=jp2[i-1,i-1]+V[j]*Ypm[i,j]*sin(Ypa[i,j]-anges[i]+anges[j])
jp2[i-1,i-1]=jp2[i-1,i-1]+V[i]*Ypm[i,i]*sin(Ypa[i,i])
for i in range(0,omj1):
qvol[i,i]=-jp2[i,i]
sj2=0
for i in range(0,nnbus):
if tbus[i]==0:
npq[sj2]=int(nombus[i])-2
sj2+=1
sj3=0
s1=0
#fuera de diagonal de j2
for i in range(0,omj2):
s1=int(npq[i])
for j in range(0,omj1):
j2[j,sj3]=pvol[j,s1]
sj3+=1
sj4=0
s2=0
#fuera de diagonal de j3
for i in range(0,omj2):
16
A-16
s2=int(npq[i])
for j in range(0,omj1):
j3[sj4,j]=qang[s2,j]
sj4+=1
sj5=0
sj6=0
s3=0
s4=0
#fuera de diagonal de j4
for i in range(0,omj2):
s3=int(npq[i])
for j in range(0,omj2):
if sj5==omj2:
sj5=0
s4=int(npq[j])
j4[sj6,sj5]=qvol[s3,s4]
sj5+=1
sj6+=1
17
A-17
18
A-18
for k in range(0,nnbus):
Vc[k] = V[k]*cos(anges[k])+V[k]*sin(anges[k])*1j
for k in range(0,nbr):
i=int(nl[k])-1
j=int(nr[k])-1
Ii[k]=(Vc[i]-A[k]*Vc[j])*ds[k]/(A[k]**2)+bc[k]*Vc[i]/(2*A[k]**2)
Ij[k]=(Vc[j]-Vc[i]/A[k])*ds[k]+bc[k]*Vc[j]/2
sij[k]=Vc[i]*conjugate(Ii[k])*MVA
sji[k]=Vc[j]*conjugate(Ij[k])*MVA
fp[k]=sij[k].real
fq[k]=sij[k].imag
fpdi[k]=sji[k].real
fqdi[k]=sji[k].imag
ppr[k]=abs(abs(fp[k])-abs(fpdi[k]))
ppre[k]=abs(abs(fq[k])-abs(fqdi[k]))
return fp, fq
pu\n')
for k in range(0,nnbus):
f.write(str(k+1)+'
'+format %V[k]+'\n')
grados\n')
for k in range(0,nnbus):
f.write(str(k+1)+'
'+format %angesgr[k]+'\n')
19
A-19
'+str(j+1)+'
')
f.write(format %fp[k]+'\n')
#print
'+str(j+1)+'
')
f.write(format %fpdi[k]+'\n')
#print
f.write('\n')
f.write('Potencia reactiva MVAR\n')
f.write('De hasta\n')
for k in range(0,nbr):
i=int(nl[k])-1
j=int(nr[k])-1
f.write(str(i+1)+'
'+str(j+1)+'
')
f.write(format %fq[k]+'\n')
#print
A-20
20
f.write('De hasta\n')
for k in range(0,nbr):
i=int(nr[k])-1
j=int(nl[k])-1
f.write(str(i+1)+'
'+str(j+1)+'
')
f.write(format %fqdi[k]+'\n')
#print
'+str(j+1)+'
')
f.write(format %ppr[k]+'\n')
#print
'+str(j+1)+'
')
f.write(format %ppre[k]+'\n')
#print
return angesgr
f.close()
def apertura():
import os
print 'Abriendo reporte.....'
archivo=os.popen('reporte'+str(nnbus)+'buses.txt')
21
A-21
22
ANEXO B
PROGRAMA DE FLUJO PTIMO DE POTENCIA (OPF)
MODELO AC
23
24
def carga():#definiendo la funcin para cargar los datos del archivo de datos
f = open('ac2.txt', 'r');
lines = f.readlines();
f.close()
global MVA
#leyendo los Mvar base del archivo de block de notas
MVAB=lines[2].split()
MVA=int(MVAB[0])
#leyendo los parmetros de buses
ynames = lines[5].split()
y = {}
for name in ynames:
y[name] = []
s=0
while s<1:
for line in lines[6:]:
yvalues = [float(yi) for yi in line.split()]
if len(yvalues) == 0:
break
for name, value in zip(ynames, yvalues):
y[name].append(value)
s+=1
#leyendo los parmetros de lnea
ul=8+len(y[name])
ul1=ul+1
ynames1 = lines[ul].split()
y1 = {}
for name1 in ynames1:
y1[name1] = []
d=0
while d<1:
for line in lines[ul1:]:
1
B-1
2
B-2
f+=1
#leyendo los parmetros de transformadores de 3 devanados
ul6=17+len(y[name])+len(y1[name1])+len(y2[name2])+len(y3[name3])
ul7=ul6+1
ynames4 = lines[ul6].split()
y4 = {}
for name4 in ynames4:
y4[name4] = []
g=0
while g<1:
for line in lines[ul7:]:
yvalues4 = [float(yi) for yi in line.split()]
if len(yvalues4) == 0:
break
for name4, value4 in zip(ynames4, yvalues4):
y4[name4].append(value4)
g+=1
3
B-3
cc=matrix(y['c'],(nnbus,1))
lam=matrix(y['l'],(nnbus,1))
# parametros de las lineas
plpd=0
plph=0
cb=0
cdl=0
cp=0
if nbr2!=0:
for k in range(0,nbr2-1):#conteo de cuantos bloques de lneas hay en //
if nlp1[k]!=nlp1[k+1] or nrp1[k]!=nrp1[k+1]:
cp+=1
cp=cp+1
lan=spmatrix([],[],[],(cp,1),tc='d')
nlpf=spmatrix([],[],[],(cp,1),tc='d')
nrpf=spmatrix([],[],[],(cp,1),tc='d')
req=spmatrix([],[],[],(cp,1),tc='d')
4
B-4
xeq=spmatrix([],[],[],(cp,1),tc='d')
beq=spmatrix([],[],[],(cp,1),tc='d')
Ap=matrix(1,(cp,1),tc='d')
if cp>1:
j=spmatrix([],[],[],(cp+1,1),tc='d')
if cp==1:
j=spmatrix([],[],[],(cp,1),tc='d')
for k in range(0,nbr2):# conteo de cuantas lneas hay en cada bloque
lp[k]=nomlinp[k]-nbr1-1
if lp[k]==0:
plpd=int(nlp1[k])
plph=int(nrp1[k])
nlpf[cb]=plpd
nrpf[cb]=plph
j[cb]=0
if lp[k]!=0:
if nlp1[k]==plpd and nrp1[k]==plph:
cdl+=1
else:
plpd=int(nlp1[k])
plph=int(nrp1[k])
j[cb+1]=k
nlpf[cb+1]=plpd
nrpf[cb+1]=plph
cdl+=1
lan[cb]=cdl
cdl=0
cb+=1
if cp-1==cb and lp[k]==nbr2-1 and cp>1:
cdl+=1
lan[cb]=cdl
j[cb+1]=k
if cp==1:
cdl+=1
lan[cb]=cdl
nlpf[cb]=plpd
nrpf[cb]=plph
5
B-5
j[cb]=cdl
#print j
#calculo de los parmetros de las lneas en //
if cp>1:
for k in range(0,cp):
if cp-1>k:
for i in range(int(j[k]),int(j[k+1])):
req[k]=req[k]+1/(Rp[i])
xeq[k]=xeq[k]+1/(xp[i])
beq[k]=beq[k]+1/(Bp[i])
req[k]=1/req[k]
xeq[k]=1/xeq[k]
beq[k]=1/beq[k]
if cp-1==k:
for i in range(int(j[k]),int(j[k+1])+1):
req[k]=req[k]+1/(Rp[i])
xeq[k]=xeq[k]+1/(xp[i])
beq[k]=beq[k]+1/(Bp[i])
req[k]=1/req[k]
xeq[k]=1/xeq[k]
beq[k]=1/beq[k]
if cp==1:
for k in range(0,cp):
for i in range(0,int(j[k])):
req[k]=req[k]+1/(Rp[i])
xeq[k]=xeq[k]+1/(xp[i])
beq[k]=beq[k]+1/(Bp[i])
req[k]=1/req[k]
xeq[k]=1/xeq[k]
beq[k]=1/beq[k]
#print req
#print plph
#parmetros de transformadores de 2 devanados
nbr3=len(y3['nl2t'])# numero de transformadores de 2 dev
nomt2=matrix(y3['nomtransf2'],(nbr3,1))#nombre de transformador
nlt2=matrix(y3['nl2t'],(nbr3,1))#desde
6
B-6
nrt2=matrix(y3['nr2t'],(nbr3,1))#hasta
R2=matrix(y3['R2'],(nbr3,1))# resistencia
x2=matrix(y3['X2'],(nbr3,1))#reactancia
B2=matrix(y3['B2'],(nbr3,1))#susceptancia
A2=matrix(y3['a2'],(nbr3,1))#relacin de transformacin
7
B-7
b13=spmatrix([],[],[],(nbr4,1),tc='d')
#baux=spmatrix([],[],[],(nbr4,1),tc='d')
for k in range(0,nbr4):
x31[k]=0.5*(xps[k]+xpt[k]-xst[k])#reactancia
x32[k]=0.5*(xps[k]-xpt[k]+xst[k])
x33[k]=0.5*(-xps[k]+xpt[k]+xst[k])
x12[k]=x31[k]+x32[k]
x13[k]=x31[k]+x33[k]
r31[k]=0.5*(rps[k]+rpt[k]-rst[k])#resistencia
r32[k]=0.5*(rps[k]-rpt[k]+rst[k])
r33[k]=0.5*(-rps[k]+rpt[k]+rst[k])
r12[k]=r31[k]+r32[k]
r13[k]=r31[k]+r33[k]
b31[k]=0.5*(bps[k]+bpt[k]-bst[k])#susceptancia
b32[k]=0.5*(bps[k]-bpt[k]+bst[k])
b33[k]=0.5*(-bps[k]+bpt[k]+bst[k])
b12[k]=b31[k]+b32[k]
b13[k]=b31[k]+b33[k]
nbr=nbr1+cp+nbr3+3*nbr4
8
B-8
#potencias en p.u
pes=spmatrix([],[],[],(nnbus,1))
qes=spmatrix([],[],[],(nnbus,1))
for i in range(0,nnbus): # generando los valores de potencia en p.u
pes[i]=(prgene[i]-prload[i])/MVA
qes[i]=(preacgene[i]-preacload[i])/MVA
9
B-9
10
B-10
Ypi[n,k]=Y[n,k].imag
Ypm[n,k]=abs(Y[n,k]) # magnitud de Ybus
if Ypr[n,k] > 0 or Ypr[n,k] < 0:
if n==k:
Ypa[n,k]=atan(Ypi[n,k]/Ypr[n,k]) # angulo de Ybus en la diagonal
if n<k or n>k:
Ypa[n,k]=atan(Ypi[n,k]/Ypr[n,k])+pi # angulo de Ybus fuera de la diagonal
if Ypr[n,k]==0 and Ypi[n,k]>0:
Ypa[n,k]=pi/2
if Ypr[n,k]==0 and Ypi[n,k]<0:
Ypa[n,k]=-pi/2
return Y
lini=spmatrix([],[],[],(nnbus,1),tc='d')
ppcal=spmatrix([],[],[],(nnbus,1),tc='d')
Vi=spmatrix([],[],[],(nnbus,1),tc='d')
angi=spmatrix([],[],[],(nnbus,1),tc='d')
lamdas=spmatrix([],[],[],(2*nnbus,1),tc='d')
bgene=0
for i in range(0,nnbus):
Vi[i-1]=V[i]#voltaje inicial
angi[i]=anges[i]#angulo inicial
if cc[i]>0:
bgene+=1
dx=4*bgene+4*(nnbus-1)
busgene=spmatrix([],[],[],(bgene,1))
dlpg=spmatrix([],[],[],(nnbus,1))
dlt=spmatrix([],[],[],(nbr,1))
dll=spmatrix([],[],[],(nnbus,1))
busl=spmatrix([],[],[],(nnbus-bgene,1))
hes=matrix(0,(dx,dx),tc='d')
hesin=spmatrix([],[],[],(dx,dx))
grad=spmatrix([],[],[],(dx,1))
pig=spmatrix([],[],[],(bgene,1))
11
B-11
xnueva=spmatrix([],[],[],(dx,1),tc='d')
a=0
for i in range(0,nnbus):
if cv[i]>0:
busgene[a]=nombus[i]
a+=1
b=0
for i in range(0,nnbus):
if cv[i]==0:
busl[b]=nombus[i]
b+=1
c=0
for i in range(0,nnbus):
if cv[i]>0:
pig[c]=prgene[int(busgene[c])-1]
c+=1
for i in range(0,nnbus-1):
y=sparse([angi[i+1],Vi[i+1],prgene[i],preacgene[i],lam,lr])# matriz de incognitas iniciales
#print y
for k in range(0,1):
if k==0:
p21=Vi[k+1]*Vi[k+1]*Ypm[k,k]*cos(Ypa[k,k])-Vi[k]*Vi[k+1]*Ypm[k,k]*cos(angi[k]+Ypa[k,k]
-angi[k+1])
12
B-12
p12=Vi[k]*Vi[k]*Ypm[k,k]*cos(Ypa[k,k])-Vi[k]*Vi[k+1]*Ypm[k,k]*cos(angi[k+1]+Ypa[k,k]
-angi[k])
q21=Vi[k+1]*Vi[k+1]*Ypm[k,k]*sin(Ypa[k,k])-Vi[k]*Vi[k+1]*Ypm[k,k]*sin(angi[k]+Ypa[k,k]
-angi[k+1])
q12=Vi[k]*Vi[k]*Ypm[k,k]*sin(Ypa[k,k])-Vi[k]*Vi[k+1]*Ypm[k,k]*sin(angi[k+1]+Ypa[k,k]
- angi[k])
grad[k]=Vi[k]*Vi[k+1]*Ypm[k,k]*(lam[k]*sin(angi[k+1]+Ypa[k,k]-angi[k])
- lam[k+1]*sin(angi[k]+Ypa[k,k]-angi[k+1])-lr[k]*cos(angi[k+1]+Ypa[k,k]
-angi[k])+lr[k+1]*cos(angi[k]+Ypa[k,k]-angi[k+1]))
grad[k+1]=-lam[k]*Vi[k]*Ypm[k,k]*cos(angi[k+1]+Ypa[k,k]-angi[k])+lam[k+1]*(2*Vi[k+1]*Ypm[k,k]*cos(Ypa[k,k])
-Vi[k]*Ypm[k,k]*cos(angi[k]+Ypa[k,k]
- angi[k+1]))-lr[k]*Vi[k]*Ypm[k,k]*sin(angi[k+1]+Ypa[k,k]
- angi[k])+lr[k+1]*Ypm[k,k]*(2*Vi[k+1]*sin(Ypa[k,k])-Vi[k]*sin(angi[k]+Ypa[k,k]
-angi[k+1]))
grad[k+2]=cv[k]+2*cc[k]*prgene[k]-lam[k]/MVA
grad[k+3]=-lr[k]/MVA
grad[k+4]=prload[k]/MVA+p12-prgene[k]/MVA
grad[k+5]=prload[k+1]/MVA+p21
grad[k+6]=preacload[k]/MVA+q12-preacgene[k]/MVA
grad[k+7]=preacload[k+1]/MVA+q21
for k in range(0,1):
for j in range(0,1):
if j==0:
gam=angi[j+1]+Ypa[j]-angi[j]
bet=angi[j]+Ypa[j]-angi[j+1]
if k==0:
hes[k,k]=Vi[k]*Vi[k+1]*Ypm[k,k]*(lam[k]*cos(gam)+lam[k+1]*cos(bet)+lr[k]*sin(gam)
+lr[k+1]*sin(bet))
hes[k+1,j]=Vi[k]*Ypm[k,k]*(lam[k]*sin(gam)-lam[k+1]*sin(gam)
- lr[k]*cos(gam)+lr[k+1]*cos(bet))
hes[k+4,j]=Vi[k]*Vi[k+1]*Ypm[k,k]*sin(gam)
hes[k+5,j]=-Vi[k]*Vi[k+1]*Ypm[k,k]*sin(bet)
hes[k+6,j]=-Vi[k]*Vi[k+1]*Ypm[k,k]*cos(gam)
hes[k+7,j]=Vi[k]*Vi[k+1]*Ypm[k,k]*cos(bet)
13
B-13
hes[k,j+1]=Vi[k]*Ypm[k,k]*(lam[k]*sin(gam)-lam[k+1]*sin(bet)
-lr[k]*cos(gam)+lr[k+1]*cos(bet))
hes[k+1,j+1]=2*Ypm[k,k]*(lam[k+1]*cos(Ypa[k])+lr[k+1]*sin(Ypa[k]))
hes[k+4,j+1]=-Vi[k]*Ypm[k,k]*cos(gam)
hes[k+5,j+1]=2*Vi[k+1]*Ypm[k,k]*cos(Ypa[k])-Vi[k]*Ypm[k,k]*cos(bet)
hes[k+6,j+1]=-Vi[k]*Ypm[k,k]*sin(gam)
hes[k+7,j+1]=2*Vi[k+1]*Ypm[k,k]*sin(Ypa[k])-Vi[k]*Ypm[k,k]*sin(bet)
hes[k+2,j+2]=2*cc[k]
hes[k+4,j+2]=-1./MVA
hes[k+6,j+3]=-1./MVA
hes[k,j+4]=-Vi[k]*Vi[k+1]*Ypm[k,k]*sin(gam)
hes[k+1,j+4]=-Vi[k]*Ypm[k,k]*cos(gam)
hes[k+2,j+4]=-1./MVA
hes[k,j+5]=-Vi[k]*Vi[k+1]*Ypm[k,k]*sin(bet)
hes[k+1,j+5]=2*Vi[k+1]*Ypm[k,k]*cos(Ypa[k])-Vi[k]*Ypm[k,k]*cos(bet)
hes[k,j+6]=-Vi[k]*Vi[k+1]*Ypm[k,k]*cos(gam)
hes[k+1,j+6]=-Vi[k]*Ypm[k,k]*sin(gam)
hes[k+3,j+6]=-1./MVA
hes[k,j+7]=Vi[k]*Vi[k+1]*Ypm[k,k]*cos(bet)
hes[k+1,j+7]=2*Vi[k+1]*Ypm[k,k]*sin(Ypa[k])-Vi[k]*Ypm[k,k]*sin(bet)
hesin=inv(hes)
hesin=matrix(hesin,(dx,dx))
deltax= mul(hesin*grad)
hesin=spmatrix([],[],[],(dx,dx))
hes=matrix(0,(dx,dx),tc='d')
for k in range(0,dx):
xnueva[k]=y[k]-deltax[k]
for k in range(0,dx):
if k==0:
angi[k+1]=xnueva[k]
y[k]=xnueva[k]
if k==1:
Vi[k]=xnueva[k]
y[k]=xnueva[k]
if k==2:
prgene[k-2]=xnueva[k]
14
B-14
y[k]=xnueva[k]
if k==3:
preacgene[k-3]=xnueva[k]
y[k]=xnueva[k]
if k==4 or k==5:
lam[k-4]=xnueva[k]
y[k]=xnueva[k]
if k==6 or k==7:
lr[k-6]=xnueva[k]
y[k]=xnueva[k]
dip=max(abs(deltax))
diq=max(abs(deltax))
it+=1
#print it
for k in range(0,nnbus):
anges[k]=angi[k]
cost=0
for k in range(0,2):
cost=cost+cf[k]+cv[k]*prgene[k]+cc[k]*prgene[k]**2
for k in range(0,2*nnbus):
if k<nnbus:
lamdas[k]=lam[k]
if k>=nnbus:
lamdas[k]=lr[k-nnbus]
fprlin=spmatrix([],[],[],(nbr,1),tc='d')
fpreaclin=spmatrix([],[],[],(nbr,1),tc='d')
#calculo flujos de potencia real en lineas
for k in range(0,nbr):
i=int(nl[k])-1
j=int(nr[k])-1
fprlin[k]=-Vi[i]**2*Ypm[i,j]*cos(Ypa[i,j])+Vi[i]*Vi[j]*Ypm[i,j]*cos(Ypa[i,j]+anges[j]-anges[i])
fpreaclin[k]=-Vi[i]**2*Ypm[i,j]*sin(Ypa[i,j])+Vi[i]*Vi[j]*Ypm[i,j]*sin(Ypa[i,j]+anges[j]-anges[i])
15
B-15
angesgr=spmatrix([],[],[],(nnbus,1))
for i in range(0,nnbus):
angesgr[i]=angi[i]*180/pi
f = open('reporteOPFAC'+str(nnbus)+'buses.txt', 'w')
format = "%.3f"
# imprimiendo voltajes de nodo
f.write('Magnitud de voltaje\n')
f.write('Bus pu\n')
for k in range(0,nnbus):
f.write(str(k+1)+'
'+format %Vi[k]+'\n')
'+format %angesgr[k]+'\n')
'+str(j+1)+'
')
f.write(format %fprlin[k]+'\n')
#print 'Flujo en lineas en MW'
#print fprlin
# imprimiendo flujo potencia reactiva en las lineas
f.write('\n')
f.write('Potencia reactiva en lineas MVAR\n')
f.write('De hasta\n')
16
B-16
'+str(j+1)+'
')
f.write(format %fpreaclin[k]+'\n')
#print 'Flujo en lineas en MVAR'
#print fpreaclin
# imprimiendo potencia activa generada NODAL
f.write('\n')
f.write('Potencia activa generada en MW\n')
f.write('Bus\n')
for k in range(0,nnbus):
f.write(str(k+1)+' ')
f.write(format %prgene[k]+'\n')
#print 'Potencia activa generada en MW'
#print prgene
# imprimiendo potencia reactiva generada NODAL
f.write('\n')
f.write('Potencia reactiva generada en MVAR\n')
f.write('Bus\n')
for k in range(0,nnbus):
f.write(str(k+1)+' ')
f.write(format %preacgene[k]+'\n')
#print 'Potencia reactiva generada en MVAR'
#print preacgene
#imprimiendo costos NODALES por POTENCIA ACTIVA
f.write('\n')
f.write('Costo marginal $/MWh\n')
f.write('Bus\n')
for k in range(0,nnbus):
f.write(str(k+1)+' ')
lamdas[k]=lamdas[k]/MVA
f.write(format %lamdas[k]+'\n')
#print 'Costo marginal $/MWh'
#for k in range(0,nnbus):
17
B-17
def apertura():
import os
print 'Abriendo reporte.....'
archivo=os.popen('reporteOPFAC'+str(nnbus)+'buses.txt')
18
B-18
ANEXO C
PROGRAMA DE FLUJO PTIMO DE POTENCIA (OPF)
MODELO DC
1
C-1
if len(yvalues1) == 0:
break
for name1, value1 in zip(ynames1, yvalues1):
y1[name1].append(value1)
d+=1
2
C-2
lini=spmatrix([],[],[],(nnbus,1),tc='d')
ppcal=spmatrix([],[],[],(nnbus,1),tc='d')
Vi=spmatrix([],[],[],(nnbus-1,1),tc='d')
angi=spmatrix([],[],[],(nnbus-1,1),tc='d')
bgene=0
for i in range(0,nnbus):
if i>0:
Vi[i-1]=V[i]#voltaje inicial
angi[i-1]=anges[i]#angulo inicial
if cv[i]>0:
bgene+=1
dx=bgene+2*nnbus-1
busgene=spmatrix([],[],[],(bgene,1))
dlpg=spmatrix([],[],[],(nnbus,1))
dlt=spmatrix([],[],[],(nbr1,1))
dll=spmatrix([],[],[],(nnbus,1))
busl=spmatrix([],[],[],(nnbus-bgene,1))
hes=matrix(0,(dx,dx),tc='d')
3
C-3
hesin=spmatrix([],[],[],(dx,dx))
grad=spmatrix([],[],[],(dx,1))
pig=spmatrix([],[],[],(bgene,1))
xn=spmatrix([],[],[],(dx,1),tc='d')
CV=spmatrix([],[],[],(bgene,1))
CC=spmatrix([],[],[],(bgene,1))
LAM=spmatrix([],[],[],(bgene,1))
a=0
for i in range(0,nnbus):
if cv[i]>0:
busgene[a]=nombus[i]
a+=1
b=0
for i in range(0,nnbus):
if cv[i]==0:
busl[b]=nombus[i]
b+=1
c=0
for i in range(0,nnbus):
lini[i]=lam[i]
if cv[i]>0:
pig[c]=prgene[int(busgene[c])-1]
CV[c]=cv[int(busgene[c])-1]
CC[c]=cc[int(busgene[c])-1]
c+=1
dpr=spmatrix([],[],[],(bgene,1),tc='d')
dtas=spmatrix([],[],[],(nnbus-1,1),tc='d')
dlam=spmatrix([],[],[],(nnbus,1),tc='d')
Y=spmatrix([],[],[],(nnbus,nnbus),tc='d')
y=matrix(1,(nbr1,1))
x1=spmatrix([],[],[],(nbr1,1))
y1=spmatrix([],[],[],(nbr1,1))
ds=div(y,x)
# Ybus fuera de la diagonal
for d in range(0,nbr1):
4
C-4
for i in range(1,nnbus):
for j in range(0,nnbus):
Y1[i-1,j]=Y[i,j]
for i in range(0,nnbus):
for j in range(1,nnbus):
Y2[i,j-1]=Y[i,j]
5
C-5
hes0=matrix([MCC,MZERO3,MIMVA])
hes1=matrix([MZERO1,MZERO2,Y2])
hes2=matrix([MIMVA,Y1,MZERO])
hes5=matrix([[MCC],[MZERO1],[MIMVA]])
hes8=matrix([[hes0],[hes1],[hes2]])
for i in range(0,bgene):
for j in range(0,3*nnbus-1):
k=int(busgene[i])-1
hes3[j,i]=hes0[j,k]
hes4=matrix([[hes3],[hes1],[hes2]])
for i in range(0,bgene):
for j in range(0,dx):
k=int(busgene[i])-1
hes[i,j]=hes4[k,j]
nbng=nnbus-bgene
for i in range(bgene,dx):
for j in range(0,dx):
hes[i,j]=hes4[i+nbng,j]
hesin=inv(hes)
hesinv=matrix(hesin,(dx,dx))
C-6
6
for i in range(0,nnbus):
for j in range(0,nnbus):
admsum[i]=admsum[i]+lam[j]*Y[i,j]
for i in range(1,nnbus):
dtas[i-1]=admsum[i]
#obteniendo derivadas respecto a lamdas
# Resta de Angulos fuera de la diagonal
for d in range(0,nbr1):
if nl1[d] > 0 and nr1[d] > 0:
x0=int(nl1[d])-1
y0=int(nr1[d])-1
rangi[x0,y0]=rangi[x0,y0]+anges[x0]-anges[y0]
rangi[y0,x0]=-rangi[x0,y0]
drl=mul(rangi,Y)
for i in range(0,nnbus):
for j in range(0,nnbus):
rang[i]=rang[i]-drl[i,j]
for i in range(0,nnbus):
dlam[i]=prload[i]/MVA-prgene[i]/MVA+rang[i]
grad=matrix([dpr,dtas,dlam])
deltax= mul(hesinv*grad)
for k in range(0,dx):
xn[k]=xv[k]-deltax[k]
for k in range(0,bgene):
7
C-7
pig[k]=xn[k]
for k in range(0,nnbus-1):
angi[k]=xn[k+bgene]
for k in range(0,nnbus):
lam[k]=xn[k+bgene+nnbus-1]
for i in range(0,bgene):
k=int(busgene[i])-1
LAM[i]=lam[k]
for k in range(1,nnbus):
anges[k]=angi[k-1]
for i in range(0,bgene):
k=int(busgene[i])-1
prgene[k]=pig[i]
dip=max(abs(deltax))
diq=max(abs(deltax))
it+=1
cost=0
for k in range(0,nnbus):
cost=cost+cf[k]+cv[k]*prgene[k]+cc[k]*prgene[k]**2
fplin=spmatrix([],[],[],(nbr1,1),tc='d')
#calculo flujos de potencia real en lineas
for k in range(0,nbr1):
i=int(nl1[k])-1
j=int(nr1[k])-1
fplin[k]=(anges[i]-anges[j])*Y[i,j]*(-1)*MVA
8
C-8
f.write('Magnitud de voltaje\n')
f.write('Bus pu\n')
for k in range(0,nnbus):
f.write(str(k+1)+'
'+format %V[k]+'\n')
'+format %angesgr[k]+'\n')
'+str(j+1)+'
')
f.write(format %fplin[k]+'\n')
#print 'Flujo en lineas en MW'
#print fplin
# imprimiendo pptencia generada NODAL
f.write('\n')
f.write('Potencia generada en MWh\n')
f.write('Bus\n')
for k in range(0,nnbus):
f.write(str(k+1)+' ')
f.write(format %prgene[k]+'\n')
#print 'Potencia generada en MWh'
#print prgene
#imprimiendo costos NODALES
f.write('\n')
9
C-9
def apertura():
import os
print 'Abriendo reporte.....'
archivo=os.popen('reporteOPF'+str(nnbus)+'buses.txt')
10
C-10