You are on page 1of 189

UNIVERSIDAD PONTIFICIA COMILLAS

ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)


INGENIERO INDUSTRIAL

PROYECTO FIN DE CARRERA

ESTUDIO DE VIABILIDAD SOBRE LA


PREVISIÓN HORARIA DE LA
PRODUCCIÓN DE ENERGÍA SOLAR
FOTOVOLTAICA MEDIANTE
TÉCNICAS DE REDES NEURONALES

AUTOR: CARLOS ENTRENA MORATIEL

MADRID, junio de 2009


Universidad Pontificia de Comillas - PFC

AGRADECIMIENTOS

A Unión Fenosa por financiar y permitir este proyecto.

A Sergio Arana, por todo lo que me ha enseñado sobre el


sistema eléctrico español, y sobre cómo debe ser un buen ingeniero.

A Santiago Falcón, por su apoyo y buen humor a lo largo de


todo el año, y por sus buenas ideas y correcciones; por haberme
enseñado cómo trabaja la anterior generación de ingenieros.

A todos los compañeros de la planta 1-F, por su amistad y


simpatía, y por los desayunos; les deseo lo mejor.

A mis profesores del ICAI y del École Centrale Paris, por lo que
me han enseñado.

A mi familia y amigos por soportarme este último año de


ingeniería.

Carlos Entrena Moratiel i


Universidad Pontificia de Comillas - PFC

RESUMEN

De manera paralela a la evolución científica y técnica, la


sociedad avanza hacia una conciencia más aguda de su
responsabilidad con el medio ambiente. Esta es una de las razones
fundamentales por las que en la actualidad las energías renovables
están experimentando una enorme expansión, lo cual plantea
numerosos retos a la comunidad científica y técnica.

Las energías renovables son energías limpias e inagotables, y


su tecnología se está desarrollando rápidamente gracias a iniciativas
como el protocolo de Kyoto, compromiso global contra el cambio
climático. En la Unión Europea y en España se han asumido
totalmente las responsabilidades correspondientes a este compromiso
por un desarrollo sostenible y respetuoso con el medio en que vivimos.
En particular, en los últimos años (desde 2004 hasta la actualidad), la
energía solar fotovoltaica ha protagonizado una implantación sin
precedentes, de carácter exponencial. En enero de 2006 había 52 MW
de potencia instalada en España. En febrero de 2009 eran 3.300.

Algunas de las energías renovables, como la ya mencionada


energía solar o la energía eólica, incluyen un alto componente de
imprevisibilidad en su producción, puesto que dependen de las
variables climáticas de cada instante. Por esta razón se hacen
necesarias herramientas de previsión que permitan la operación del
sistema eléctrico español en condiciones adecuadas de seguridad y
eficiencia. Además, en la actualidad son las empresas distribuidoras
las encargadas de gestionar y vender la energía vertida en sus redes
por determinadas instalaciones del Régimen Especial. Esta
configuración legal-técnica de algunas energías hace que las empresas
distribuidoras se tengan que hacer cargo del coste de los desvíos de
las instalaciones conectadas a su red. Así pues, el interés de tener
buenas previsiones es también económico.

Carlos Entrena Moratiel ii


Universidad Pontificia de Comillas - PFC

En este proyecto se presenta un estudio de viabilidad sobre la


posibilidad de realizar una previsión de la producción de energía solar
fotovoltaica vertida en la red utilizando técnicas de inteligencia
artificial, y más concretamente, Redes Neuronales. Se pretende crear
por tanto un modelo capaz de efectuar previsiones acertadas sobre la
producción eléctrica de dos parques situados en Toledo, uno de 20kW
y otro de 1MW. Esta predicción se realizará con un horizonte temporal
de un día, será horaria, y se utilizarán datos climáticos como radiación
solar, temperaturas y nubosidad para alimentar el modelo. El modelo
debe demostrar la viabilidad de realizar este tipo de previsiones, y se
busca que los métodos utilizados para desarrollar el modelo sean
fácilmente ampliables a otros casos. La creación y optimización de este
modelo constituye el primer objetivo del proyecto.

El segundo objetivo del proyecto consiste en la comparación de


dicho modelo de predicción con la herramienta proporcionada por el
Ministerio de Industria, Turismo y Comercio en el Real Decreto
661/2007, herramienta que propone un sistema de coeficientes por
meses y horas para crear curvas de producción genéricas.

El tercer objetivo que se plantea es la creación de un prototipo


de herramienta informática capaz de lanzar previsiones, que sea
configurable por el usuario y que proporcione una base para futuros
desarrollos. Para crear esta herramienta se utilizarán los
conocimientos metodológicos obtenidos en los objetivos anteriores.

Las Redes Neuronales son ingenios informáticos que emulan el


funcionamiento de los sistemas neurológicos naturales. Son capaces
de adaptarse, generalizar, y simular procesos altamente no-lineales.
Por estas razones constituyen un elemento ideal para la creación de
modelos tipo “caja negra”, como el que se realiza en este proyecto, en
el que se introducen datos climáticos y se obtienen previsiones de
producción eléctrica. Para entrenar el modelo y que sea capaz de
predecir con eficacia se necesitan un gran volumen de datos
históricos. Para crear los modelos y gestionar los datos se ha utilizado
el software MATLAB®, y el “Toolbox” Neural Networks. Son
herramientas versátiles y fáciles de usar. El prototipo de herramienta
de previsión también ha sido programado en MATLAB.
Carlos Entrena Moratiel iii
Universidad Pontificia de Comillas - PFC

El modelo se ha creado satisfactoriamente, y parece viable el


establecimiento de herramientas de previsión mediante Redes
Neuronales. Una serie de posibles mejoras para el proyecto han sido
identificadas, como añadir nuevas variables, incrementar el volumen
de datos históricos o incorporar una lógica más avanzada, capaz de
extrapolar datos de unos parques a otros.

El prototipo de herramienta también ha sido desarrollado de


manera satisfactoria. También se han identificado posibles líneas para
desarrollos futuros. En el proyecto se incluye todo el código
programado, con los algoritmos de iteración, las definiciones de
distintas arquitecturas de Redes Neuronales, el tratamiento de datos,
etc.

Por último, se ha calculado a título indicativo el ahorro anual


que la implantación de una herramienta de previsión basada en
técnicas de este tipo podría suponer en concepto de desvíos para una
instalación tipo de 10MW.

Los objetivos del proyecto han sido cumplidos, y los resultados


han sido satisfactorios. La viabilidad de la previsión horaria de la
energía solar fotovoltaica utilizando técnicas de Redes Neuronales ha
sido probada.

Carlos Entrena Moratiel iv


Universidad Pontificia de Comillas - PFC

SUMMARY

In parallel with technical and scientific evolution, modern


societies are advancing towards a higher level of responsibility with the
environment. This is one of the main reasons why nowadays
renewable energies are experiencing an enormous growth, which
represents a number of challenges for the scientific and technical
community.

Renewable energies are clean and unlimited, and their


technology is rapidly developing thanks to initiatives such as the Kyoto
Protocol, a global commitment against climate change. In the
European Union and Spain the responsibilities associated to this
commitment have been fully accepted; in particular, in the last years
(since 2004), photovoltaic solar energy has been exponentially growing.
In January 2006 there were 52MW of photovoltaic installed capacity in
Spain. In February 2009 this number had grown to 3.300.

Some renewable energies, such as photovoltaic or wind energy,


have a high degree of unpredictability in their output, because they
depend on climatic factors. This is the reason why accurate tools for
predicting the energy being generated are needed, so the electric
system can work in effective and secure conditions. Besides, it is the
Distributing companies who are in charge of managing and selling the
energy poured in their networks by some kinds of Special Regime
technologies. The legal and technical configuration of the system
results in these companies having to pay for the diversions generated
by the photovoltaic plants connected to their networks. Thus, the
interest of having good energy predictions is also economic.

In this Project a viability study about the possibility of


predicting photovoltaic energy production with the aid of artificial
intelligence, and more precisely, Neural Networks, is presented. It is
intended to create a model capable of predicting accurately the
production of two photovoltaic installations sited in the province of

Carlos Entrena Moratiel v


Universidad Pontificia de Comillas - PFC

Toledo, in Spain, one of 20kWp and the other of 1MWp of installed


capacity. This prediction is to be realized with one day of advance
(horizon D+1) and it will be hourly. Climatic data such as sun
radiation, temperatures or cloudiness will be used as input for the
model. This model must demonstrate the viability of establishing this
kind of predictions, and it is intended that methods used for
developing the model will be easily applied to quickly create other
models. The creation and optimization of this first model is the fist
objective of the project.

The second objective of the project is to compare the Neural


Network model with the one given by the Industry, Commerce and
Tourism Ministry of Spain in the Real Decree 661/2007. Their tool is
based on monthly and hourly coefficients to create generic production
curves.

The third objective is the creation of a prototype of software


tool capable of doing predictions, which will be configurable and will
be a base for future developments. In order to create this tool the
methodology and knowledge acquired during the previous objectives
will be used.

Neural Networks are software inventions that emulate natural


neurological systems. They are capable of adapting, generalizing and
simulate highly non-linear processes. This is why they represent a
perfect element to create “black box” models, like the one of this
project, which creates electric production estimates using climatic
data input. In order to train the model a great volume of data is
needed. To create the model and managing the data the software
MATLAB® has been used, with the Neural Network Toolbox. These are
versatile and easy-to-use tools. The prototype of prediction tool has
also been programmed using this software.

Carlos Entrena Moratiel vi


Universidad Pontificia de Comillas - PFC

The model has been successfully created, and it seems viable


to establish prediction tools based in Neural Network technology.

A number of future evolution lines for the model have been


identified; for instance, adding new input variables, increasing the
number of historical data, or incorporating a more complex logic in
order to extrapolate models between different parks.

The tool prototype has also been successfully developed.


Future investigation and development lines have been identified. The
code is included in the project, with the iteration algorithms, the
definitions of the different Neural Network architectures, the data
managing, etc.

Last, it has been roughly calculated the yearly savings that a


prediction based in this kind of techniques could suppose for a typical
10MW photovoltaic facility.

The project objectives having been accomplished, the results


are highly satisfying. A bright future could be expected for photovoltaic
energy predictions using Neural Networks.

Carlos Entrena Moratiel vii


DOCUMENTO 1
MEMORIA
Universidad Pontificia de Comillas - PFC

ÍNDICE

PARTE I –MEMORIA .....................................................................................................8

I. ANTECEDENTES ..................................................................................................9

1. LA ENERGÍA SOLAR .................................................................................... 12

2. LA ENERGÍA SOLAR FV EN EUROPA Y EN ESPAÑA ...................... 16

3. REGULACIÓN ECONÓMICA DEL SECTOR SOLAR


FOTOVOLTAICO ........................................................................................................................ 20

4. PREDICCIÓN DE UN SISTEMA CON ENERGÍA SOLAR .................. 23

II. OBJETIVOS Y METODOLOGÍA ..................................................................... 26

1. OBJETIVOS ...................................................................................................... 26

2. METODOLOGÍA ............................................................................................. 28

III. REDES NEURONALES ..................................................................................... 30

1. EL SISTEMA NERVIOSO Y LA NEURONA BIOLÓGICA................... 32

2. LA RED NEURONAL ARTIFICIAL........................................................... 35

3. ENTRENAMIENTO Y USO DE REDES NEURONALES .................... 40

4. APLICACIONES DE REDES NEURONALES ......................................... 46

IV. CREACIÓN Y OPTIMIZACIÓN DEL MODELO DE PREDICCIÓN ...... 47

1. INTRODUCCIÓN............................................................................................ 47

2. TIPOS DE ERROR ......................................................................................... 50

3. ARQUITECTURAS DE REDES NEURONALES .................................... 56

Carlos Entrena Moratiel iii


Universidad Pontificia de Comillas - PFC

4. SELECCIÓN DE VARIABLES ..................................................................... 62

5. OPTIMIZACIÓN DE LOS PARÁMETROS DE LA RED ...................... 73

6. COMPARACIÓN CON EL SISTEMA DE PREDICCIÓN POR


PERFILES 82

7. RESULTADOS................................................................................................. 86

V. DESARROLLO DE UNA HERRAMIENTA DE PREVISIÓN................... 91

1. ESTRUCTURA DEL PROGRAMA ............................................................. 93

2. FUNCIONES .................................................................................................... 97

VI. CONCLUSIONES .............................................................................................. 108

1. CONCLUSIONES AL MODELO DE PREVISIÓN ............................... 108

2. CONCLUSIONES AL PROTOTIPO DE HERRAMIENTA DE


PREVISIÓN 109

3. FUTURAS LÍNEAS DE INVESTIGACIÓN ........................................... 109

BIBLIOGRAFÍA .......................................................................................................... 113

PARTE II – ESTUDIO ECONÓMICO.................................................................... 115

I. ESTUDIO ECONÓMICO ................................................................................ 116

PARTE III – CÓDIGO FUENTE ............................................................................. 118

Carlos Entrena Moratiel iv


Universidad Pontificia de Comillas - PFC

ÍNDICE DE FIGURAS Y
TABLAS

Ec. 1- salida de una neurona con varias entradas ........................................ 36

Ec. 2- función de transferencia sigmoidea....................................................... 37

Ec. 3- función tangente hiperbólica .................................................................... 38

Ec. 4- error en una Red Neuronal........................................................................ 41

Ec. 5- MSE ...................................................................................................................... 50

Ec. 6- ER ......................................................................................................................... 51

Ec. 7- EE con desnormalización ........................................................................... 52

Ec. 8- EE sin desnormalización ............................................................................ 52

Ec. 9- ERHx con desnormalización ...................................................................... 52

Ec. 10- ERHx sin desnormalización..................................................................... 53

Ec. 11- MERH ............................................................................................................... 53

Ec. 12- MEEH ............................................................................................................... 54

Ec. 13- Error Diario-Horario ................................................................................. 54

Ec. 14- cálculo de una producción diaria a partir de una horaria.......... 84

Ec. 15- media de producción durante un día............................................... 103

Ec. 16- condición que debe cumplir una franja horaria para ser
incorporada al modelo ............................................................................................................. 103

Tabla 1- MW de Potencia instalada en los países de la UE27. Fuente:


Eurobaromet’ER............................................................................................................................. 17

Tabla 2- precios de la energía solar y de la energía vendida en el


mercado, en c€/kWh ................................................................................................................... 21

Tabla 3- Cronograma del proyecto ...................................................................... 28

Carlos Entrena Moratiel v


Universidad Pontificia de Comillas - PFC

Tabla 4- ejemplo de tabla de temperaturas ..................................................... 66

Tabla 5- ejemplos de nubosidades ...................................................................... 67

Tabla 6- Resultado de la iteración de variables ............................................. 70

Tabla 7- Desviaciones típicas de la iteración de variables ........................ 72

Tabla 8- Errores según el número de neuronas de la RN........................... 76

Tabla 9- Desviaciones típicas en las iteraciones del número de


neuronas............................................................................................................................................ 77

Tabla 10- Factores de funcionamiento por mes y hora solar ................... 83

Tabla 11- Error para la previsión diaria (%) .................................................. 86

Tabla 12- errores para las previsiones horaria en distintos modelos


(%) ....................................................................................................................................................... 87

Gráfica 1- Porcentaje de energía renovable respecto a la demanda en


barras de central, descontando la hidráulica R.O. Fuente: CNE ................................. 10

Gráfica 2- Potencia instalada en España desde el año 2006 en MWp.


Fuente: CNE...................................................................................................................................... 18

Gráfica 3- Neuronas entrada-Media Error Real ............................................. 78

Gráfica 4- Producciones diarias durante la prueba ...................................... 84

Gráfica 5- Previsión de energía en los días de prueba, con la producción


real ....................................................................................................................................................... 88

Gráfica 6- Ejemplo de la previsión de un día de prueba ............................. 89

Gráfica 7- Ejemplo de la previsión de un día de prueba ............................. 89

Gráfica 8- Ejemplo de la previsión de un día de prueba ............................. 90

Gráfica 9- Ejemplo de la previsión de un día de prueba ............................. 90

Fig. 1- Placas solares en suelo y en cubierta .................................................... 14

Fig. 2- neurona artificial con una sola entrada ............................................... 35

Fig. 3- capa de varias neuronas ............................................................................. 36

Carlos Entrena Moratiel vi


Universidad Pontificia de Comillas - PFC

Fig. 4- función de transferencia escalón ............................................................ 37

Fig. 5- función de transferencia lineal ................................................................ 37

Fig. 6- función de transferencia sigmoidea ...................................................... 38

Fig. 7- función tangente hiperbólica ................................................................... 38

Fig. 8- errores de entrenamiento y de validación en función de la época


............................................................................................................................................................... 44

Fig. 9- Red lineal multicapa .................................................................................... 57

Fig. 10- Red Neuronal horaria ............................................................................... 58

Fig. 11-Ejemplo de Red Neuronal serie-paralelo ........................................... 59

Fig. 12- Red diaria-horaria con realimentación ............................................. 60

Fig. 13- ejemplos de tablas de radiación ........................................................... 65

Fig. 14- presencia de Unión Fenosa Distribución en España .................... 67

Fig. 15- Funciones de transferencia utilizadas en el modelo .................... 80

Fig. 16- estructura de la herramienta de previsión ...................................... 94

Carlos Entrena Moratiel vii


Universidad Pontificia de Comillas - PFC

PARTE I –
MEMORIA

Carlos Entrena Moratiel 8


Universidad Pontificia de Comillas - PFC

I. ANTECEDENTES

La energía solar fotovoltaica ha experimentado un enorme


crecimiento en los últimos años. Especialmente desde la publicación
del Real Decreto 661/2007, de 25 de mayo de 2007, en España se ha
visto un incremento exponencial del número de parques solares. En
efecto, la sociedad española actual, en el contexto de la reducción de
la dependencia energética, de un mejor aprovechamiento de los
recursos disponibles y de una mayor sensibilización hacia el medio
ambiente, demanda una mayor cantidad de energía renovable en el
“mix” energético.

De esta forma han surgido numerosas iniciativas tanto en la


Unión Europea, mediante Directivas y paquetes de medidas de apoyo
a las energías renovables, como en España, como el citado RD 661 o,
anteriormente, el Plan de Fomento de Energías Renovables de 1999,
que establecía objetivos de crecimiento para tecnologías renovables
con el fin de conseguir que un 12% de la producción energética
proceda de dichas fuentes en 2010. Este objetivo se ha ido
aumentando por la necesidad de reducir las emisiones de gases de
efecto invernadero. En España, la participación de las energías
renovables descontando la hidráulica fuera del Régimen Especial no
es suficiente para cumplir los objetivos de la Unión Europea, pero
muestra un crecimiento muy importante, como se ve en la Gráfica 1.

Carlos Entrena Moratiel 9


Universidad Pontificia de Comillas - PFC

Porcentaje de producción con


energías renovables
16%
14%
12%
10%
8%
6%
4%
2%
0%
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
Gráfica 1- Porcentaje de energía renovable respecto a la demanda en
barras de central, descontando la hidráulica R.O. Fuente: CNE

Gracias a este apoyo a las energías renovables España se ha


convertido en un mercado de primera magnitud en los sectores eólico
y solar fotovoltaico. Han surgido numerosas empresas dedicadas a
cada una de las partes de la cadena de producción, generando
puestos de trabajo y exportando tecnología española al exterior.

Así, la energía solar se ha convertido en 2007 y 2008 en la


protagonista de un crecimiento exponencial. La potencia instalada
creció en el año 2007 un 320%. Esto ha generado problemas a nivel
organizativo, con la gestión de la conexión de los parques a la red, a
nivel técnico, por el control de la nueva energía vertida en la red y
para la cual no existen previsiones fiables, y por último a nivel
económico: al haberse superado los objetivos de implantación en más
de un 1250% (datos del CNE en febrero de 2009), hay que descartar
el mantenimiento de las primas estipuladas en el RD661.

En el Capítulo I de este proyecto se introduce el mercado


español de la energía solar fotovoltaica y el Régimen Especial en
general. En el Capítulo II se enumeran los objetivos del proyecto. En
el Capítulo III se explica la tecnología de Redes Neuronales. En el

Carlos Entrena Moratiel 10


Universidad Pontificia de Comillas - PFC

Capítulo IV se expone el estudio de viabilidad realizado sobre la


posibilidad de predecir la producción de energía solar fotovoltaica con
Redes Neuronales, así como sus resultados. En el Capítulo V se
presenta una herramienta de previsión programada en Matlab a
partir de los conocimientos adquiridos durante el estudio de
viabilidad. Por último, en el Capítulo VI se presentan las conclusiones
y las futuras líneas de desarrollo.

Carlos Entrena Moratiel 11


Universidad Pontificia de Comillas - PFC

1. LA ENERGÍA SOLAR

La energía solar se puede dividir en dos tipos principales:


energía solar térmica y energía solar fotovoltaica. La primera implica
la transformación de la luz solar en calor que es utilizado para
calentar un fluido. Es una tecnología muy útil a la hora de mejorar la
eficiencia energética de los edificios, y se están empezando a
implementar sistemas de producción eléctrica con espejos
concentradores que crean un foco de alta temperatura. La energía
solar fotovoltaica consiste en la transformación directa de luz en
electricidad gracias al efecto fotoeléctrico, y es la más utilizada en el
mundo.

El efecto fotoeléctrico fue descubierto en 1839 por el físico


francés Alexandre Edmond Bequerel, y a lo largo del siglo XIX se fue
experimentando con diversas aplicaciones del mismo. Así, en 1873
W.G.Adams y R.E.Day produjeron la primera célula fotovoltaica de
selenio. Albert Einsetein ganó el premio Nobel de física en 1921
gracias a su artículo de 1904 sobre el efecto fotoeléctrico. Pero no fue
hasta 1953, cuando se fabricó en los laboratorios Bell de Nueva
Jersey la primera célula de silicio, que se originó un interés
importante por la tecnología fotovoltaica. En 1954 se encargó a la
industria americana la fabricación de células solares para
aplicaciones espaciales, tarea en la que destacó Hoffman Electronic.
Los satélites fueron dotados desde una etapa muy temprana de
placas solares, lo cual motivó el desarrollo de esta tecnología, tan
cara en un primer momento.

La crisis del petróleo de 1973 supuso un nuevo interés por


las energías renovables, y con ellas la energía solar. En 1975 las
aplicaciones terrestres de la energía solar fotovoltaica superaron por
primera vez a las espaciales. La producción de paneles solares en
todo el mundo fue de 500kW en 1977. Desde entonces, y hasta hoy,
no ha dejado de aumentar la producción de células (unidad básica de

Carlos Entrena Moratiel 12


Universidad Pontificia de Comillas - PFC

producción) y módulos (agrupaciones de células en serie)


fotovoltaicos para todo tipo de aplicaciones: desde la alimentación de
pequeños dispositivos electrónicos, como calculadoras, hasta equipos
de generación para regiones aisladas.

Recientemente, con la mejora de los rendimientos de los


módulos y el abaratamiento en su fabricación, ha aumentado el
interés hacia estos dispositivos como fuente de energía conectada a la
red eléctrica. Se han multiplicado así los parques solares de
tecnología fotovoltaica. Existen diversas técnicas para aprovechar la
energía solar. La más normal es la instalación de placas con varios
módulos fotovoltaicos, que generan electricidad. Varias placas se
agrupan formando un parque solar, que, dotado de un inversor y un
transformador, vierte electricidad a la red.

La energía solar depende de la radiación solar incidente en las


placas. Esta radiación depende a su vez de la hora del día, por el
distinto espesor de atmósfera que deberán atravesar los rayos de luz,
y también de la época del año, por la variación de la distancia de la
Tierra al Sol y del ángulo del eje de rotación de la tierra con la
elíptica. Además, la producción depende también de la nubosidad,
puesto que a pesar de que las nubes dejan pasar una radiación
residual o difusa, similar a la que difunde la propia atmósfera (pero
menor), la radiación que más energía produce es la directa, es decir,
los rayos de Sol que inciden directamente sobre la placa sin haber
modificado su composición espectral durante el proceso de la
difusión.

Carlos Entrena Moratiel 13


Universidad Pontificia de Comillas - PFC

Fig. 1- Placas solares en suelo y en cubierta

Hay numerosas formas de mejorar el aprovechamiento de


estas placas: por ejemplo, los seguidores verticales y horizontales,
que buscan que la superficie de la placa sea perpendicular a la
incidencia de los rayos solares, para aumentar la absorción y limitar
la reflexión, o las lentes de fresnel para concentrar la luz. En general
se están desarrollando muchas tecnologías distintas, y la
acumulación de producción hace que los costes se abaraten
constantemente, lo cual augura un futuro prometedor a la energía
solar fotovoltaica.

Las ventajas más destacadas son:

- Es inagotable a escala humana.


- Tiene un pequeño o nulo impacto ecológico.
- Permite una producción distribuida.
- Tiene una elevada calidad energética.
- Permite gran diversidad de aplicaciones y a escalas muy
distintas, tanto en emplazamientos aislados como en
parques solares.

El territorio español, además, dispone de irradiación solar en


abundancia. Por climatología y por estructura del terreno, con
extensas áreas de bajo valor agrícola, España es un país
especialmente adecuado a la instalación de parques solares.

Carlos Entrena Moratiel 14


Universidad Pontificia de Comillas - PFC

La mayor desventaja es posiblemente su precio elevado, que


ha hecho que se requieran fuertes incentivos para lanzar su
implantación en España, como se verá en el punto 0. A pesar de esto,
y aunque su nivel de implantación se encuentre por debajo del de
otras energías renovables como la eólica, de seguir al ritmo actual de
crecimiento la energía solar podría representar una parte importante
de la producción eléctrica española.

Carlos Entrena Moratiel 15


Universidad Pontificia de Comillas - PFC

2. LA ENERGÍA SOLAR FV EN
EUROPA Y EN ESPAÑA

En Europa se ha ido implementando una política de


reducción de la dependencia energética y de respeto al medio
ambiente. En este contexto se han multiplicado las medidas
encaminadas a fomentar la entrada masiva en el mercado de las
energías renovables. Un elemento clave en este proceso fue la firma
del protocolo de Kyoto en 1997, por el que la Unión Europea se
compromete a reducir sus emisiones de gases de efecto invernadero
entre 2008 y 2012 en un 8% respecto a los niveles de 1990. La
finalidad de estas políticas es reducir o mitigar las consecuencias del
cambio climático. España está muy retrasada en cuanto al
cumplimiento de los objetivos que le han sido asignados, habiendo
incrementado significativamente sus emisiones de CO2.

En el marco del cumplimiento del protocolo de Kyoto, la


Comisión Europea adoptó la comunicación “Energía para el futuro:
fuentes de energía renovables – Libro blanco para una estrategia y un
plan de acción comunitarios”, en la que se proponía doblar la
participación de las energías renovables, pasando del 6% al 12% en
2010. Esto fue transpuesto a la legislación española en la Ley
54/1997. En el año 2001 una nueva Directiva europea fijaba como
nuevo objetivo para España la producción en 2010 de un 29,4% de
energía procedente de fuentes renovables, con el fin de alcanzar un
22,1% a nivel europeo. Por la dificultad de alcanzar dicho objetivo
para España y la mayoría de países europeos, a excepción de
Alemania, Dinamarca y Finlandia, el objetivo ha sido pospuesto hasta
el año 2020.

Carlos Entrena Moratiel 16


Universidad Pontificia de Comillas - PFC

País 2006 2007


Alemania 2.743,00 3.846
España 174,995 682
Italia 50 100,2
Holanda 52,705 55,005
Francia 33,865 46,659
Austria 25,585 28,6
Luxemburgo 23,696 23,793
Portugal 3,416 17,87
Reino Unido 14,26 17,66
Grecia 6,695 9,17
Bélgica 4,161 6,161
Suecia 4,85 6,15
Finlandia 4,521 5
República Checa 0,843 3,961
Dinamarca 2,9 3,12
Chipre 0,976 1,7
Polonia 0,438 0,638
Eslovenia 0,363 0,635
Irlanda 0,4 0,4
Hungría 0,25 0,3
Rumanía 0,19 0,3
Bulgaria 0,066 0,141
Malta 0,058 0,1
Eslovaquia 0,02 0,06
Lituania 0,025 0,04
Estonia 0,008 0,013
Letonia 0,006 0,006
Total UE 3.148,29 4.689,50
Tabla 1- MW de Potencia instalada en los países de la UE27. Fuente:
Eurobaromet’ER

Como se ve en la Tabla 1 el país europeo con más penetración


de la energía solar fotovoltaica en su mercado es Alemania, que en
2006, con casi 3.000MW instalados, tenía más de 15 veces la
potencia solar española. En la actualidad, tras el gran incremento
que ha visto la energía solar en España, como se ve en la Gráfica
2Gráfica 2, España ha alcanzado a Alemania en cuanto al orden de
magnitud de la potencia instalada, y se convierten así en los mayores

Carlos Entrena Moratiel 17


Universidad Pontificia de Comillas - PFC

generadores de energía solar fotovoltaica del mundo. Esto


proporciona una ventaja a la Unión Europea en cuanto a esta
tecnología se refiere. La industria fotovoltaica podría llegar a ser una
fuente de riqueza importante, tanto en términos de abastecimiento de
energía, como de exportación de servicios de alto valor añadido,
además de suponer una fuente de energía limpia e inagotable.

Potencia instalada en España (MWp)


3.500

3.000

2.500

2.000

1.500

1.000

500

0
marzo
mayo

marzo
mayo

marzo
mayo
julio

julio

julio
enero

enero

enero

enero
septiembre
noviembre

septiembre
noviembre

septiembre
noviembre
2006 2007 2008 09

Gráfica 2- Potencia instalada en España desde el año 2006 en MWp.


Fuente: CNE

En España se comenzó a regular la introducción de energía


solar en el año 1980, momento en el cual aparece la normativa
referida al Régimen Especial, en plena crisis del petróleo. A partir de
entonces, destaca como impulso para la energía solar en España el
Plan de Fomento de Energías Renovables para los años 2000-2010,
que incluía incentivos para alcanzar una potencia instalada de
371MW en el año 20101. Otro documento importante es el Real

1 Este objetivo fue aprobado en la revisión del año 2005 (Plan de


Energías Renovables), tras haber sido cumplidos los objetivos del PFER para
la energía solar con antelación.

Carlos Entrena Moratiel 18


Universidad Pontificia de Comillas - PFC

Decreto 436/2004, de 12 de marzo, que establece un nuevo marco


regulatorio para el Régimen Especial, y fija nuevas primas e
incentivos para las energías renovables. Con ese documento
comienza la “explosión” de proyectos en España, que llegarán a su
madurez con el Real Decreto 661/2007, de 25 de mayo, en el que se
revisan las primas al alza y se establece una fecha límite, haciendo de
la inversión en energía solar un negocio seguro y lucrativo. Así, los
proyectos se multiplicaron, como se aprecia en la Gráfica 2, en la que
existe un comportamiento exponencial hasta septiembre de 2008,
fecha límite del RD661 calculada a partir del momento en que se
detectó que se había instalado el 85% de la potencia objetivo.

En un intento de racionalizar las retribuciones, se aprobó el


26 de septiembre de 2008 el Real Decreto 1578/2008, por el que se
cambian las tarifas reguladas para las instalaciones de energía solar
fotovoltaica conectadas posteriormente a la fecha límite indicada en el
RD661. Además, se dividen las instalaciones en dos tipos: las
ubicadas en cubiertas de edificios, y las ubicadas en suelo. Se
establecen convocatorias anuales con cupos de potencia revisables, y
tarifas decrecientes en caso de cumplirse dichos cupos. Esto permite
una penetración de la energía solar más acorde con la demanda del
mercado, evitando además un sobrecoste excesivo en la tarifa
eléctrica futura.

Destaca además, en este contexto, el impulso que se trata de


dar a las instalaciones en cubiertas. En efecto, la energía solar es
intensiva en superficie, y por tanto es lógico intentar instalar las
placas solares en tejados o paredes que no tienen otro uso. El marco
regulatorio actual es adecuado a este cambio de concepto de la
energía solar, que se convierte así en una energía de producción
distribuida, con lo que eso supone para mejorar la eficiencia de la red
eléctrica.

Se puede decir que la energía solar fotovoltaica es una


apuesta importante para la Unión Europea, y que puede significar
una importante mejora en eficiencia energética y respeto al medio
ambiente, como requerirá la sociedad futura.

Carlos Entrena Moratiel 19


Universidad Pontificia de Comillas - PFC

3. REGULACIÓN ECONÓMICA
DEL SECTOR SOLAR
FOTOVOLTAICO

El Régimen Especial, como se viene viendo a lo largo del


punto 2, es un conjunto de instalaciones de producción de energía
que, por sus especiales características técnicas y de interés social,
cuentan con una regulación jurídica y económica particular. Las
tecnologías que componen este grupo son: las energías renovables
(solar, eólica, hidráulica de potencia menor de 50MW, la biomasa), la
cogeneración y el tratamiento de residuos.

Para acelerar la implantación de estas tecnologías en el


mercado se ha optado por complementar la retribución de la energía
que producen con un conjunto de primas. Estas primas son variables
en función de la potencia instalada, el tipo de tecnología, la calidad
de la energía vertida, la seguridad del suministro, el beneficio
medioambiental, el coste de la inversión, y otros factores.

En el contexto de un mercado energético abierto, como es el


español, se ofrecen dos posibilidades a los productores de energía en
Régimen Especial, según el Artículo 24.1 del RD661/2007:

- ceder la electricidad al sistema a través del punto de


conexión, percibiendo por ello una tarifa regulada y única
para todos los periodos de programación.
- vender la electricidad en el mercado de producción de
energía eléctrica, percibiendo una prima.

La opción que elija el productor deberá ser mantenida


durante un año. En las instalaciones de energía solar fotovoltaica, la
tarifa regulada es muy ventajosa; tanto, que no se incluye la opción
de ir a mercado con prima. En el RD661 la tarifa regulada para
instalaciones solares fotovoltaicas es de:

Carlos Entrena Moratiel 20


Universidad Pontificia de Comillas - PFC

- 44,01c€/kWh para instalaciones de potencia menor o


igual que 100kW
- 41,75c€/kWh para instalaciones con potencia
comprendida entre 100kW y 10MW
- 22,9764c€/kWh para instalaciones con potencia
comprendida entre 10MW y 50MW

Al ser relativamente fácil segmentar los parques solares, se


puede conseguir cobrar la tarifa más favorable. Así, según datos del
CNE, no existen en España parques solares de más de 50MW de
potencia instalada. Como se ve en la Tabla 1Tabla 2 el precio medio
de la energía solar fotovoltaica vertida en la red fue de 45,22c€/kWh
en el año 2008. El precio medio del mercado, contando restricciones,
fue de 6,289c€/kWh. Esto da una idea de la magnitud de la
subvención.

2007 2008
Precio en el mercado (c€/kWh) 4,024 6,289
Precio energía solar
fotovoltaica 43,734 45,22
Relación 10,868 7,19
Tabla 2- precios de la energía solar y de la energía vendida en el
mercado, en c€/kWh

Esta tarifa regulada ha sido modificada tanto en cuantía


como en procesos de revisión y actualización por el Real Decreto
1578/2008, de 26 de septiembre. Las instalaciones pasan a dividirse
en dos grupos, como se explica en el punto 2: las instalaciones en
cubiertas de edificios, que además se dividen en dos subtipos, de
potencia inferior o superior a 20kW; y las instalaciones en suelo. Las
nuevas tarifas reguladas son de:

- Para las instalaciones en cubiertas de edificios con


potencias iguales o inferiores a 20kW, 34c€/kWh.
- Para el resto de instalaciones, 32c€/kWh.

Carlos Entrena Moratiel 21


Universidad Pontificia de Comillas - PFC

También se incorpora un sistema de control para evitar


parques de gran potencia segmentados con el fin de obtener ventajas
económicas. Además, para limitar de manera efectiva la conexión y
poder controlar mejor los cumplimientos de cupos de potencia para
energía solar, evitando así incurrir en sobrecostes, se establecen
convocatorias anuales para proyectos, y revisiones de las tarifas en
caso de ser cumplidos dichos cupos.

Se ha procurado así limitar en cierta medida la avalancha de


conexiones a la red de instalaciones de energía solar fotovoltaica,
pero intentando mantener un ritmo adecuado de implantación,
importante para la supervivencia de las industrias auxiliares que se
han creado en España y para cumplir los objetivos medioambientales
que le han sido asignados.

Carlos Entrena Moratiel 22


Universidad Pontificia de Comillas - PFC

4. PREDICCIÓN DE UN SISTEMA
CON ENERGÍA SOLAR

La conexión de instalaciones de Régimen Especial a las redes


de distribución y transporte tienen un efecto cada vez más
importante sobre la operación del sistema eléctrico español. Estas
tecnologías no son programables como las de Régimen Ordinario, en
las que el operador de la planta puede decidir el consumo de
combustible, decidiendo así la producción con poca incertidumbre.

Es así que se presenta la necesidad de establecer previsiones


para la producción de las instalaciones descritas, con el fin de
asegurar una operación del sistema eficaz y segura, pudiendo el
Operador (en este caso, Red Eléctrica Española) anticiparse a los
posibles problemas técnicos que pudiera plantear el vertido de más o
menos cantidad de energía a la red en determinados puntos.
Asimismo la predicción es de interés para las empresas distribuidoras
y para las propias instalaciones de Energía Solar Fotovoltaica.

Estado del arte

Existen numerosas formas de predecir la producción:

- Con previsiones climáticas: modelos físicos, con curvas


de radiación-producción, que en función de la
radiación prevista calculan la producción probable;
series temporales.
- Sin previsiones climáticas: Modelos estadísticos,
basados en datos históricos y en radiaciones medias
mensuales.

El Ministerio de Industria, Turismo y Comercio proporciona


una herramienta de predicción sin cálculos meteorológicos en anexo
al RD661. Esta herramienta consiste en una tabla con coeficientes
por meses, horas y zonas climáticas en España, que al ser

Carlos Entrena Moratiel 23


Universidad Pontificia de Comillas - PFC

multiplicados por la potencia instalada dan una previsión


aproximada de la producción en cada hora correspondiente. La
predicción obtenida con esta herramienta se compara con la obtenida
mediante el modelo de Redes Neuronales en el Capítulo IV, en el
punto 6.

Muchas empresas han desarrollado herramientas que


comercializan a los productores de energía solar fotovoltaica con el fin
de que puedan realizar previsiones ajustadas de su producción, y
puedan también programar mantenimientos, etc.

Unos modelos que han obtenido muy buenos resultados en la


previsión de la producción de energía eólica son los basados en Redes
Neuronales. A la luz de algunos proyectos de este tipo, como el
estudiado en (Blázquez García, 2003), en el que se compara la
previsión conseguida mediante series temporales del tipo ARIMA con
la conseguida mediante Redes Neuronales, y en (Canseco, 2006), en
el que se crea un modelo de previsión para energía eólica a escala
nacional, se ha decidido estudiar la aplicación de las Redes
Neuronales a la previsión de energía solar fotovoltaica.

Motivación

En el contexto descrito anteriormente, las empresas


distribuidoras, como representantes de un gran número de parques
solares conectados a sus redes de distribución, están interesadas en
disponer de buenas previsiones sobre la energía que será vertida en
la red con el fin de mejorar la operación del sistema.

Las empresas distribuidoras son las encargadas de gestionar


la venta de la energía vertida en su red por dichas instalaciones,
venta que realizan todos los días en el mercado diario. Para realizar
dicha venta necesitan previsiones de la producción de los parques,
entre los que se dan dos casos:

- los parques que sí deben tener equipo de medida


horaria.

Carlos Entrena Moratiel 24


Universidad Pontificia de Comillas - PFC

- los parques que no están obligados a disponer de


equipo de medida horaria, según lo dispuesto en el
Reglamento de puntos de medida de los consumos y
tránsitos de energía eléctrica, aprobado por el Real
Decreto 2018/1997, de 26 de diciembre.

En el primero de los casos, el propietario de cada instalación


debe enviar una previsión horaria con una determinada antelación,
siendo él quien se hace cargo del coste de los desvíos. En el segundo
caso, no se cobran desvíos a estas instalaciones, sino que es la propia
empresa distribuidora la que se encarga de asumirlos.

Por tanto, a las empresas distribuidoras les interesa disponer


de buenas previsiones de la predicción por dos motivos: primero, para
reducir el efecto de los desvíos en el mercado; y segundo, para
obtener una evaluación en tiempo real de las instalaciones que no
disponen de telemedida.

Se pretende crear un modelo de previsión capaz de predecir


horariamente la producción en dos parques situados en la provincia
de Toledo, utilizando variables climáticas. Uno de estos parques
dispone de 20kW de potencia instalada, y el otro, 1MW. Esta
previsión se realizará cada día para el día siguiente, es decir, puede
considerarse una previsión a corto plazo. En el siguiente Capítulo II,
se verá con más detalle cuáles son las intenciones del proyecto y
cómo se intentarán llevar a cabo.

Este modelo va a crearse usando técnicas de Redes


Neuronales. Las Redes Neuronales, por su facilidad de manejo y por
su capacidad de modelizar procesos no lineales, entre otras ventajas,
se presentan como una herramienta idónea para la previsión. Estas
técnicas de Inteligencia Artificial se presentan en el Capítulo III

Carlos Entrena Moratiel 25


Universidad Pontificia de Comillas - PFC

II. OBJETIVOS Y
METODOLOGÍA

1. OBJETIVOS

En este proyecto se estudia la viabilidad de la creación de


una herramienta de previsión de la energía solar producida mediante
un sistema de Inteligencia Artificial basado en la tecnología de Redes
Neuronales. Este sistema debería permitir a las empresas
distribuidoras mejorar sus previsiones de energía solar vertida en su
red, puesto que en la actualidad son ellas las que se encargan de
vender al mercado la energía producida en la mayoría de parques
solares españoles.

En este proyecto se pretende cumplir dos objetivos


principales y uno secundario.

El primer objetivo consiste en establecer un modelo de


previsión horaria con horizonte temporal de un día (D+1) de la
producción de energía solar fotovoltaica en dos parques solares,
mediante técnicas de redes neuronales y utilizando variables
climáticas. Con dicho modelo se pretende analizar la viabilidad de
estas técnicas para la obtención de predicciones con una precisión
adecuada, y se pretende también que los algoritmos utilizados sean
extensibles a nuevas instalaciones fotovoltaicas. Con este fin se
incluyen en la Parte III: Código Fuente todas las funciones utilizadas.
Así, el modelo podría ser ampliado con cierta facilidad a más casos de
Carlos Entrena Moratiel 26
Universidad Pontificia de Comillas - PFC

parques solares. La descripción de la creación y optimización del


modelo se encuentra en el Capítulo IV.

El segundo objetivo consiste en comparar los resultados


obtenidos con el modelo creado con los que proporciona la
metodología descrita en el RD661/2007. Los resultados de esta
comparación se encuentran en el Capítulo IV, en el punto 6.

El tercer objetivo que se ha planteado es desarrollar un


prototipo de herramienta de previsión utilizando los conocimientos
metodológicos obtenidos durante la creación del modelo de previsión.
Esta herramienta proporcionará una base para la implantación de
una herramienta extensible a más instalaciones. Se describe la
herramienta informática en el Capítulo V, y se incluye el código en la
Parte II: Código Fuente del proyecto.

Carlos Entrena Moratiel 27


Universidad Pontificia de Comillas - PFC

2. METODOLOGÍA

Para llevar a cabo los objetivos se ha utilizado el programa


informático Matlab®, y se han incluido muchas de las funciones
incluidas en el “Toolbox” NNTool®. Matlab permite una programación
relativamente sencilla, y es una herramienta adecuada a las
iteraciones con gran número de matrices y datos que se han llevado a
cabo.

En la Tabla 3 se presenta un cronograma de las tareas


realizadas durante el proyecto:

TAREA
OCTUBRE Estado del arte
NOVIEMBRE Creación del modelo
DICIEMBRE Creación del modelo
ENERO Optimización del modelo
FEBRERO Comparación con perfiles
MARZO Creación de la herramienta de previsión
ABRIL Creación de la herramienta de previsión
MAYO Memoria
Tabla 3- Cronograma del proyecto

Se partirá de una serie de datos históricos de un periodo de


2007-2008:

- climáticos (previsiones de radiación solar, nubosidad y


temperatura)
- de producción horaria en dos parques solares
fotovoltaicos de Toledo.

Con dichos datos, y utilizando las herramientas informáticas


ya mencionadas, pasaremos a buscar una red optimizada que
permita minimizar el error de previsión y cumplir así el Objetivo 1.

Para crear una red óptima es necesario seguir una serie de


pasos:
Carlos Entrena Moratiel 28
Universidad Pontificia de Comillas - PFC

- Detectar las variables más influyentes y que mejoran la


previsión
- Decidir las características del modelo: arquitectura de
la red, número de capas, número de neuronas por
capa, tipo de entrenamiento, tipo de normalización de
los datos, funciones de transferencia de las neuronas,
etc.
- Decidir los conjuntos de validación y prueba que
mejoren las previsiones, teniendo especial cuidado en
evitar el sobreentrenamiento que impediría una
correcta generalización.

Para llevar a cabo estos procesos, generalmente iterativos, de


selección de variables y caracterización del modelo, se crearán unas
herramientas en Matlab para detectar configuraciones óptimas.
Además, es importante que estas herramientas o módulos sirvan
para efectuar nuevos análisis en el futuro: por ejemplo, en el caso de
querer prever la producción en un parque solar en Burgos, se podrían
introducir sus datos de producción en el modelo para ver qué nuevas
entradas climáticas son las que ofrecen mejores resultados, y que no
tienen por qué ser las mismas que para los parques de Toledo.

Las técnicas de Redes Neuronales son complejas y están


llenas de alternativas; de la obtención de un modelo efectivo y
adecuado dependerá la posibilidad de realizar una previsión fiable.
Por eso es necesario llevar a cabo estas tareas de forma metódica.
Definiremos para ello un conjunto de errores que servirán de control
de resultados.

Carlos Entrena Moratiel 29


Universidad Pontificia de Comillas - PFC

III. REDES NEURONALES

Existen numerosas técnicas matemáticas para efectuar


previsiones en función de datos del pasado. Un ejemplo de esto,
posiblemente el más importante, es el modelo ARIMA, de series
temporales, que se basa en el uso de datos del pasado, con diferentes
decalajes temporales, para modelizar de manera lineal los sucesos en
el presente.

Como se ha explicado, el método escogido para crear la


herramienta de previsión es la Inteligencia Artificial, y más
concretamente, las técnicas de Redes Neuronales Artificiales. Se ha
escogido este sistema por varios motivos: el buen resultado que ha
dado en anteriores modelos de características similares, como
(Blázquez García, 2003) y (Canseco, 2006); por las características que
se estudiarán a continuación y que hacen de las Redes Neuronales
unas herramientas idóneas para la modelización de sistemas
altamente no-lineales; y finalmente, por la facilidad de implantarlo
gracias a las herramientas de Matlab® , que supone una gran ayuda
a la hora de programar algoritmos complejos basados en esta
tecnología.

En los siguientes apartados se presentan las características


más importantes de las Redes Neuronales Artificiales, haciendo
especial hincapié en los elementos que tendrán relevancia para el
modelo de predicción analizado e implantado en los Capítulos IV y V.
Esta introducción permitirá al lector familiarizarse con algunos
conceptos importantes en dichos capítulos, aunque se haya buscado
ante todo sencillez y concisión en la explicación de las ideas

Carlos Entrena Moratiel 30


Universidad Pontificia de Comillas - PFC

matemáticas que subyacen a estas complejas tecnologías


informáticas.

Carlos Entrena Moratiel 31


Universidad Pontificia de Comillas - PFC

1. EL SISTEMA NERVIOSO Y LA
NEURONA BIOLÓGICA

La tecnología de las Redes Neuronales Artificiales es la


aplicación informática de un concepto biológico: las redes
autoasociativas basadas en impulsos electroquímicos que permiten
una gran complejidad en los animales superiores.

En efecto, con el fin de desarrollar un sistema de control


centralizado para las funciones biológicas tales que la respiración, el
metabolismo y la interpretación del medio, los sistemas neurológicos
animales han ido evolucionando hacia una mayor complejidad.

En los sistemas nerviosos el elemento básico es la neurona.


Esta célula tiene dos elementos que permiten su asociación en redes:

- Las dendritas, que son pequeñas protuberancias en


su cuerpo
- El axón, parecido a una dendrita mucho más larga y
que se puede ramificar conectándose con las dendritas
de muchas otras neuronas.

Estos dos elementos permiten que se formen redes complejas


y altamente interconectadas, pues entre los axones y las dendritas se
forman uniones químicas llamadas sinapsis. El funcionamiento
básico de dichas sinapsis es el siguiente: a la neurona le llegan
señales de entrada químicas a través de sus dendritas. Si se llega a
un determinado potencial (se supera el umbral o bias) se transmite
por el cuerpo de la neurona una onda de polarización. Esta onda se
propaga por el axón liberando neurotransmisores que a su vez
activan las dendritas de otras neuronas. En función del uso de una
conexión sináptica ésta se puede ver reforzada, activándose con
menos potencia de señal. Esta característica de aprendizaje auto
adaptativo es una de las más importantes para una red neuronal.

Carlos Entrena Moratiel 32


Universidad Pontificia de Comillas - PFC

Se calcula que en el cerebro humano existen del orden de


10 conexiones, lo cual supondría, en el caso más sencillo de un “bit”
de almacenamiento de memoria por cada par de neuronas, una
memoria de 62,5 · 10
bytes, o 62.500 Gigabytes. Sin embargo,
puesto que existen numerosas conexiones múltiples, creándose
subsistemas en paralelo, la potencia real del cerebro humano es casi
inimaginable.

Las características principales de las redes neuronales


biológicas, y que se han intentado emular en sus versiones
artificiales, son las siguientes:

- No linealidad: la función de transferencia de una


neurona es no lineal, y por tanto son muy útiles para
modelizar procesos físicos no lineales
- Adaptatividad: las redes neuronales son capaces de
integrar información del medio, ya sean señales de
entrada que refuerzan un nexo sináptico, o señales de
error que modifican los “pesos” sinápticos de sus
conexione, adaptándose así a un medio cambiante. La
capacidad de aprendizaje se verá con más detalle en el
punto 3.
- Generalización: gracias a su forma de aprender y a su
organización en paralelo, una Red Neuronal puede
generalizar, esto es, dar una salida determinada
habiendo recibido una entrada que no pertenece a su
conjunto de entrenamiento. Esto permite modelizar
procesos cambiantes, mejorando aún más la
adaptatividad de las RNs.
- Tolerancia al fallo: si alguna de las neuronas falla o
muere, el sistema es capaz de recuperarse y adaptarse
en consecuencia. En las aplicaciones en hardware que
usan RNs esto puede ser interesante, aunque en el
modelo creado en este proyecto no tiene especial
relevancia.

Carlos Entrena Moratiel 33


Universidad Pontificia de Comillas - PFC

- Implementación a muy gran escala (VLSI): al estar


distribuidas en paralelo, las neuronas computan muy
rápidamente y son especialmente fáciles de integrar en
sistemas informáticos organizados en paralelo.

Estas características hacen que las RNs tengan una serie de


ventajas frente a otras técnicas informáticas. En el contexto de este
proyecto son especialmente importantes la no-linealidad y la
generalización. No-linealidad porque los procesos físico-técnicos
detrás de la conversión de fotones en energía eléctrica son muy poco
lineales, y más en la escala de varios parques y por tanto gran
número de placas y módulos fotovoltaicos. Y generalización porque
permite la creación de un modelo dinámico que vaya aprendiendo a
medida que se usa, y que no se limita a copiar los casos que le han
sido presentados sino que puede discernir cuáles son los factores
determinantes del proceso modelizado. Así, aunque los creadores y
usuarios del modelo no sepan qué ocurre tras el mismo, esto es
irrelevante para su funcionamiento: es una verdadera caja negra.

Carlos Entrena Moratiel 34


Universidad Pontificia de Comillas - PFC

2. LA RED NEURONAL
ARTIFICIAL

Una Red Neuronal Artificial se basa, de forma genérica, en la


interconexión de un gran número de elementos de procesamiento
simples (neuronas) organizadas de forma jerárquica y usualmente
adaptativa de tal manera que se pueden efectuar diversos procesos
en paralelo (ETSI Minas, 2004).

Para definir uno de estos sistemas es necesario especificar un


gran número de parámetros, que se irán viendo a continuación:

Neurona simple

Una neurona a la que llega una entrada está organizada de la


siguiente manera:

Fig. 2- neurona artificial con una sola entrada

p es el valor de entrada a la neurona. w representa el peso de


la conexión entre ese valor de entrada y la neurona, y supone una
multiplicación. A dicha multiplicación se le añade el bias, b, y la
suma es la entrada total, que pasa por la función de entrada f para
dar la salida de la neurona a. Este es el funcionamiento básico de
una neurona en un caso normal. Cuando existen varias entradas, es

Carlos Entrena Moratiel 35


Universidad Pontificia de Comillas - PFC

decir, p pasa a ser un vector en vez de un escalar, también existe un


vector de pesos para la neurona, y la función pasaría a ser:

 ·   

Ec. 1- salida de una neurona con varias entradas

Capa de neuronas

Una RN básica está constituida de al menos una serie de


neuronas en paralelo, agrupadas en lo que se denomina “capa”. Una
capa de neuronas está asociada a un vector de entradas como el ya
visto, p, que será multiplicado por una matriz de pesos W. Esta
matriz tiene tantas filas como neuronas tenga la capa, y tantas
columnas como elementos tenga el vector de entrada. Además, el bias
y la salida serán también vectores, con tantos elementos como
neuronas tenga la capa. Se suelen representar las capas de la
siguiente manera:

Fig. 3- capa de varias neuronas

Funciones de transferencia

La capa de neuronas es la base de toda Red Neuronal, que en


función de su complejidad estará formada por un cierto número de
capas con interconexiones entre ellas, es decir, tendrá una
arquitectura determinada.

Cada capa está definida fundamentalmente por la función de


transferencia f, que será la que especifique el funcionamiento de la

Carlos Entrena Moratiel 36


Universidad Pontificia de Comillas - PFC

capa, y por su número de neuronas. La existencia o no de bias


también es importante, pero no suele haber capas sin bias.

La función de transferencia define la salida de la red. Existen


cuatro funciones básicas:

- Función escalón: la función escalón es 0 si su entrada


neta (n) es negativa y 1 si es positiva. Es una función
útil para modelizar funciones lógicas con Redes
Neuronales. La gráfica de la función es la siguiente:

Fig. 4- función de transferencia escalón

- Función lineal: la función lineal devuelve la entrada


que ha recibido. También hay variantes que saturan a
partir de un valor, que no son simétricas respecto a
alguno de los dos ejes, etc.

Fig. 5- función de transferencia lineal

- Función sigmoidea (logsig): la función sigmoidea es


una de las más utilizadas, especialmente en RNs con
algoritmos de retropropagación, que se verán en el
siguiente punto. Esto se debe a que es infinitamente
derivable. Su ecuación y su gráfica son:

1

1   
Ec. 2- función de transferencia sigmoidea

Carlos Entrena Moratiel 37


Universidad Pontificia de Comillas - PFC

Fig. 6- función de transferencia sigmoidea

- Función tangente hiperbólica: es similar a la


sigmoidea, pero el rango de los valores de salida varía
desde -1 a 1. Esto puede ser útil para algunas
aplicaciones, y además es infinitamente derivable,
como la anterior. Su ecuación y su gráfica son las
siguientes:

1   

1   
Ec. 3- función tangente hiperbólica

Fig. 7- función tangente hiperbólica

Estas funciones determinan en gran medida el


funcionamiento de cada capa. Es importante que para que funcionen
adecuadamente los valores introducidos deberán estar normalizados,
para evitar que saturen, impidiendo cualquier diferencia en la salida.

Tipos de redes

Se pueden diferenciar tres tipos de RNs:

Carlos Entrena Moratiel 38


Universidad Pontificia de Comillas - PFC

- Redes lineales de una capa: una sola capa de


neuronas transforma las entradas en tantas salidas
como neuronas haya en la capa. Este tipo de red se
utiliza para asociaciones lineales y como filtros en
diversas aplicaciones.
- Redes lineales multicapa: varias capas se van
alimentando sucesivamente con sus respectivas
salidas. El número de neuronas de la última capa
determina el tamaño del vector de salidas. Las capas
entre la primera, llamada capa de entrada, y la última,
la de salida, se conocen como capas ocultas. La
complejidad en las tareas que se pueden realizar es
mucho mayor gracias a dichas capas ocultas, ya que
permiten un mayor procesamiento de la información.
- Redes recurrentes: son redes en las que la salida de
una capa se conecta con otra capa anterior, con o sin
decalaje temporal. Esto permite una mayor
complejidad de las señales transmitidas, y la RN será
capaz de obtener una información más extensa de las
relaciones entre las variables. Sin embargo, esta
complejidad añadida puede ser negativa, puesto que se
pueden crear falsas interconexiones.

Carlos Entrena Moratiel 39


Universidad Pontificia de Comillas - PFC

3. ENTRENAMIENTO Y USO DE
REDES NEURONALES

Las Redes Neuronales Artificiales son muy variadas, pero


todas tienen algo en común: el entrenamiento. Las RNs van
modificando sus características a medida que se las entrena; este
proceso se llama aprendizaje, y consiste en la modificación de los
pesos de la Red como respuesta a una información de entrada (ETSI
Minas, 2004). Existen distintos criterios para entrenar a una red, y se
conocen como su regla de aprendizaje. A continuación se verán varias
reglas distintas.

En primer lugar, el aprendizaje puede ser supervisado o no


supervisado. El aprendizaje no supervisado se caracteriza porque no
hay un “profesor” externo, que le indique a la red si su salida es
adecuada o no. Los pesos de la red van disminuyendo o aumentando
a medida que le llegan datos de entrada. Esto hace que puedan auto-
organizarse, generando su propia interpretación de las entradas en
función de su frecuencia. Existen dos tipos de aprendizaje no
supervisado, el aprendizaje competitivo y la interpretación de salidas.

El aprendizaje supervisado es el más utilizado. Se caracteriza


porque existe una agente externo que indica a la red qué ejemplos
debe imitar, o si su respuesta es correcta. Se pueden diferenciar tres
tipos de aprendizaje supervisado:

- El aprendizaje por corrección de error consiste en


modificar los pesos de la red en función del error
generado en la misma, que es la diferencia entre las
salidas generadas y los valores objetivos asociados a
las entradas que han generado dichas salidas.
- El aprendizaje por refuerzo se emplea cuando no
existe un conjunto de patrones de entrenamiento como
el necesario para el aprendizaje anterior. Lo que se
hace en este caso es introducir entradas a la Red para

Carlos Entrena Moratiel 40


Universidad Pontificia de Comillas - PFC

que genere salidas, y el supervisor indica mediante


una señal de refuerzo si dicha salida es correcta o
incorrecta. Esta señal modifica los pesos de la red, que
se va entrenando para adecuarse a las necesidades del
supervisor. Es un aprendizaje más lento.
- El aprendizaje estocástico se basa en realizar ajustes
aleatorios en los pesos y comprobar mediante un
cálculo estadístico su efecto general sobre la eficacia de
la RN.

Existen dos formas de llevar a cabo un entrenamiento


supervisado: una forma es entrenar la red y después usarla, sin
modificar nunca más sus pesos; es una forma estática de uso, en el
que la RN ya ha adquirido sus características finales. Otra forma es ir
utilizando los nuevos datos de los que se dispone para mejorar aún
más el rendimiento de la red. Este procedimiento dinámico es el que
se pretende usar en el modelo, pues irán apareciendo casos que la
red aprenderá, aumentando su información histórica.

En este proyecto se utilizará fundamentalmente el


aprendizaje por corrección de error. A continuación se presenta el
algoritmo general de retropropagación (“backpropagation” en inglés),
fundamental en el entrenamiento de la mayoría de RNs. También se
introducen dos algoritmos muy usados en el modelo de predicción, el
Levenberg-Marquardt y el de Regularización Bayesiana, LM y BR
respectivamente. Por último, se introducir la técnica de validación
cruzada, de gran importancia para evitar el sobreentrenamiento de la
red.

Aprendizaje por corrección de error: retropropagación

El aprendizaje por corrección de error se basa, como se ha


visto, en presentar a la red pares de entradas-salidas. La RN procesa
las entradas obteniendo una salida que se compara con la salida
objetivo:
 

Ec. 4- error en una Red Neuronal

Carlos Entrena Moratiel 41


Universidad Pontificia de Comillas - PFC

Donde e es el error, a la salida de la RN y t el valor objetivo.


El siguiente paso es retropropagar el error por la red, modificando los
pesos de cada una de las neuronas. Esto se resume en un problema
matemático de minimización de error total de la red. Así, para cada
pasada de los errores hacia atrás se aplica un algoritmo que puede
ser el método de máximo descenso, el método del gradiente
conjugado, etc.

Estos métodos buscan un mínimo en la superficie de error y


modifican los pesos de la red de manera acorde, minimizando así la
suma de los cuadrados de los errores. Existen numerosos parámetros
para mejorar la eficiencia de estos métodos y evitar que caigan en
mínimos locales, esto es, que no converja hacia un mínimo global.
Uno de estos parámetros es la tasa de aprendizaje, λ, que determina
el equilibrio entre rapidez de búsqueda de mínimo y sensibilidad.
Otro parámetro interesante es el momento, µ, que hace que la
dirección de búsqueda del mínimo se insensibilice frente a cambios
bruscos de gradiente. Otra mejora implica que dichos parámetros (los
más usados) sean variables, aumentando aún más la rapidez y
precisión del algoritmo. Existen muchos parámetros y muchas
formas de mejorar el rendimiento de estos métodos iterativos.

Una vez que se presentan todos los pares entrada-salida a la


red y se han modificado los pesos de la misma, se dice que se ha
realizado una época (“epoch” en inglés). Para entrenar una RN se
suelen realizar un número variable de épocas, en función de la
simplicidad de la RN y del número de datos de entrenamiento
disponibles.

Los algoritmos Levenberg-Marquardt y de Regularización


Bayesiana

Estos dos algoritmos han sido los empleados para definir el


modelo de previsión.

El algoritmo LM es el estándar para minimizar el error medio


cuadrático, y tiene buenas propiedades de convergencia y robustez.

Carlos Entrena Moratiel 42


Universidad Pontificia de Comillas - PFC

Su algoritmo de optimización es no-lineal, y usa el gradiente y la


aproximación del hessiano mediante el método de Gauss-Newton.

El algoritmo BR es una mejora del LM, y se basa en la


aplicación de algunas técnicas de aprendizaje no supervisado al
algoritmo de retropropagación. Fundamentalmente hace decrecer el
valor de los pesos que no se utilizan de manera extensiva y aumenta
los otros. Esto tiene dos ventajas: disminuye el número de pesos
efectivos en la RN, lo cual permite estimar fácilmente cuántas
neuronas son necesarias para realizar la tarea, y mejora las
capacidades de generalización de la RN (Demuth, Beale, & Hagan,
2008).

Como se verá en el Capítulo IV, la Regularización Bayesiana


ha sido utilizada con una mejora general de las prestaciones del
modelo de previsión.

Sobreentrenamiento y validación cruzada

Uno de los problemas que puede surgir al entrenar una Red


Neuronal es el sobreentrenamiento. Éste se da cuando la red aprende
con demasiada fuerza el conjunto de entrenamiento, incorporando el
ruido que éste conjunto suele incluir a sus pesos. El resultado de
esto es una red que predice muy bien los casos que ya se le han
presentado, pero que no es capaz de procesar entradas desconocidas
en función de las variables que sean más significativas. Así, la red no
generaliza bien y, por tanto, no ha aprendido correctamente de los
patrones de entrenamiento.

Para evitar el sobreentrenamiento existen dos medidas


importantes. La primera es no utilizar una red demasiado grande, si
no que se debe ajustar el tamaño de la red a la función o tarea que
deba llevar a cabo. En segundo lugar, es fundamental incorporar
técnicas de validación cruzada en el entrenamiento.

La validación cruzada consiste en separar el conjunto de


entradas-salidas en dos grupos: el primero, de entrenamiento, se
utiliza para lo ya descrito: modificar los pesos de la red en función del

Carlos Entrena Moratiel 43


Universidad Pontificia de Comillas - PFC

error generado. Pero el segundo grupo sirve para comprobar la


evolución de la generalización de la red. Esto se consigue
introduciendo las entradas del conjunto de validación en la red y
calculando los errores, pero sin retropropagarlos. La red no “aprende”
el conjunto de validación, y por tanto se puede ver si a partir de los
datos de entrenamiento es capaz de generalizar y predecir de manera
correcta los datos. La validación cruzada supone parar el
entrenamiento cuando el error de validación comienza a aumentar, lo
cual es una señal casi segura de que está disminuyendo la capacidad
de generalización de la red.

En la Fig. 8 se ve un ejemplo de gráfica de error obtenida con


Matlab®. En azul se ve cómo el error de entrenamiento disminuye
con cada época, pues la red ajusta cada vez mejor las salidas en
función de las entradas. En verde se ve cómo el error de validación
empieza a crecer al cabo del tiempo. Como valores finales para los
pesos de la red se escogerán los que minimicen el error de validación.

Fig. 8- errores de entrenamiento y de validación en función de la


época

Carlos Entrena Moratiel 44


Universidad Pontificia de Comillas - PFC

La validación cruzada es un elemento fundamental para


conseguir redes que ignoren el ruido de los patrones y que sean, por
tanto, funcionales.

Carlos Entrena Moratiel 45


Universidad Pontificia de Comillas - PFC

4. APLICACIONES DE REDES
NEURONALES

Las RNs son instrumentos muy útiles por su adaptabilidad y


capacidad de aprendizaje. Se han desarrollado numerosas
aplicaciones que, gracias al uso de Redes Neuronales, han mejorado
su eficacia. Entre sus muchísimas aplicaciones se pueden destacar:

- Biología: modelización de sistemas neurológicos


- Producción: sistemas de control como visión artificial,
sensores de presión, temperatura y gas.
Automatización. Control de calidad. Previsión de la
demanda.
- Finanzas: previsión de cotizaciones bursátiles.
Valoración de riesgos.
- Medicina: monitorización en cirugía. Generación
automática de diagnósticos a partir de síntomas y
análisis.
- Climatología: predicción del clima, con numerosas
aplicaciones en modelos climáticos.
- Reconocimiento de voz y patrones sonoros con enorme
precisión

El campo de aplicación es muy elevado, y es una tecnología


en constante mejora. Es de destacar además su facilidad de
implantación con las herramientas informáticas ya existentes; prueba
de ello es la existencia de aplicaciones como la que ha sido utilizada
para la realización de este proyecto, aplicaciones no demasiado
complejas y con buenos resultados para la creación de modelos de
manera rápida y funcional.

Carlos Entrena Moratiel 46


Universidad Pontificia de Comillas - PFC

IV. CREACIÓN Y
OPTIMIZACIÓN DEL MODELO
DE PREDICCIÓN

1. INTRODUCCIÓN

Como se ha visto durante el Capítulo II, lo que se busca es


establecer una previsión de la energía fotovoltaica producida de
manera horaria con un horizonte temporal de un día para unos
parques piloto. Este objetivo inicial debería permitir, una vez
demostrada su viabilidad, pasar a objetivos más ambiciosos y a
modelos de predicción más complejos y generalizables a todos los
parques conectados a la red.

A grandes rasgos, se busca un modelo de Red Neuronal capaz


de, utilizando unas determinadas variables de entrada climáticas,
realizar una predicción fiable y precisa de la producción de energía
solar fotovoltaica. En el caso particular del presente proyecto la
energía se produce en dos parques solares situados en Toledo, uno de
20kW de potencia instalada y el otro de 1MW. Huelga decir que no
son parques excesivamente modernos, en relación a la explosión de
instalaciones que ha tenido lugar en los últimos tres años, y es
precisamente por esto que se han utilizado: solo en estos parques se
disponía de suficientes históricos de producción horaria. En
cualquier caso, se ha pretendido que el estudio para el modelo de

Carlos Entrena Moratiel 47


Universidad Pontificia de Comillas - PFC

previsión sea fácilmente repetible en el caso de incorporar otros


parques solares. Lo único necesario en este caso sería una cantidad
suficiente de datos históricos.

Al seleccionar el modelo se ha optado por seguir la máxima


“primero lo más sencillo”. Esto ha permitido optimizar cada una de
las partes del sistema de predicción basándose en la anterior, esto es,
se han podido realizar los estudios más complejos y costosos en
tiempo (como la selección de variables) en un momento inicial y por
tanto acelerando la selección del modelo final.

Así, por ejemplo, se ha comenzado por redes de previsión de


producción a nivel diario para permitir una mayor comprensión de
las redes neuronales, de las variables de entrada, de los sistemas de
iteración y de la herramienta en general. Posteriormente se ha pasado
a analizar modelos de previsión horaria, optimizándose éstos a su
vez. Se ha seguido así un proceso recurrente en algunos puntos que
se obviará en la presentación, por motivos de concisión. Se
presentarán así los distintos elementos del estudio de manera
independiente.

Los programas y estudios se han realizado siempre con la


aplicación Matlab®, y las funciones de el “Toolbox” NNTool® han sido
de gran utilidad, evitando el trabajo de programar algoritmos
matemáticos de gran complejidad pero también proporcionando
herramientas sencillas que han permitido una rápida comprensión de
las Redes Neuronales Artificiales.

Para presentar el estudio, se ha dividido en seis partes


diferenciadas:

1. Presentación de los tipos de error que se utilizarán como


indicadores de la precisión del modelo.
2. Distintos tipos de arquitectura general de la Red Neuronal
utilizados en el modelo, arquitectura seleccionada y
justificación.
3. Estudio de las variables de entrada entre las cuales se deben
seleccionar las necesarias para un modelo óptimo, en el caso

Carlos Entrena Moratiel 48


Universidad Pontificia de Comillas - PFC

de los dos parques planteado inicialmente. Conjunto


seleccionado y justificación.
4. Análisis y optimización de los parámetros de la red y de los
conjuntos de entrada y salida: selección de conjuntos de
validación y test, normalización de entradas y salidas,
número de neuronas, tipo de entrenamiento, funciones de
transferencia y número de salidas representativas (en el
modelo horario).
5. Comparación con el sistema de predicción por perfiles
proporcionado por el Ministerio de Industria, Turismo y
Comercio en el Real Decreto 661/2007, de 25 de mayo, por
el que se regula la producción de energía eléctrica en
régimen especial.

Una vez determinado el modelo, se pasará a establecer las


conclusiones pertinentes y se analizarán sus resultados. Se dará una
serie de indicaciones que podrían ser interesantes para futuros
estudios más detallados de este tipo de sistemas de predicción que,
como se verá, parece tener una gran posibilidad de aplicación en la
industria, tanto para grandes empresas eléctricas como para PYMES
e instalaciones individuales.

Carlos Entrena Moratiel 49


Universidad Pontificia de Comillas - PFC

2. TIPOS DE ERROR

Se presentan en este apartado los diferentes tipos de error


que se han utilizado a lo largo del estudio para caracterizar la
efectividad de las redes.

Estos errores se calculan utilizando la producción real de los


parques solares analizados, en KWh, y las predicciones realizadas por
la red. Cuando la previsión es de carácter diario, la producción que se
introduce en la red como objetivo durante el entrenamiento y con la
que se calculan los errores es la suma de las producciones horarias
de todo el día.

Primero se analizarán el MSE, el Error Real y el Error en


Energía, utilizados para las redes de predicción diaria,
posteriormente el Error Real Horario y el Error en Energía Horario,
exclusivos de las redes de predicción horaria, y finalmente el Error de
comparación Diaria-Horaria, para comparar la efectividad de las
previsiones horarias y las diarias.

MSE

Es el error utilizado por los algoritmos informáticos de RNs


para converger. Su ecuación es la siguiente:
"
1
! 

 Y  Y

#$

Ec. 5- MSE

Donde:

%# : valor normalizado de la energía producida en un día.

%&# : valor predicho por la RN para un día.

N: número de días.

Carlos Entrena Moratiel 50


Universidad Pontificia de Comillas - PFC

Sin embargo, no es una medida muy práctica a la hora de


comprender cuál es el error realmente cometido, por no estar
normalizada (dividida por un valor del mismo orden que el
numerador), y por estar elevada al cuadrado.

En el caso horario, el ordenador realiza la medida del MSE


para cada una de las salidas, es decir, para cada hora de producción.

Error Real

Es el que más se ha utilizado para caracterizar las redes


neuronales. Permite una buena visión del error que se está
cometiendo, y es más penalizador que el Error en Energía. Su
ecuación es la siguiente:
"
1 |%#  %&# |
' 
 %#
#$

Ec. 6- ER

Con la misma notación que anteriormente.

Este error permite una mejor visión puesto que está


normalizado. Su desventaja es que los días de poca producción,
normalmente por la nubosidad, este error se dispara, debido a la
disminución del denominador, siendo además estos días los más
difíciles de predecir con las variables climáticas disponibles.

Error en Energía

El Error en Energía es similar al Error Real, pero en vez de


dividir por la energía producida realmente, se divide por el valor de
normalización de la misma. Este valor, como se verá posteriormente
en el apartado 4 de este capítulo, es el máximo valor producido en
todo el periodo observado.

Se pueden observar dos supuestos: en el primero, si se han


multiplicado todas las salidas por el valor de normalización (se tienen
valores de energía), se divide efectivamente por el valor de

Carlos Entrena Moratiel 51


Universidad Pontificia de Comillas - PFC

normalización; en el segundo, si se sigue con las verdaderas salidas


de la red, es decir, siguen normalizadas, se dividirá por la unidad.

Las ecuaciones son las siguientes, de carácter equivalente:

"
1 !# |
|)#  )
 
 *
#$

Ec. 7- EE con desnormalización

"
1 |%#  %&# |
 
 1
#$

Ec. 8- EE sin desnormalización

Además de la notación anterior, tenemos:

*: valor de normalización de la producción diaria (máximo


diario detectado).

)# * · %#

!# * · %&#
)

Este tipo de error es más positivo que el anterior, al dividir


siempre por el máximo detectado en la serie de producciones. Sin
embargo, puede resultar útil al dar una medida del error que se
realiza en proporción a la potencia instalada efectiva. Este tipo de
error puede ser interesante a la hora de crear modelos de previsión
más grandes, con mayor número de parques.

Error Real, Error en Energía horarios

Son análogos a los descritos para la producción diaria, pero


para cada una de las horas de producción:
"
1 |%,#  %&,# |
'+, 
 %,#
#$

Ec. 9- ERHx con desnormalización

Carlos Entrena Moratiel 52


Universidad Pontificia de Comillas - PFC

"
1 |),#  )!,# |
+, 
 *,
#$

Ec. 10- ERHx sin desnormalización

El subíndice “x” indica que es un valor horario, es decir, para


cada una de las 15 horas con producción efectiva. Así, Cx es el valor
de normalización para cada una de las horas, el máximo de
producción en kWh detectado en esa franja horaria.

El problema del Error Real en esta caso es que en las horas


más tempranas y más tardías la producción es prácticamente nula, y
según la estación y las horas de luz, en ocasiones totalmente nula. La
RN tiene dificultades a la hora de prever valores nulos, y es por esto
que en muchas ocasiones el error se dispara dando infinito. Por eso
se han analizado soluciones para caracterizar mejor este error; la
más sencilla es usar el Error en Energía Horario, con las mismas
consecuencias que en el caso diario. Esto permite analizar en qué
horas se están produciendo mayores errores.

Sin embargo, más práctico resulta utilizar los tipos de error


analizados en el punto siguiente.

Media Error Real Horario, Media de Error en Energía


Horario

Son análogos al ER y al EE diario, pero para crear el valor de


producción diaria se suman los valores de cada hora. Se pierde así la
información del error producido por horas, pero se evita el fallo ya
analizado. Las ecuaciones son:
"
1 ∑. &
,$ |%,#  %,# |
'+ 
 ∑,$ %,#
.
#$

Ec. 11- MERH

"
1 ∑. !
,$ |),#  ),# |
+ 
 ∑. ,$ *,
#$

Carlos Entrena Moratiel 53


Universidad Pontificia de Comillas - PFC

Ec. 12- MEEH

Siendo H el número de horas de producción que, como se


verá, es también un parámetro del modelo.

El MERH es el error más utilizado a la hora de caracterizar


las redes de previsión horaria.

Errores de comparación Diaria-Horaria

Como se verá en el siguiente punto, en los distintos modelos


estudiados suele haber una previsión diaria y otra horaria, ya sean
independientes (dos RNs distintas) o dependientes (una sola RN
produce los dos resultados). Puede ser interesante establecer una
comparación entre las dos previsiones, para ver cuánto divergen. La
ecuación de dicho error es la siguiente:
"
1 |%&#  ∑. &
,$ %,# |
/+ 
 %&#
#$

Ec. 13- Error Diario-Horario

Esto permite ver, si se le añaden los errores previstos


anteriormente, cuál es la efectividad de la red diaria respecto a la
horaria, o cuál es la pérdida de efectividad del sistema de predicción
al incorporar muchas salidas a la red en vez de una sola.

Conclusión

Con estos errores es con los que se ha ido avanzando para


crear modelos más precisos.

Para la creación de modelos más robustos se ha optado por


analizar la desviación típica de los distintos errores. Tanto para las
iteraciones en las que se prueban muchas RNs, como de los mismos
errores individuales (diarios u horarios) de los que los valores
presentados anteriormente constituyen la media. Esto permite ver
cuál es la variabilidad de los valores de error, tanto para una RN a lo
largo de los distintos días, como para una iteración de RNs, pudiendo
así caracterizar la robustez de una misma familia.

Carlos Entrena Moratiel 54


Universidad Pontificia de Comillas - PFC

En el apartado 7 “Resultados y Conclusiones” se verá cuál es


el orden de estos errores alcanzado tras el proceso de optimización.

Carlos Entrena Moratiel 55


Universidad Pontificia de Comillas - PFC

3. ARQUITECTURAS DE REDES
NEURONALES

La arquitectura de la Red Neuronal no es una decisión trivial.


En función de la que se elija, la RN tendrá unas características
matemáticas que determinarán la funcionalidad del modelo. Entre los
muchísimos tipos de RN existentes, se ha optado por centrar el
estudio en los modelos basados en el perceptrón multicapa, es decir,
modelos lineales con algoritmos de retropropagación
(backpropagation), anteriormente descritos en el Capítulo II. Este tipo
de red es muy utilizado, de ahí que existan numerosas funciones y
algoritmos que permiten una gran variedad de opciones de
personalización.

Se han probado cuatro arquitecturas principales de RN, como


ya se ha dicho, basadas en el perceptrón multicapa. Además de las
que se presentan aquí, se probaron otras variantes que no se
mencionarán por sus peores resultados en comparación con éstas. La
red principal, por su utilización auxiliar en todas las demás, es la Red
Neuronal Diaria. Las otras tres arquitecturas son: una red diaria más
una horaria, una red diaria más una horaria formada por subredes
que se realimentan, y finalmente una red completa con
realimentación.

Un detalle importante es que no se han incorporado decalajes


temporales, puesto que se ha tomado como hipótesis que la
información temporal importante en los procesos climáticos que
afectan al modelo ya están incluidos en las previsiones recibidas. Así
se obtienen modelos más simples, más rápidos de entrenar y
actualizar, y con una mayor independencia y capacidad de
generalización.

Red Neuronal Diaria

Carlos Entrena Moratiel 56


Universidad Pontificia de Comillas - PFC

La Red Neuronal Diaria (de ahora en adelante RND) es la que


se ha diseñado para hacer la previsión de energía diaria. La
estructura de esta red es lineal, es decir, el vector de entradas está
conectado con una sola capa, la primera, de número de neuronas
variables. Además, se ha detectado que una sola capa oculta es la
mejor opción para minimizar el error. El número de neuronas óptimo
es de entre 8 y 10 neuronas en la capa de entrada y de 1 neurona en
la capa oculta. Esto se analiza con más detalle en el punto 5. Al tener
un solo valor de salida, la última capa tendrá solo una neurona.

Se puede observar la estructura en la siguiente figura:

Fig. 9- Red lineal multicapa

RND + Red Neuronal Horaria

En esta arquitectura de modelo se ha optado por tener dos


RNs: una RND optimizada según el modelo anterior y otra RN del
mismo tipo pero que proporcionará la previsión horaria. Esta RN,
también lineal y con retropropagación, deberá tener más neuronas,
dada la mayor complejidad al hacer la previsión cada hora. En esta
segunda red se han probado varias opciones a la hora de las entradas
que se le introducen: solo la salida de la RND (la previsión diaria),
dicha salida y todos las variables optimizadas (según el punto 4),
dicha salida y solo algunas de las variables más representativas, y
finalmente las variables optimizadas sin introducirle la previsión

Carlos Entrena Moratiel 57


Universidad Pontificia de Comillas - PFC

diaria. El mejor
mejor resultado es el de introducirle todo: tanto la salida de
la RND, como las variables que a su vez se introducen a dicha Red.

La RND se crea y entrena en un primer momento. Para


asegurar la convergencia de dicha red se ha optado por incorporar un
algoritmo
mo de iteración de unas 5 a 10 repeticiones, lo cual no resulta
muy costoso en tiempo y asegura un mejor rendimiento de la
segunda red.

La mejor estructura de la Red Neuronal Horaria detectada es


también de tres capas, en la de entrada unas 25 neuronas, en la
oculta de 13 a 15, y en la de salida otras 13 ó 15, dependiendo de las
horas que se contabilicen como de producción efectiva.

Fig. 10-
10 Red Neuronal horaria

RND + Red Neuronal Serie-Paralelo


Serie

En este caso se ha optado también porr una estructura de dos


redes, siendo la primera una RND, y la segunda una Red más
compleja. Esta segunda red es en realidad un conjunto de 13 ó 15
(dependiendo de las horas de producción efectiva) pequeñas redes de
tres capas, 4 neuronas en la primera, 2 en la segunda y una en la
última, que se van realimentando. Es decir, la salida de la primera
también es una entrada de la segunda, cuya salida a su vez se
introduce en la tercera subred, etc. Además en cada subred se han
probado diferentes configuraciones de entradas, como en el caso
anterior. La mejor solución sigue siendo meter toda información en
todas las subredes, que después seleccionarán los datos útiles para
sus salidas respectivas. De igual modo, se seguirá realizando una
iteración inicial para asegurar
asegurar la convergencia de la primera red.

Carlos Entrena Moratiel 58


Universidad Pontificia de Comillas - PFC

Esta arquitectura tiene una serie de características


interesantes,, como la estructura serie-paralelo
serie paralelo que permite emular en
cierta medida el carácter temporal de las producciones diarias a lo
largo del día. Los resultados
resultados son parecidos a los obtenidos con el
modelo anterior, lo cual no compensa su mayor complejidad y
lentitud de entrenamiento.

Es importante destacar también que sin utilizar el


entrenamiento de Regularización
Re Bayesiana, analizado en el Capítulo
III, no tiene mucho sentido usar esta red, por la gran cantidad de
conexiones inútiles que se crean aleatoriamente al principio del
proceso de entrenamiento y que no disminuyen lo suficientemente
rápido después.

Fig. 11-Ejemplo
11 de Red Neuronal serie-paralelo

Red Diaria--Horaria con Realimentación

El último modelo propuesto es de una sola red, dividida en


dos partes: la primera es como una RND; la segunda es como la Red
Neuronal Horaria del segundo modelo. La diferencia con éste es que
la conexión entre la primera capa de la segunda subred y la salida de
la primera es directa. Al ser esta conexión directa se obtienen
ventajas a la hora del entrenamiento, pues el conjunto funcionará de
manera más coherente, aproximando mejor los valores de producción
diaria y horaria. De nuevo, a la segunda subred se le introducen

Carlos Entrena Moratiel 59


Universidad Pontificia de Comillas - PFC

todas las variables seleccionadas tras el proceso de optimización. Es


así como se obtienen los mejores resultados.

Otra ventaja a la hora de configurar


configurar este tipo de red es la
mayorr tasa de convergencia de la primera subred, esto es, la red de
previsión diaria. Esto se debe a que los valores de error se
retropropagan también por la realimentación, dando así mayor
inercia y estabilidad al sistema en caso de fallo grave.
grave De aquí que la
enorme mayoría de redes de este tipo converja a soluciones posibles y
que no existan mínimos locales en los que pueda caer el sistema. Así,
no se hace necesaria una iteración al configurar una red de este tipo.

La desventaja es que su entrenamiento es lento,


lento, sin llegar a
los niveles del tercer modelo. Esto hace que no sea una arquitectura
práctica para optimizar las variables de entrada, por tanto se sigue
recomendando la adopción de una red más simple, como la RND,
para dicho proceso de optimización. Una vez detectada la
configuración global óptima se puede incorporar la segunda subred
para crear el modelo horario global.

Fig. 12-
12 Red diaria-horaria con realimentación

Conclusión

La arquitectura de RND, como hemos visto, tiene una


especial utilidad a la hora de realizar el estudio. En cuanto al modelo
más efectivo para establecer una previsión, esto es, como futura
herramienta de trabajo, el cuarto modelo, de Red Diaria-Horaria
Diaria con
Realimentación es la que mejor resultados ha proporcionado.
proporcionado. Su
error general es menor, ajusta mejor las curvas horarias y tiene una
mayor tasa de convergencia, es decir, es un modelo más robusto. Es

Carlos Entrena Moratiel 60


Universidad Pontificia de Comillas - PFC

por esto que es el que se utiliza en el Capítulo V: “Introducción a la


creación de una herramienta de previsión”.

Carlos Entrena Moratiel 61


Universidad Pontificia de Comillas - PFC

4. SELECCIÓN DE VARIABLES

La selección de las variables de entrada entre las múltiples


posibilidades es siempre un factor clave en el diseño de modelos de
RNs. Las variables climáticas previstas para el modelo son las
siguientes: radiación solar (en 013
), temperatura máxima
2
prevista a lo largo del día (en grados centígrados), y nubosidad (según
un sistema de medición particular). Además, cada una de estas
variables se proporciona en cinco estaciones de medida situadas en
los siguientes lugares de España: A Coruña, Madrid, Vigo, Ciudad
Real y León. La previsión que se pretende establecer es a horizonte
D+1, es decir, los datos climáticos que se utilizan son previsiones
para el día siguiente. Esto añade un error intrínseco a la previsión de
energía determinado por la precisión del modelo climático utilizado
para las previsiones.

A continuación se analizará cada una de las variables, con


información sobre los rendimientos de cada una de ellas, después se
verá la influencia de las distintas regiones sobre la previsión
realizada, y finalmente se presentarán los resultados y conclusiones
sobre el conjunto de variables adoptado para el caso de los dos
parques solares en la provincia de Toledo.

Radiación solar

La variable de radiación solar es la de mayor influencia en la


creación del modelo. Se dispone de tres previsiones al día: para ese
mismo día (D+0), para el día siguiente (D+1), que es el que
corresponde al horizonte de previsión y por tanto es el que se
utilizará, y para el posterior (D+2). De estas se ha utilizado la
previsión a D+1 por ser la que se utilizaría en el caso de una
herramienta como la planteada, es decir, para ser empleada en la
sesión diaria del Mercado Ibérico de Electricidad. En un modelo más
complejo se podría incluir la previsión con horizonte D+2, tanto para
efectuar una previsión de horizonte de dos días, como para añadir

Carlos Entrena Moratiel 62


Universidad Pontificia de Comillas - PFC

dos previsiones de radiación para un mismo día. Sin embargo esto ha


parecido poco práctico al principio, notablemente por el mayor
volumen de datos, prohibitivo en tiempo en este primer estudio.

Además de en estos tres horizontes diarios, los datos se


proporcionan con tres horizontes horarios: a las 6h, a las 12h y a las
18h, en todos los casos UTM. Esto ha planteado un problema
fundamental a la hora de extraer información de las previsiones de
radiación: las 6h, que corresponden a las 7h en invierno y a las 8h en
verano, es una hora demasiado temprana, por lo que realmente no da
mucha información sobre cómo evolucionará la radiación solar a lo
largo del día. De hecho, durante gran parte del invierno, esta lectura
es 0. Además, el valor de las 18h (las 19h en invierno y las 20h en
verano) adolece del mismo problema, y su lectura también es 0 gran
parte del año. Este problema ha sido limitador a la hora de establecer
buenos resultados, notablemente en las primeras y últimas horas del
día. Una mejora sustancial del modelo se produciría muy
probablemente, por ejemplo, al cambiar esas horas de predicción por
las 8h UTM y las 16h UTM.

Por último, en cada una de las horas de predicción, se


proporcionan tres valores: el percentil 10, el percentil 50 y el percentil
90 de la radiación solar. Estos tres valores (en adelante P10, P50 y
P90) representan:

- El P10, el valor que deja por debajo el 10% de casos de


radiación posibles.
- El P50, el valor que deja por debajo la mitad de casos de
radiación posibles.
- El P90, el valor que deja por debajo el 90% de casos de
radiación posibles.

De entre estos valores, un análisis estadístico previo


demostró que el valor P90 no contenía información utilizable, al
menos de manera directa, por la red. La razón de esto es que el valor
casi siempre es el mismo, excepto en los casos ya mencionados de la
mañana y la tarde, en los que puede llegar a ser nulo. Por esto se
descartó su uso en un momento inicial de modelización. Sin
embargo, podría ser interesante introducir su estudio una vez se
Carlos Entrena Moratiel 63
Universidad Pontificia de Comillas - PFC

acotasen de manera más determinante todos los demás parámetros


del modelo.

De entre los otros dos, P50 y P10, se ha tomado el P50 como


variable principal del modelo. Una vez se ha decidido que una región
va a entrar en el conjunto de variables proporcionadas, el P50 es la
primera variable que se incluye. El P10 se incorpora como opción.
Los resultados, como se verá en la tabla de “conclusiones”,
determinan que el uso del P10 penaliza la eficacia de la red. Esto
podría deberse a que incluya información en ocasiones contradictoria
con la de P50, más importante a la hora de establecer los pesos en la
red, provocando así la aparición de mínimos locales y dificultando la
convergencia de la red. También podría deberse, sencillamente, a que
la RN le afecte como ruido, por la dificultad de prever un valor que
normalmente es muy pequeño. Sin embargo no se puede concluir que
en un estadio más avanzado del modelo, con otras horas de previsión
de la radiación solar, no vaya a ser útil este valor.

Finalmente, pues, se ha optado por incluir solo la variable


P50 como base para el sistema de predicción. Por tanto, la inclusión
en el conjunto de variables de una región incluirá forzosamente el
P50, es decir, 3 variables.

En la figura siguiente se presenta el formato en el que se


envían las previsiones de radiación:

D+0
8:00 12:00 18:00
P50 P10 P90 P50 P10 P90 P50 P10 P90
A CORUNA 111 47 174 574 204 954 119 70 192
MADRID/BARAJAS 66 29 75 946 835 1057 226 195 261
VIGO/PEINADOR 47 6 160 570 177 895 198 24 225
CIUDAD REAL 87 21 130 988 947 1120 177 30 206
LEON/V. DEL CAMINO 153 67 201 868 345 1095 156 45 218

Carlos Entrena Moratiel 64


Universidad Pontificia de Comillas - PFC

D+1
8:00 12:00 18:00
P50 P10 P90 P50 P10 P90 P50 P10 P90
A CORUNA 63 23 122 690 340 962 112 39 215
MADRID/BARAJAS 56 24 74 945 845 1056 217 193 247
VIGO/PEINADOR 129 13 157 844 176 982 199 54 233
CIUDAD REAL 76 21 131 986 945 1118 164 30 195
LEON/V. DEL CAMINO 162 73 184 985 492 1024 147 69 214

D+2
8:00 12:00 18:00
P50 P10 P90 P50 P10 P90 P50 P10 P90
A CORUNA 62 23 119 737 261 999 171 81 210
MADRID/BARAJAS 55 24 73 933 843 1064 222 191 257
VIGO/PEINADOR 16 6 154 803 98 1127 192 54 219
CIUDAD REAL 75 20 129 984 852 1116 156 27 193
LEON/V. DEL CAMINO 153 80 195 973 442 1012 148 63 215
Fig. 13- ejemplos de tablas de radiación

Temperatura Máxima

Se dispone de la previsión de las temperaturas máxima y


mínima para el día siguiente. Inicialmente se ha incluido la variable
de temperatura máxima en el estudio por su interés climático, ya que
es una de las variables atmosféricas indispensables.

Al realizar el estudio se ha detectado una influencia positiva


de esta variable sobre los resultados, en especial al ayudar al modelo
a converger, de ahí que en el modelo final se incluya. Sería
interesante realizar en el futuro un estudio sobre la influencia de la
Temperatura Mínima en el modelo, es decir, si aporta información
nueva.

Carlos Entrena Moratiel 65


Universidad Pontificia de Comillas - PFC

A continuación se muestra un ejemplo de presentación de los


datos de temperatura mínima y máxima, en grados centígrados:

Madrid C. Real A Coruña Vigo León


Tmax Tmi Tmax Tmi Tmax Tmi Tmax Tmi Tmax Tmi
01/07/2007 D F 31 17 31 19 22 16 18 13 23 10
02/07/2007 L L 31 14 31 17 21 16 19 13 23 10
03/07/2007 M L 32 14 32 17 22 17 19 15 23 12
04/07/2007 X L 32 16 34 20 21 15 22 12 23 9
05/07/2007 J L 33 15 35 19 22 15 25 13 27 8
06/07/2007 V L 35 15 36 19 23 17 27 15 29 13
07/07/2007 S L 36 18 37 20 23 17 26 15 30 14
08/07/2007 D F 36 19 36 21 21 16 23 15 25 12
09/07/2007 L L 30 15 33 18 21 14 21 11 21 8
10/07/2007 M L 29 12 32 17 22 16 23 12 23 7
Tabla 4- ejemplo de tabla de temperaturas

Nubosidad

La nubosidad es una variable cuya medición implica cierta


subjetividad por parte del medidor. El cielo cercano a la estación de
medición se divide en octantes, y a cada hora de medición (de nuevo,
las 6h, las 12h y las 18h) el responsable estima cuántos octantes
están cubiertos.

La variable de nubosidad ha tenido un efecto muy positivo en


el error del modelo, y por en el conjunto de variables final se incluye.
A continuación se muestra una tabla con el formato en el que son
enviadas las previsiones de nubosidad:

Madrid C. Real A Coruña Vigo León


h6 h12 h18 h6 h12 h18 h6 h12 h18 h6 h12 h18 h6 h12 h18
01/07/2007 D F 4 4 4 3 3 3 5 5 5 6 6 6 4 4 4
02/07/2007 L L 3 3 3 3 2 3 6 6 6 5 5 5 3 3 3
03/07/2007 M L 3 3 3 2 2 2 7 7 6 6 6 6 4 4 4
04/07/2007 X L 2 2 2 3 2 2 5 5 4 3 3 3 2 2 2
05/07/2007 J L 2 2 2 2 2 2 3 3 3 2 2 2 2 2 2
06/07/2007 V L 2 2 2 2 2 2 3 3 4 2 2 2 2 2 2
07/07/2007 S L 2 2 2 3 3 3 5 5 5 3 3 3 3 3 3
08/07/2007 D F 3 3 3 2 2 2 5 5 5 4 4 4 4 4 3

Carlos Entrena Moratiel 66


Universidad Pontificia de Comillas - PFC

09/07/2007 L L 2 2 2 2 2 2 5 5 5 4 4 4 3 3 3
10/07/2007 M L 2 2 2 2 2 2 5 5 4 3 2 2 3 2 2
11/07/2007 X L 2 2 2 2 2 2 5 5 4 2 2 2 2 2 2
Tabla 5- ejemplos de nubosidades

Regiones

Como se ha visto, las variables se miden en cinco estaciones


situadas en las regiones de la geografía española más importantes
para UF, como se ve en la Fig. 14. En el estudio de las posibles
variables, uno de los factores clave era determinar cuáles eran las
regiones que afectaban positivamente a la previsión.

Fig. 14- presencia de Unión Fenosa Distribución en España

En un principio se podría suponer que serían Ciudad Real y


Madrid las regiones con mayor influencia dada su proximidad. Sin
embargo, otros estudios en la utilización de RNs para la previsión de
energía eólica (Canseco, 2006) aconsejaban probarlas todas, pues
puede ocurrir que la climatología de otras regiones tenga una
influencia considerable en Toledo, y además en muchos casos la red
puede detectar esta influencia.

Finalmente, los resultados indican que, efectivamente,


Ciudad Real y Madrid son las dos regiones de datos climáticos que
optimizan en mayor medida el modelo. También, como se verá en la
tabla del apartado siguiente, surgen combinaciones con relativamente

Carlos Entrena Moratiel 67


Universidad Pontificia de Comillas - PFC

poco error, como Madrid y La Coruña, por ejemplo. Pero las mejores
regiones son las ya mencionadas y por tanto son las seleccionadas
para el modelo final.

Resultados

Para efectuar la selección de variables se realizaron


numerosos estudios e iteraciones de distinto tipo que se verán a
continuación. La más importante tuvo lugar una vez se hubo
seleccionado el entrenamiento BR (Bayesian Regression), y los demás
parámetros estaban relativamente bien reglados.

Esta iteración es una prueba de todas las combinaciones


posibles entre los bloques ya mencionados de variables y regiones.
Así, las posibles combinaciones de bloques de variables son 8:

- P50;
- P50, Nub;
- P50, Tmax;
- P50, Nub, Tmax;
- P50, P10;
- P50, P10, Nub;
- P50, P10, Tmax;
- P50, P10, Nub, Tmax;

n cuanto a las regiones, se tienen 5 variables que se pueden


combinar, de manera binaria, es decir, o se insertan todas las
variables seleccionadas en cada caso para una región o no. Eso
supone 2 32 combinaciones, que se convierten en 31 pues no
puede haber un vector de entradas vacío.

La iteración se realizó con el modelo de red RND, realizando


15 iteraciones de cada red con un determinado conjunto de variables.
A continuación se midió el Error Real de cada uno de los conjuntos
de test de dichas iteraciones, y se halló la media y la desviación típica
de dichos Errores Reales. Se presentan en forma de tabla dichas
medias y desviaciones. Se ha optado por un código de colores para
mostrar los mejores y peores resultados.

Carlos Entrena Moratiel 68


Universidad Pontificia de Comillas - PFC

P50,P10,T,N
P50,P10,N
P50,Nub,T

P50,P10,T
P50,Nub

P50,P10

Mínima
Media
P50,T
P50
LC M V CR L
x 32,48 27,99 31,52 28,27 31,96 31,96 31,19 30,81 30,78 27,99
x 26,24 23,11 26,60 22,65 27,46 27,46 27,61 25,98 25,89 22,65
x x 27,21 24,02 28,10 20,40 27,80 27,80 28,58 22,83 25,84 20,40
x 31,36 30,45 29,72 29,57 31,43 31,43 29,49 36,68 31,27 29,49
x x 31,72 28,45 31,26 28,33 31,61 31,61 31,02 26,91 30,12 26,91
x x 26,57 24,01 26,98 22,96 27,17 27,17 27,03 25,19 25,88 22,96
x x x 27,69 25,08 27,01 24,54 27,94 27,94 27,74 24,73 26,58 24,54
x 23,67 20,57 23,77 21,08 22,84 22,84 22,93 24,16 22,73 20,57
x x 24,95 21,66 24,96 21,43 23,97 23,97 23,38 20,31 23,08 20,31
x x 21,72 19,10 22,06 19,59 23,94 23,94 24,72 20,36 21,93 19,10
x x x 23,44 21,66 23,10 20,07 24,13 24,13 24,93 20,89 22,79 20,07
x x 24,35 21,20 23,97 21,84 23,24 23,24 23,46 22,22 22,94 21,20
x x x 25,89 22,65 25,01 22,32 23,99 23,99 23,91 22,88 23,83 22,32
x x x 23,39 20,78 22,92 20,43 24,03 24,03 24,13 21,25 22,62 20,43
x x x x 22,75 22,92 25,04 22,35 24,63 24,63 24,40 22,26 23,62 22,26
x 32,85 32,18 32,04 31,66 32,54 32,54 32,15 35,68 32,70 31,66
x x 33,17 26,16 32,45 26,51 32,97 32,97 32,23 26,63 30,39 26,16
x x 26,64 24,61 27,26 22,59 28,14 28,14 28,54 24,42 26,29 22,59
x x x 29,17 24,11 29,11 23,64 29,04 29,04 28,85 24,74 27,21 23,64
x x 31,71 29,33 31,18 28,06 30,86 30,86 30,11 29,37 30,19 28,06
x x x 32,70 27,17 32,07 26,32 32,19 32,19 31,69 26,04 30,05 26,04
x x x 29,26 24,56 27,51 24,12 27,94 27,94 28,54 24,94 26,85 24,12
x x x x 28,71 24,42 29,04 25,14 28,50 28,50 29,69 25,22 27,40 24,42
x x 24,19 20,41 24,51 20,92 23,12 23,12 23,66 21,16 22,64 20,41
x x x 26,28 20,34 25,43 20,81 24,08 24,08 24,64 21,07 23,34 20,34
x x x 23,28 19,99 23,56 20,33 24,78 24,78 24,53 20,90 22,77 19,99
x x x x 24,10 20,82 24,12 20,44 24,90 24,90 26,38 21,20 23,36 20,44
x x x 25,82 22,19 24,55 21,61 23,16 23,16 23,56 20,95 23,13 20,95
x x x x 25,18 21,57 25,21 21,94 23,85 23,85 25,71 21,98 23,66 21,57

Carlos Entrena Moratiel 69


Universidad Pontificia de Comillas - PFC

x x x x 23,40 20,89 24,46 21,30 24,64 24,64 24,68 21,75 23,22 20,89
x x x x x 24,41 22,34 25,51 23,22 24,92 24,92 25,05 22,99 24,17 22,34
Media 26,91 23,70 26,78 23,37 26,83 26,83 26,92 24,40
Mínima 21,72 19,10 22,06 19,59 22,84 22,84 22,93 20,31
Tabla 6- Resultado de la iteración de variables

En esta tabla se puede observar la estructura global de los


resultados. Las zonas coloreadas en rojo, es decir, los peores
resultados, corresponden a los conjuntos de variables que no
incluyen la región “Madrid”. Dentro de estas zonas menos efectivas
vemos que cuando se incluye la región “Ciudad Real”, se mejora el
error sensiblemente, y especialmente en los casos en los que las
variables son P50 y Nub, con o sin Tmax. En cuanto a los valores
positivos, se concentran sobre todo en las variables ya mencionadas,
con las regiones “Madrid” y “Ciudad Real”. El menor error, 19.10 se
encuentra en el conjunto de variables: “Madrid” y “Ciudad Real” con
P50 y Nub. El segundo mejor valor, 19.59, corresponde a la misma
combinación, añadiendo Tmax.

Pese a ser peor, es éste el conjunto de variables seleccionado.


El haber escogido el correspondiente al segundo mejor error y no al
primero se debe a que la media para dicho conjunto de variables,
23.37, es la mejor. Esto indica que la variable es válida y además,
como se verá en la siguiente tabla, ayuda al modelo a converger y a
entrenarse de manera efectiva.

A continuación se presenta una tabla con las desviaciones ya


mencionadas. Éstas demuestran que la variable P10 tiene una
influencia negativa en la convergencia del modelo a un conjunto de
pesos adecuado a la minimización del error.

Carlos Entrena Moratiel 70


Universidad Pontificia de Comillas - PFC

P50,P10,T,N
P50,P10,N
P50,Nub,T

P50,P10,T
P50,Nub

P50,P10

Mínima
Media
P50,T
P50
LC M V CR L
x 0,18 0,99 0,34 2,85 0,66 2,95 0,25 6,78 1,88 0,18
x 0,37 0,21 0,13 0,24 0,63 0,81 0,48 5,96 1,10 0,13
x x 0,91 1,48 2,82 0,99 0,66 0,81 2,70 0,82 1,40 0,66
x 0,45 0,62 0,50 0,47 2,91 3,88 0,33 4,91 1,76 0,33
x x 0,44 0,28 0,52 2,73 1,98 0,60 2,11 0,53 1,15 0,28
x x 0,08 0,11 0,10 0,39 0,94 1,28 0,82 1,03 0,59 0,08
x x x 4,17 0,72 0,75 0,65 0,87 3,52 0,54 0,88 1,51 0,54
x 0,21 0,72 0,35 0,62 0,28 4,39 0,24 8,04 1,86 0,21
x x 0,21 0,70 0,26 0,52 0,14 0,43 0,21 0,26 0,34 0,14
x x 0,27 0,63 0,20 0,32 0,53 4,36 3,59 0,37 1,28 0,20
x x x 3,87 1,50 0,63 1,43 0,59 0,37 3,51 0,59 1,56 0,37
x x 0,28 0,66 0,30 0,59 0,25 0,52 0,33 4,14 0,88 0,25
x x x 3,29 0,66 0,43 0,43 0,30 4,07 0,26 5,80 1,91 0,26
x x x 3,92 0,82 0,36 0,62 0,68 0,65 0,48 0,73 1,03 0,36
x x x x 1,56 1,22 0,89 0,71 0,54 6,49 0,39 4,17 2,00 0,39
x 0,19 0,14 0,11 0,18 0,16 2,88 0,17 4,23 1,01 0,11
x x 0,19 0,66 1,78 0,62 0,23 0,74 1,62 3,18 1,13 0,19
x x 1,02 0,56 0,16 0,34 0,65 0,48 0,57 0,83 0,58 0,16
x x x 2,83 0,64 0,55 1,17 0,47 0,74 0,42 3,58 1,30 0,42
x x 0,35 2,51 2,95 0,28 0,34 4,14 0,16 3,57 1,79 0,16
x x x 1,68 3,00 1,85 0,52 1,84 0,48 1,97 0,51 1,48 0,48
x x x 4,56 0,55 0,36 0,66 0,65 3,39 2,75 0,59 1,69 0,36
x x x x 0,73 0,58 0,68 3,49 0,73 3,56 3,49 3,49 2,09 0,58
x x 0,22 0,62 0,37 0,36 0,14 0,71 0,13 4,39 0,87 0,13
x x x 3,23 0,78 0,23 0,53 0,13 6,21 3,57 4,43 2,39 0,13
x x x 3,89 0,22 0,23 0,62 0,65 4,22 0,67 0,74 1,40 0,22
x x x x 1,68 1,16 0,77 0,85 0,72 4,17 4,62 0,57 1,82 0,57
x x x 4,78 4,18 0,36 0,34 0,27 0,64 0,41 0,39 1,42 0,27
x x x x 0,49 0,65 0,41 0,50 0,21 5,95 4,82 4,22 2,16 0,21

Carlos Entrena Moratiel 71


Universidad Pontificia de Comillas - PFC

x x x x 0,39 0,45 0,44 0,60 0,52 0,95 0,59 0,81 0,59 0,39
x x x x x 0,95 0,84 0,76 3,94 0,59 5,63 0,50 4,02 2,15 0,50
Media 1,53 0,93 0,66 0,92 0,65 2,58 1,38 2,73
Mínima 0,08 0,11 0,10 0,18 0,13 0,37 0,13 0,26
Tabla 7- Desviaciones típicas de la iteración de variables

Recapitulando, las variables seleccionadas para el modelo


final han sido:

- P50
- Nubosidad
- Temperatura máxima
- Cada una de ellas en las regiones de Madrid y Ciudad
Real

Queda por tanto un vector de 14 entradas, 7 por región.

A modo de conclusión se puede decir que el estudio de las


variables es un importante paso, si no el más, a la hora de extender
el modelo a otros parques, de ahí que en el apartado 6 se explique el
proceso iterativo seguido.

Carlos Entrena Moratiel 72


Universidad Pontificia de Comillas - PFC

5. OPTIMIZACIÓN DE LOS
PARÁMETROS DE LA RED

En este apartado se pretende analizar los parámetros de los


modelos de RNs que se han ido optimizando durante el estudio. La
mayoría de ellos se fueron mejorando poco a poco hasta obtener una
versión funcional de RND, y después de seleccionar las variables se
optimizaron de nuevo. Para las otras arquitecturas de Red se
extrapolaron muchos de los resultados aquí mostrados, y otros, en
particular el número de neuronas, tuvieron que ser modificados para
ajustarse a la diferencia que supone realizar una previsión o más.

Merece una mención aparte la selección del número de


neuronas, que ya se ha introducido en el apartado 3 “Arquitecturas
de Red” y para lo cual se realizó una iteración parecida a la iteración
de selección de variables.

Los “parámetros” que se van a analizar son: selección de


conjuntos de validación y test, normalización de entradas y salidas,
número de neuronas, tipo de entrenamiento, funciones de
transferencia y número de salidas representativas (en el modelo
horario).

Conjuntos de validación y test

Como se ha visto en el Capítulo III de introducción a las redes


neuronales, un elemento muy importante para el entrenamiento
correcto de una RN es el conjunto de validación. El conjunto de
validación es el conjunto de datos con el que se prueba la red y que
no la modifica ni entrena. Se mide el error obtenido de los resultados
del conjunto de validación y se utiliza para decidir si se para el
entrenamiento, cuando se empieza a sobreentrenar la red (la red se
especializa en detectar muy bien los casos que conoce pero no es
capaz de generalizar). El conjunto de test sólo sirve para medir la

Carlos Entrena Moratiel 73


Universidad Pontificia de Comillas - PFC

eficacia real de la red una vez finalizado el entrenamiento. Matlab


incluye funciones para gestionar estos conjuntos de variables y
producciones.

Al disponer de pocos datos históricos (388 días, desde el 14


de julio de 2007 hasta el 4 de agosto de 2008) esta es una elección
vital. En muchos modelos, con más cantidad de históricos
disponibles, se escogen los últimos días para los conjuntos de
validación y test. En este caso, sin embargo, al hacer eso estábamos
quitando al entrenamiento datos importantes de días de verano muy
cercanos al horizonte de predicción que se utilizaban para la
validación. Además los días de test eran también días de verano, con
lo cual los valores de error no eran veraces.

Por eso se ha optado por tomar días intercalados tanto para


la validación como el test. Así, de cada 5 datos de entrada y salida, 3
son para entrenamiento, uno para validación y uno para test. Este
sistema ha sido el más efectivo a la hora de entrenar la red. Se han
probado distintas proporciones de días utilizados para cada conjunto,
pero en base a la bibliografía y a numerosas pruebas, 3:1 (entre
entrenamiento y validación) parece una buena elección. En cuanto a
los días de test, se justifica utilizar el 20% de los datos totales
porque, al estar probándose el modelo, es importante asegurarse de
que en el cálculo de los errores se están tomando suficientes casos,
es decir, un conjunto representativo de datos.

Una vez el modelo probado, y como se ve en la comparativa


con el sistema de perfiles (punto 6), se puede reducir el número de
días de prueba para mejorar el entrenamiento y la validación. Así, se
ha incluido una opción en el modelo para cambiar la proporción de
días de test al 10%, de validación al 20% y de entrenamiento al 70%.
Se mejora así el error sensiblemente, por la misma razón, que al
disponer de pocos datos históricos es importante aprovecharlos al
máximo.

Además, es necesario decir que, de tener más históricos


disponibles, podría haber sido interesante realizar la prueba en un
mismo periodo de tiempo, por ejemplo tomar un mes para asegurar el
buen funcionamiento de la red, y también tomar menos días de test
Carlos Entrena Moratiel 74
Universidad Pontificia de Comillas - PFC

en proporción con el conjunto de datos total. Pero parece lógico


seguir tomando los días de validación intercalados entre los de
entrenamiento, y en la proporción ya descrita.

Normalización

La normalización es también un procedimiento importante


para el buen funcionamiento de la red, pues evita que las funciones
de transferencia saturen y la red sea inservible para el intervalo de
valores definido. Existen diversas formas de normalizar los datos de
entrada y salida. Por ejemplo, se puede tomar un valor importante o
representativo como 500KWh para el parque de 1MW de potencia, o
con un cálculo estadístico que reparta los valores de una misma
variable según una distribución normal.

Las dos formas de normalización que se han utilizado son


ésta última, y la división por el máximo de la variable durante todo el
periodo. Los resultados más positivos se han obtenido al realizar la
división por el máximo, por lo que se la ha seleccionado como forma
de normalización para el modelo. Además es más sencillo que aplicar
las funciones que proporciona Matlab para el cálculo de la
distribución normal.

Número de neuronas

El número de neuronas es un parámetro importante pues


varía mucho en función de la complejidad del fenómeno a analizar.
Por ello es bueno seguir un proceso iterativo y asegurarse de que el
número de neuronas escogido es el adecuado.

En este caso se realizó la iteración para detectar el número de


neuronas óptimo cuando ya se habían seleccionado las variables y el
entrenamiento escogido era el de Regularización Bayesiana. Se fijaron
las capas posibles para la RND en 3, una de entrada, una oculta y
una de salida, pudiendo también no tener capa oculta (0 neuronas
ocultas). Se realizaron 15 iteraciones de cada tipo de red, es decir, de
cada entrada de la siguiente tabla. Se muestra la media del Error
Real de cada una de dichas iteraciones, en porcentaje. En las

Carlos Entrena Moratiel 75


Universidad Pontificia de Comillas - PFC

columnas varía el número de neuronas de la capa oculta y en las


filas, el número de neuronas en la capa de entrada.

Ent.\Oculta 0 1 2 3 4 5 6 7 8 Media Mínima


5 19,7 20,2 19,7 19,9 20,3 20,3 19,7 19,6 19,7 19,9 19,6
6 19,5 19,5 21,0 19,8 27,7 19,7 19,6 19,9 19,9 20,7 19,5
7 19,6 19,5 23,1 20,7 19,5 28,7 19,8 19,8 19,7 21,1 19,5
8 19,5 19,4 29,1 19,9 19,5 19,7 20,4 19,6 19,6 20,7 19,4
9 19,4 19,6 24,4 19,8 19,7 19,6 20,4 19,9 19,9 20,3 19,4
10 19,4 19,4 34,6 20,5 20,6 19,7 19,9 19,7 19,9 21,5 19,4
11 19,4 19,5 19,8 20,2 21,2 19,6 19,7 19,6 19,9 19,9 19,4
12 19,4 19,6 20,5 20,0 22,0 19,6 19,7 19,7 19,6 20,0 19,4
13 19,4 19,5 19,9 20,0 19,5 22,7 19,7 19,7 19,8 20,0 19,4
14 19,4 19,6 19,8 19,8 19,5 30,2 19,7 19,9 19,7 20,8 19,4
15 19,4 19,6 19,7 19,9 19,7 19,7 19,6 19,9 19,7 19,7 19,4
16 19,4 19,6 20,3 19,8 19,7 19,8 19,7 19,8 19,7 19,8 19,4
17 19,3 19,5 19,8 20,6 19,8 19,3
18 19,4 19,7 20,4 20,0 19,9 19,4
19 19,5 19,7 19,8 21,6 20,1 19,5
20 19,3 20,2 19,8 19,9 19,8 19,3
25 19,5 19,6 19,8 20,1 19,7 19,5
Media 19,4 19,6 21,9 20,1 20,8 21,6 19,8 19,7 19,8
Mínima 19,3 19,4 19,7 19,8 19,5 19,6 19,6 19,6 19,6
Tabla 8- Errores según el número de neuronas de la RN

En esta tabla se ve cómo las RNs que obtienen menor error se


concentran en las áreas con pocas neuronas en la capa oculta, o sin
capa oculta. Para la RND parece entonces adecuado no poner capa
oculta, o poner una sola neurona. En la siguiente tabla vemos las
desviaciones típicas, también en porcentaje, del error en dichas
iteraciones:

Carlos Entrena Moratiel 76


Universidad Pontificia de Comillas - PFC

Ent.\Oculta 0 1 2 3 4 5 6 7 8 Media Mínima


5 0,56 3,75 0,58 0,45 4,06 4,05 0,46 0,48 0,46 1,65 0,45
6 0,11 0,35 5,13 0,57 10,09 0,58 0,40 0,60 0,38 2,02 0,11
7 0,45 0,28 7,60 3,72 0,31 10,04 0,41 0,47 0,38 2,63 0,28
8 0,35 0,28 10,18 0,64 0,32 0,38 4,04 0,42 0,42 1,89 0,28
9 0,12 0,44 8,62 0,46 0,45 0,41 4,07 0,54 0,65 1,75 0,12
10 0,13 0,25 8,83 3,69 4,08 0,44 0,43 0,29 0,47 2,07 0,13
11 0,52 0,35 0,46 0,56 5,61 0,37 0,38 0,32 0,46 1,00 0,32
12 0,51 0,41 3,67 0,74 6,71 0,46 0,31 0,44 0,39 1,51 0,31
13 0,52 0,32 0,53 0,59 0,34 7,63 0,53 0,63 0,54 1,29 0,32
14 0,55 0,38 0,34 0,46 0,33 10,24 0,40 0,53 0,45 1,52 0,33
15 0,64 0,46 0,54 0,53 0,43 0,43 0,55 0,54 0,29 0,49 0,29
16 0,61 0,46 3,15 0,38 0,57 0,55 0,49 0,53 0,36 0,79 0,36
17 0,21 0,30 0,45 3,63 1,15 0,21
18 0,60 0,45 3,69 0,52 1,32 0,45
19 0,71 0,48 0,47 5,00 1,67 0,47
20 0,23 3,71 0,49 0,46 1,22 0,23
25 0,66 0,33 0,51 0,51 0,51 0,33
Media 0,44 0,76 3,25 1,35 2,77 2,96 1,04 0,48 0,44
Mínima 0,11 0,25 0,34 0,38 0,31 0,37 0,31 0,29 0,29
Tabla 9- Desviaciones típicas en las iteraciones del número de
neuronas

En esta tabla se observan resultados parecidos. Lo que


parece claro a la vista de las desviaciones es que no se deben utilizar
redes con entre 2 y 6 neuronas en la capa oculta, pues son
inestables. Si se descartan esas opciones, se obtiene la gráfica

Carlos Entrena Moratiel 77


Universidad Pontificia de Comillas - PFC

siguiente:

Neuronas entrada- Error


20,4

Media Error Real 20,2

20,0
0
19,8 1

19,6 7

8
19,4

19,2

19,0
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 25
Neuronas en la capa de entrada

Gráfica 3- Neuronas entrada-Media Error Real

Efectivamente, en 10 y 17 neuronas de entrada aparecen


mínimos tanto para la serie de 0 neuronas ocultas como para 1
neurona oculta. El mínimo para la serie 0 es local, el de la serie 1,
global. Se ha optado en general por utilizar RNDs de 17 neuronas en
la capa de entrada y sin capa oculta, o con 10 neuronas en la capa de
entrada y una en la capa oculta, siendo los resultados más o menos
equivalentes.

En cuanto a las redes de previsión horaria, un estudio


equivalente, pero con menos iteraciones por motivos de tiempo, ha
demostrado que 25 neuronas en la capa de entrada es la solución
óptima, y en la capa oculta 13 ó 15 según las horas de producción
que se tengan como no despreciables, como se verá a continuación.

Por último, es necesario decir que al usar el entrenamiento de


Regularización Bayesiana se ha podido comprobar
experimentalmente, en numerosas iteraciones, cuál era el orden de
neuronas efectivamente utilizadas por la red a lo largo del
entrenamiento y una vez finalizado éste. Esto ha sido de gran utilidad
a la hora de decantarse por poner 10 neuronas en la capa de entrada

Carlos Entrena Moratiel 78


Universidad Pontificia de Comillas - PFC

y una en la capa oculta, pues resultaba más efectivo en tiempo y en


utilización efectiva de la capacidad de la red.

Tipo de entrenamiento

El tipo de entrenamiento seleccionado es el de Regularización


Bayesiana (BR), en detrimento del algoritmo Levenberg-Marquardt
(LM). En el Capítulo III se incluyen breves descripciones de ambos
algoritmos. Esto se debe a los mejores resultados obtenidos en todas
las pruebas y el menor número de neuronas necesario para que el
modelo funcione correctamente.

A pesar de ser un entrenamiento más lento, su tasa de


convergencia a soluciones realistas, es decir, a mínimos globales, es
mucho mayor. La función del algoritmo de hacer decrecer los pesos
que no se utilizan tiene una utilidad añadida y es que permite ver
cuántas neuronas son realmente necesarias. Como se ha visto en el
punto anterior, esto ha sido de utilidad a la hora de elegir el número
de neuronas, y puede ser útil al extender el modelo u aplicarlo a otros
parques, al hacer más rápido el proceso de optimización.

Funciones de transferencia

Las funciones de transferencia determinan en gran medida el


funcionamiento de la RN. Tienen mucha relación con el tipo de
normalización que se utilice. En este caso, puesto que el valor de
salida es positivo, y, una vez normalizado, varía entre 0 y 1, parecía
lógica la elección de una función continua y diferenciable que variase
entre dichos valores. Por eso se ha escogido la función “logsig” en la
capa de salida, ya sea del modelo RND (una neurona) o RNH (13 ó 15
neuronas).

En cuanto a las capas de entrada y oculta, se han obtenido


mejores resultados con la función “tansig”. Esta función, que produce
una salida entre -1 y 1, parece más efectiva de cara a proporcionar
los valores que interpretará la capa de salida.

Carlos Entrena Moratiel 79


Universidad Pontificia de Comillas - PFC

Tanto la función “logsig” como la “tansig” son derivables * 5 , y


por tanto sencillas de manejar por los algoritmos, por complicados
que sean. A continuación se muestran sus gráficas:

Fig. 15- Funciones de transferencia utilizadas en el modelo

Al experimentar con otros tipos de función, como las


funciones lineales, se vio cómo a menudo la red no convergía a
soluciones correctas, es decir, que el espacio de soluciones posibles
se volvía más inestable, con más mínimos locales. De ahí que se
hayan utilizado estas funciones.

Número de salidas representativas

En el modelo horario tiene una gran importancia la selección


del número de salidas representativas, es decir, cuántas franjas
horarias se considera que realmente producen. De las 24 horas del
día, a lo largo del año hay sol en 15 de ellas, de 7:00 a 21:00 en
horario de verano, es decir, de 5:00 a 19:00 UTM.

Si se eliminan las horas con producción nula durante todo el


año, entonces el modelo RNH tendrá 15 neuronas en la capa de
salida, y sus previsiones para un día, 15 componentes, una por hora.
Sin embargo, al hacer esto, se tiene que durante la primera hora y la
última la red no es capaz de prever con eficacia estos valores. Esto se
debe a que la función logsig no llega a prever el 0 más que si se le
introduce el valor ∞, y como la función tansig solo puede obtener
resultados entre -1 y 1, esto hace necesario unos bias demasiado
grandes, y las RNs no llegan a conseguir bias tan grandes con el
entrenamiento utilizado. Un bias muy grande supone una pérdida de
precisión para la red, así que el intentar prever estas horas implica
que las dos neuronas utilizadas para preverlas no funcionan

Carlos Entrena Moratiel 80


Universidad Pontificia de Comillas - PFC

adecuadamente, y por tanto aumentan considerablemente el error del


modelo.

Para evitar esto, la solución que se ha ideado es eliminar


estas dos horas de la previsión. Puesto que son horas durante las
cuales la mayoría del año se produce una cantidad nula de energía, y
cuando se produce son valores muy pequeños (siempre inferiores al
0,5% del total durante el día), no se pierde mucho eliminándolos, y
los modelos mejoran sensiblemente.

De ahí que en el modelo final, para la previsión horaria, solo


se alimente a la red con patrones de entrenamiento de 13 horas, que
serán las que luego prevea.

Conclusiones

Los parámetros del modelo se han ido optimizando durante


todo el proceso. Los resultados finales permiten crear un modelo con
cierto carácter permanente, pero es importante, en el caso de
extenderlo a otros casos, comprobar la validez de las elecciones y
volver a cerciorarse de que el sistema está optimizado.

Las iteraciones para comprobar el número de neuronas


adecuado y las variables que mejores resultados dan son vitales a la
hora de crear el modelo. Por ello, en el Capítulo V de las herramientas
informáticas diseñadas, la primera parte se dedica a presentar los
sistemas utilizados para iterar las RNs y calcular los Errores,
pudiendo así escoger estos dos parámetros tan importantes del
modelo.

Carlos Entrena Moratiel 81


Universidad Pontificia de Comillas - PFC

6. COMPARACIÓN CON EL
SISTEMA DE PREDICCIÓN POR
PERFILES

Aquí se va a comparar el modelo ya definido con la


metodología de previsión por perfiles incluida en el Real Decreto
661/2007, que proporciona 24 factores técnicos de funcionamiento
horarios para cada mes y para cada zona solar (según la división en
cinco zonas climáticas dispuesta en el Real Decreto 314/2006, de 17
de marzo, por el que se aprueba el Código Técnico de la Edificación).
Estos factores se multiplican por la potencia instalada dando la
producción horaria de energía.

A continuación, en la Tabla 10 se presentan los factores para


la zona IV, en la que se encuentran los dos huertos solares
estudiados:

Con este sistema se obtiene una previsión muy ineficaz, pues


es totalmente independiente del clima: solo tiene en cuenta la
radiación media a lo largo del mes, en cada hora, y la extrapola a
todos los días de dicho mes. Esto puede provocar grandes desvíos, de
ahí la necesidad de otro sistema más eficaz.

Si se realiza una breve comparativa de los dos sistemas, el de


previsión con el modelo de RN ideado y el de previsión por perfiles, se
obtienen resultados que indican que la tecnología de inteligencia
artificial en este dominio es prometedora.

Carlos Entrena Moratiel 82


Universidad Pontificia de Comillas - PFC

Tabla 10- Factores de funcionamiento por mes y hora solar

Carlos Entrena Moratiel 83


Universidad Pontificia de Comillas - PFC

En un primer gráfico se muestran las previsiones diarias


realizadas por los dos sistemas y la producción real (calculada como
la suma de las producciones horarias). La previsión del modelo de
RNs se divide en dos: una para la salida de la primera subred, que es
la que realimenta la segunda, y otra calculada a partir de la suma de
las 15 previsiones de la segunda subred:



7#  8#9
9$

Ec. 14- cálculo de una producción diaria a partir de una horaria

Donde 7# es la producción diaria en un día de prueba i y 8#9 es


la producción en la hora j de ese mismo día i. Hay 39 días de prueba,
repartidos entre distintos meses:

8500

7500

6500

5500
Energía diaria

Producción real
4500
Prod. Con
3500 Coeficientes
Previsión Subred 1
2500
Previsión subred
horaria
1500

500
1 6 11 16 21 26 31 36
Días de prueba

Gráfica 4- Producciones diarias durante la prueba

Como se puede observar, la previsión realizada con los


perfiles es muy imprecisa. En primer lugar, sobreestima la

Carlos Entrena Moratiel 84


Universidad Pontificia de Comillas - PFC

producción en gran medida. En segundo lugar, no sigue en ningún


momento los cambios de la producción debidos a variaciones en la
nubosidad o en la radiación. Esta gráfica da una idea del error del
sistema de previsiones con perfiles. Incluso en el caso de realizar
modificaciones y recalcular coeficientes ajustando la curva, no parece
un método adecuado por su poca precisión.

Carlos Entrena Moratiel 85


Universidad Pontificia de Comillas - PFC

7. RESULTADOS

Con el modelo ya definido se puede pasar a analizar su


eficacia. A continuación se presentan dos tablas, una con los errores
realizados por la Red Neuronal Diaria optimizada, y otra con los
errores cometidos por las distintas arquitecturas de previsión horaria.
Estos errores se calcularon con 20 iteraciones de cada arquitectura
optimizada según lo comentado en el punto 5. En cuanto al Error
Real Horario, puesto que en algunas horas da infinito según la
fórmula presentada en el punto 2, se ha optado por poner el error de
la suma de energía de todos los días de predicción. Es un parámetro
algo menos fiable, pero como ya se ha dicho los errores más
representativos son la Media de Error Real Horario y la Media de
Error en Energía Horario.

Error Error en
Real Energía
Red Neuronal Diaria 16,37 8,71
Tabla 11- Error para la previsión diaria (%)

Carlos Entrena Moratiel 86


Universidad Pontificia de Comillas - PFC

8:00 9:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00

RND + RN MERH 32,37 ERH 44,90 29,70 23,71 21,19 22,28 21,52 22,99 22,86 21,39 27,03 27,83 32,93 54,49

Horaria MEEH 13,95 EEH 8,50 13,83 16,13 16,17 16,07 15,42 14,96 15,57 13,16 16,52 15,18 12,00 7,81

RND+ MERH 31,21 ERH 48,67 32,05 24,04 21,57 22,94 21,44 22,67 23,13 20,27 26,71 26,54 33,28 52,51
Serie-
MEEH 13,17 EEH 9,71 13,83 13,71 13,78 15,32 14,23 14,11 15,20 12,74 16,13 13,88 11,17 7,42
Paralelo
Red MERH 26,67 ERH 40,60 30,52 23,82 21,25 20,85 20,24 21,68 23,05 18,90 25,55 27,02 33,19 59,51
diaria-
MEEH 12,72 EEH 8,10 13,17 13,59 13,58 13,92 13,43 13,50 15,15 11,87 15,43 14,13 11,14 8,41
horaria
Tabla 12- errores para las previsiones horaria en distintos modelos (%)

Carlos Entrena Moratiel 87


Universidad Pontificia de Comillas - PFC

La arquitectura seleccionada, es decir, la Red Diaria-Horaria,


es la que presenta mejores resultados globales, como se ve en la
Tabla 12. Estos resultados parecen ser un buen indicio de la posible
efectividad de un sistema de predicción de redes neuronales.

Ejemplos de predicciones

Para mostrar de una forma más visual los resultados


obtenidos, se presentan a continuación una serie de gráficas de
predicciones realizadas por el modelo optimizado, junto a las
correspondientes realidades.

En primer lugar, las predicciones diarias durante los 39 días


de prueba, es decir, verdaderas previsiones con datos que no se han
usado para entrenar a la red:

Predicciones de prueba
6000

5000
Energía fotovoltaica [kWh]

4000

3000 Producción real


Predicción de la red
2000

1000

0
1 5 9 13 17 21 25 29 33 37

Gráfica 5- Previsión de energía en los días de prueba, con la


producción real

Las siguientes gráficas son algunos ejemplos de las


predicciones horarias realizadas para un día determinado de prueba:

Carlos Entrena Moratiel 88


Universidad Pontificia de Comillas - PFC

Día de prueba 1
700
600
500
Energía [kWh] 400
300 Producción Real

200 Predicción

100
0
8:00
9:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00
Gráfica 6- Ejemplo de la previsión de un día de prueba

Día de prueba 2
500
450
400
Energía [kWh]

350
300
250
Producción Real
200
150 Predicción
100
50
0
8:00
9:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00

Gráfica 7- Ejemplo de la previsión de un día de prueba

Carlos Entrena Moratiel 89


Universidad Pontificia de Comillas - PFC

Día de prueba 3
600

500

Energía [kWh]
400

300
Producción Real
200 Predicción
100

0
8:00
9:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00
Gráfica 8- Ejemplo de la previsión de un día de prueba

Día de prueba 4
500
450
400
Energía [kWh]

350
300
250
Producción Real
200
150 Predicción
100
50
0
8:00
9:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00

Gráfica 9- Ejemplo de la previsión de un día de prueba

En estas gráficas se ve cómo la herramienta tiene problemas


para predecir baches puntuales, como en la cuarta gráfica. Pero para
la generalidad de los días aproxima relativamente bien el máximo de
la “gaussiana” y el total de la energía prevista en el día.

Carlos Entrena Moratiel 90


Universidad Pontificia de Comillas - PFC

V. DESARROLLO DE UNA
HERRAMIENTA DE
PREVISIÓN

En este capítulo se presentan una serie de funciones


desarrolladas en Matlab® creadas como base para una futura
herramienta de previsión. Estas funciones deberían ser
implementadas en un sistema más complejo, con un interfaz de
usuario o en un sistema automático de lanzamiento de previsiones.
Estos objetivos se escapan al interés de este proyecto, que pretende
proponer un prototipo de investigación. Sin embargo, tras la tarea de
programación acometida para la creación y optimización del modelo,
presentado en el Capítulo IV, pareció una buena opción mejorar
algunas de las técnicas utilizadas con vistas a su posterior
implementación en la herramienta final.

Se presentan pues una serie de funciones que pueden servir


para adquirir datos existentes en forma de tabla Excel, para crear y
entrenar una Red Neuronal según el modelo optimizado ya descrito, y
para lanzar una previsión con horizonte temporal de un día.

En primer lugar se explicará la estructura global del


programa. En segundo lugar, se analizarán las funciones utilizadas,
comentando las partes más complejas. En tercer lugar, y a modo de
conclusión, se verán las posibles modificaciones que se deberían
realizar en primer lugar para mejorar la calidad general del programa.

Durante la exposición se incluirán algunos extractos de la


programación, y, con el fin de no sobrecargar la descripción, el código
completo tanto de la herramienta de producción como de las

Carlos Entrena Moratiel 91


Universidad Pontificia de Comillas - PFC

funciones utilizadas para el Capítulo IV se encuentra recogido en la


Parte III: Código Fuente.

Carlos Entrena Moratiel 92


Universidad Pontificia de Comillas - PFC

1. ESTRUCTURA DEL
PROGRAMA

El programa está estructurado en torno a un archivo llamado


SOLAR.m (.m es la extensión usada en Matlab para almacenar
funciones y “scripts”), desde el cual se desarrolla el resto del
programa.

La estructura general es la siguiente:

Carlos Entrena Moratiel 93


Universidad Pontificia de Comillas - PFC

Fig. 16- estructura de la herramienta de previsión

Carlos Entrena Moratiel 94


Universidad Pontificia de Comillas - PFC

Los archivos .m se guardan en una carpeta junto con los


datos de entrada.

Datos iniciales

Hay 4 tipos de datos de entrada: radiaciones, nubosidades,


temperaturas y producciones de energía:

- Radiaciones: se guardan en una carpeta llamada


Radiaciones, dentro de la carpeta del programa. Es una
serie de archivos .dat individuales, es decir, cada uno
tiene una serie de predicciones de radiación a D+0, D+1 y
D+2. Son importados por la función leerRadiaciones.
- Nubosidades: se encuentran en una hoja Excel llamada
Nub.xls. Se importan con la función de Matlab xlsread.
- Temperaturas: tanto las temperaturas máximas
(utilizadas en el modelo analizado) como las mínimas se
encuentran en una hoja Excel llamada TmaxTmin.xls.
También se importan con la función xlsread. Se han
incluido las temperaturas mínimas con vistas a su
posible implementación en el futuro.
- Producciones: corresponden a las salidas de la RN, esto
es, se utilizan como objetivos a la hora de entrenar a la
red. Se encuentran en un archivo Excel llamado
Producciones.xls, en el que cada hoja Excel corresponde
a la producción de un huerto solar.

Cada tipo de entradas tiene un formato particular, que


incluye siempre una cabecera con fechas. Una vez importados, se les
da una forma homogénea para su utilización por la RN.

Además, se han utilizado vectores de fechas para controlar a


qué días corresponden los valores de cada uno de los conjuntos,
efectuándose así el entrenamiento y la previsión en función de los
datos disponibles. Por ejemplo, si hay días en los que se disponen
datos climáticos pero no datos de producción, se lanzará una
previsión para esos días, habiendo entrenado la RN con los días en

Carlos Entrena Moratiel 95


Universidad Pontificia de Comillas - PFC

los que sí había datos de entrada y de salida. Esto hace que se


utilicen numerosas funciones de fechas, ya incluidas en Matlab.

Los datos importados se guardan en un archivo .mat,


BBDD.mat, y son posteriormente cargados por la función
PrevisionParques usando la ruta que devuelve la función
ActualizarBBDD. Con esto se consigue una mayor flexibilidad en caso
de querer probar la RN, depurarla, efectuar modificaciones, etc., no
teniendo que importar todos los datos cada vez.

En cuanto a la estructura de variables, se ha escogido un


sistema para que los parámetros de la RN y de las variables de
entrada puedan ser cambiados abriendo el archivo
CrearEstructuraVariables.m. La estructura de variables se carga con
esta función, y es uno de los argumentos de la función
PrevisionParques, como se verá más adelante.

Datos de salida

En cuanto a las previsiones realizadas, los errores de la RN


(sus resultados en el entrenamiento) y los errores de prueba, en caso
de haberse realizado una prueba de la RN, son devueltos en forma de
estructura por la función PrevisionParques.

Estos datos deberían ser guardados en algún formato útil


para su uso posterior, por ejemplo, las previsiones se podrían
guardar todos los días en un archivo Excel, y los errores en archivos
.mat, más útiles para su uso posterior en Matlab. Puesto que la
herramienta no está depurada y aún no se han especificado las
características que deberá cumplir, ni los formatos a utilizar, queda
por realizar la interpretación y el guardado de los datos de salida de
la herramienta de previsión.

Carlos Entrena Moratiel 96


Universidad Pontificia de Comillas - PFC

2. FUNCIONES

Las funciones que se han utilizado se encuentran en archivos


.m en la carpeta del programa. A continuación se describen las
funciones, intentando no entrar en excesivo detalle de la
programación, pero mostrando algunos ejemplos del funcionamiento,
especialmente en el caso de la Red Neuronal utilizada.

ActualizarBBDD

:;2<=>?@ A;B ?;óD >?@ A;B EFF//E@ ;

Esta función, cuyo único argumento es el nombre del archivo


en el que se van a guardar los datos (en este caso, BaseDatos.mat), se
encarga de importar las variables de entrada y las producciones.
Como salida da el tiempo que ha tardado en realizar la importación
de dichos datos.

Como datos iniciales, en el script hay tres variables, la


primera fecha de la que se disponen radiaciones, el formato utilizado
para las fechas (siempre se utilizará el formato “dd/mm/aaaa”) y la
carpeta en la que se guardan las radiaciones:

Posteriormente se importan los datos de nubosidad y


temperatura utilizando la función xlsread, y guardando las fechas en
vectores aparte. Además, hay que eliminar las cabeceras de las hojas
Excel. En este paso también se importan los datos de radiaciones,
usando la función leerRadiaciones y los argumentos “fecha1” y
“carpeta”:

Carlos Entrena Moratiel 97


Universidad Pontificia de Comillas - PFC

En un proceso análogo se importan los datos de


producciones. Con el fin de conocer el número de parques, es decir,
de hojas en el archivo Excel, se utiliza en primer lugar la función
xlsinfo. Posteriormente se crea un objeto tipo “cell” en el que cada
campo corresponde a una matriz de producciones, y un objeto del
mismo tipo para los vectores de fechas correspondientes. Los campos
de dichos objetos son rellenados usando la función xlsread en un
bucle “for”. También se eliminan las cabeceras de los mismos. Otra
operación que se realiza en el bucle es pasar todos los datos de
producciones de energía a UTM. Para ello se utiliza la función
CalculaEstacion, que devuelve un 0 si es horario de verano o un uno
si lo es de invierno:

H ?;óD * A?@A H ?;=D ?I ;

Esto permite tener todos los datos en horario universal.

Por último, se guarda todo en la ruta designada mediante el


comando “save”.

leerRadiaciones

J' K; ?;=DH, L?I HM AE' K; ?;=DH ?I 1, ? E< 

Esta función se encarga de realizar la importación de las


radiaciones, que, por estar en archivos .dat individuales, son más
complicadas de leer.

Los argumentos son la primera fecha de la que se disponen


datos de radiación solar, y la dirección de la carpeta en la que se
guardan los archivos de las radiaciones.

Para realizar la lectura se utiliza la función de Matlab


importdata. Para crear la ruta de cada archivo .dat se utilizar

Carlos Entrena Moratiel 98


Universidad Pontificia de Comillas - PFC

ComponerFecha, una función que al darle una fecha, devuelve una


cadena de caracteres con la fecha preparada en el formato del
nombre del archivo .dat:

L?I D =E2 = *=2<=DEL?I  ?I sin =E2 =;

La salida es una matriz de radiaciones, con las previsiones a


D+1 y D+0 (por si acaso se fuesen a incorporar al modelo de
previsión), ya preparadas para ser incorporadas a la matriz de
entradas, y una estructura de fechas para identificar las
correspondientes radiaciones. A continuación se presenta el bucle en
el cual se realiza la operación.

CrearEstructuraVariables

HE@?@E Q E; AH *E EHE@?@E Q E; AH  ;

Esta función crea y devuelve un vector de estructuras en el


que están todas las variables necesarias para definir la RN, con el
número de neuronas, las entradas de la red, etc. Cada variable está
guardada en un elemento del vector, que es una estructura con
nombre y valor, que puede ser “true” o “false”:

Carlos Entrena Moratiel 99


Universidad Pontificia de Comillas - PFC

A continuación se van a definir brevemente las variables del


modelo. En primer lugar las variables de visualización:

- EnsenarEntrenamiento: abre una ventana en la que se


puede seguir el entrenamiento de la RN.
- EnsenarPrediccionFinal: abre una ventana con la
predicción final de la RN durante los días de
entrenamiento, junto a las salidas verdaderas.
- EnsenarPrueba: enseña la predicción de la RN para los
días de prueba junto a las realidades de ese día.
- MostrarWB: abre una ventana con los pesos y bias de la
RN ya entrenada. Sirve para identificar posibles
relaciones entre las entradas de la RN.

En segundo lugar, las opciones en cuanto a las entradas de la


RN:

- coruna, madrid, vigo, cReal, leon: son las variables en


las que se seleccionan las regiones cuyas entradas de
radiación, temperatura, y nubosidad serán utilizadas. En
el modelo final son 1 madrid y cReal.
- Tmax: selecciona si se incorporarán los datos de
temperatura máxima. En el modelo final se utilizan estos
datos.
- P10: selecciona si se incorporarán los datos de radiación
solar a percentil 10. Estos datos no se usan en el modelo
final para el caso analizado.
- nub: selecciona si se incorporarán los datos de
nubosidad. En el modelo final, se usan estos datos.

Carlos Entrena Moratiel 100


Universidad Pontificia de Comillas - PFC

- P90: selecciona si se incorporarán los datos de radiación


solar a percentil 90. Se necesita depurar el código
relacionado con esta variable.
- Tmin: selecciona si se incorporarán los datos de
temperatura mínima. Se necesita depurar el código
relacionado con esta variable.
- Horizonte0: selecciona si se incorporarán los datos de
radiación solar con horizonte de predicción a D+0. Se
necesita depurar el código relacionado con esta variable.

En tercer lugar, las variables relacionadas con la creación y


configuración de la Red Neuronal:

- BR: si es 1, se utiliza el entrenamiento de Regularización


bayesiana, fuertemente recomendado. Si es 0, se utilizará
el algoritmo Levenberg-Marquadt.
- max_fail: configura el número de épocas que se pasa el
entrenamiento una vez comienza a subir el error de
validación, con el fin de detectar los mínimos locales. Se
recomienda un valor de 15, más o menos.
- epocas: corresponde al valor máximo de épocas que se
entrenará a la RN.
- Separadas: en caso de querer crear dos RNs, una diaria y
otra horaria. Esta variable necesita depuración.
- N11, N12, N21, N22: son los números de neurona por
capa. Los valores 11 y 12 corresponden a las capas de
entrada y oculta de la primera subred. Se recomienda
poner 10 y 1, respectivamente. Los valores 21 y 22
corresponden a las capas de entrada y oculta de la
segunda subred, es decir, la subred horaria. Se
recomienda poner 15 y 13, respectivamente.
- Fcapas: la función de las capas de entrada y oculta de las
dos subredes. Se recomienda utilizar la función tansig.
- Fout: la función de las capas de salida de las dos
subredes. Se recomienda utilizar la función logsig.

Estas variables definen el modelo de RN utilizado. Por


supuesto se pueden incorporar otros nuevos según las necesidades.

Carlos Entrena Moratiel 101


Universidad Pontificia de Comillas - PFC

Algunas de las variables han sido incorporadas pero no probadas lo


suficiente, por tanto habría que depurar el código relacionado con las
mismas.

PrevisionParques

J8ER;H;óD, EE=EH8E@ , EE=EH'KM


8ER;H;=D8 ES@HE@ F H/ =H, HE@?@E K R E; AH, /; 8E@ ;

La función PrevisionParques se encarga de lanzar una


previsión o una prueba del modelo de previsión. Para ello, sus
argumentos de entrada son: la ruta de la base de datos creada con
ActualizarBBDD, la estructura de variables creada con CrearEV, y
una fecha introducida en el “script” de SOLAR.m que será la fecha a
partir de la cual se realizará la prueba. Si no se desea realizar una
prueba, es decir, para realizar una previsión normal, se pondrá 0 en
vez de una fecha.

En primer lugar incorpora un algoritmo para detectar qué


entrenamientos y previsiones se pueden hacer. Los entrenamientos
posibles son los días de los cuales se tienen tanto las entradas
climáticas como las salidas de producción de energía. Las previsiones
posibles son los días para los cuales se tienen sólo las entradas
climáticas. Si hay una fecha para lanzar una prueba, se considerará
que el conjunto de entrenamiento sólo llega hasta ese día, y
posteriormente se computa el error entre la previsión de la red para
los días de prueba y las verdaderas producciones en esos días. Por
tanto hay tres casos posibles:

- Se puede hacer una previsión de verdad, por no tener


días de producción pero sí de entradas climáticas.
(condicion=0)
- Se puede hacer una previsión a partir del día de la
prueba y hasta el día del que se dispongan realidades y
entradas climáticas. (condicion=1)
- Sólo se puede entrenar a la RN y computar el error que
realiza en los días de entrenamiento y validación.
(condicion=2)

Carlos Entrena Moratiel 102


Universidad Pontificia de Comillas - PFC

En segundo lugar se ejecuta un algoritmo que crea los


conjuntos de entrenamiento (entradas y salidas de la RN) y previsión
(sólo entradas si es una verdadera previsión, entradas y salidas si es
una prueba). Además, se eliminan las salidas horarias que sean
menores que el 1% de la media de producción durante un día:

∑U#$ ∑
T
9$ )#9
K; /; E;
V
Ec. 15- media de producción durante un día

Siendo Z el número de días de los que se tienen producciones


y )#9 la producción en un día i a la hora j. Así, el mínimo requerido
para que una hora j del día se contabilice como de producción
efectiva será:
U

 )#9 W 0.01 · K; /; E;


#$

Ec. 16- condición que debe cumplir una franja horaria para ser
incorporada al modelo

Normalmente esta condición dejará las horas productivas en


13. Una vez realizadas estas operaciones, se llama a la función
RedSolar. La función PrevisionParques devuelve tres elementos:

- Una estructura con la previsión diaria y horaria en


energía para los días correspondientes, ya sean de
previsión o de prueba.
- Una estructura con los errores de la red.
- Una estructura con los errores de la prueba, en caso de
haberse realizado una.

Las dos primeras estructuras son devueltas directamente por


la función RedSolar. La estructura con los errores de la prueba es
creada mediante la salida de RedSolar “previsión” y la matriz de
salidas creada para la prueba, en caso de realizarse.

RedSolar

J8ER;H;=D, EE=EH'K, 'KM 'K=A EY8Z[ , 8\]Z^ , :\]Z^ , LZ[ , Q_;

Carlos Entrena Moratiel 103


Universidad Pontificia de Comillas - PFC

La función RedSolar se encarga de crear una RN según el


modelo estudiado y una serie de variables, entrenarla, y devolver los
resultados.

Las variables de entrada de esta función son 5: los conjuntos


de entrada para el entrenamiento y la previsión (8Z[ y 8\]Z^ ); el
conjunto de salida para el entrenamiento (:Z[ ); un vector con las
fechas en las que se produce el entrenamiento (LZ[ ); y la estructura
de variables EV.

En primer lugar se preparan las matrices de entrada y salida,


uniendo los conjuntos de entrada de entrenamiento y previsión para
simplificar la normalización y la selección de variables. También se
crean dos conjuntos de salida para el entrenamiento, uno diario y
otro horario:

En segundo lugar se efectúa la lectura de las variables de la


estructura de variables. Para ello se usa la función “evalc” de Matlab,
que analiza expresiones, en este caso la igualdad entre el nombre de
la variable EV(i).N y su valor EV(i).V:

En tercer lugar se eliminan los días (entradas y salidas) en los


que la producción total haya sido nula. La finalidad de esta operación
es evitar meter información errónea a la red, ya que si no hay
producción en absoluto es que se dieron problemas técnicos o
reparaciones, y esto no tiene relación con las entradas climáticas.
Esto es útil en caso de efectuar la previsión de un solo parque, puesto
que si se tuviese más de uno, sería difícil que coincidiesen los días de

Carlos Entrena Moratiel 104


Universidad Pontificia de Comillas - PFC

reparación o problemas técnicos. Por tanto se espera que los errores


se anulen, o se conviertan en despreciables gracias a la gran cantidad
de parques.

La siguiente operación es la selección de variables, es decir la


creación de una matriz de entradas acorde con las variables que se
quiera seleccionar. Para ello, y usando como condiciones las variables
“true” y “false” leídas en el segundo paso, se van efectuando
operaciones de selección en la matriz de entradas hasta obtener una
matriz adecuada.

En quinto lugar se normalizan las entradas y las salidas de la


red. Como se vio en el Capítulo IV, se ha optado por dividir cada
variable de entrada por su máximo durante todos los días. De la
misma forma, las salidas horarias y la salida diaria son divididas por
su máximo durante todo el período. Los valores de normalización se
guardan en vectores para posteriormente desnormalizar los datos.

A continuación se efectúa la selección de conjuntos de


entrenamiento y previsión. Se toman días intercalados para la
validación, es decir, no se reserva un periodo especial al final o al
principio. Esto podría realizarse de tener muchos archivos históricos.
Para esto se toman 4 días de cada 5 y se usan para el entrenamiento
de la RN, y el último día de cada serie de 5 es para la validación:

El siguiente paso es crear la RN y entrenarla, usando las


variables de la EV y los conjuntos de entrenamiento y validación.
Como el modelo de RN es complejo, e incluye una retroalimentación,
en vez de usar modelos predefinidos de RNs se ha optado por crear
una RN desde 0. Para ello hay que seguir una serie de pasos:

- Creación del objeto RN, especificando el número de


capas, el número de matrices de entrada, las conexiones
de las capas entre sí y con las entradas y salidas, y
activación de los bias:

Carlos Entrena Moratiel 105


Universidad Pontificia de Comillas - PFC

- Dar a la RN la información del rango y el tamaño de los


inputs
- Preparación e inicialización de las capas, especificando el
número de neuronas por capa y la función de
transferencia de cada capa.
- Especificación de las funciones de inicialización, cómputo
de error y entrenamiento de la RN:

- Especificación de otros parámetros de la RN como las


épocas de entrenamiento, el maxFail y la visualización del
entrenamiento.
- Por último, la inicialización de la RN.

Una vez creada la RN, y con todos los conjuntos de entrada y


salida y de entrenamiento y validación preparados, sólo queda
entrenar la red y devolver los resultados a la función
PrevisionParques. El entrenamiento de la RN se efectúa mediante la
función “train”, que devuelve el objeto RN ya entrenada, una
estructura con los datos del entrenamiento y una “cell” con los datos
de la última previsión realizada para los días de entrenamiento:

Carlos Entrena Moratiel 106


Universidad Pontificia de Comillas - PFC

Una vez entrenada la RN queda calcular la salida para las


entradas de previsión, y separarlos en una previsión diaria y otra
horaria.

Por último, desnormalizamos la previsión, multiplicando por


los valores correspondientes, y se devuelven a la función
PrevisionParques los valores correspondientes:

- La previsión en forma de estructura con un campo para


el vector de la previsión diaria y otro para la matriz de la
previsión horaria
- Los errores de la red, que son uno de los campos de la
estructura “tr” obtenida del entrenamiento.
- La RN.

Carlos Entrena Moratiel 107


Universidad Pontificia de Comillas - PFC

VI. CONCLUSIONES

1. CONCLUSIONES AL MODELO
DE PREVISIÓN

Con el modelo final se ha llegado a una Media de Error


Horario en Energía del 12,72% y una Media de Error Real Horario del
26,67 %. Asimismo, se ha obtenido, con la Red Neuronal Diaria
totalmente optimizada un Error Real del 16,37% y un Error en
Energía del 8,71%. Estos resultados parecen satisfactorios para una
primera aproximación, y se puede suponer viable la implantación de
un sistema de predicción de energía solar fotovoltaica producida
utilizando técnicas de Redes Neuronales.

MERH 26,67
Red diaria-horaria
MEEH 12,72
Los resultados son especialmente positivos si se comparan
con la herramienta de previsión del ministerio, cuyas predicciones
tienen un error del 74,35%, en comparación con el 26,67% del
modelo. Se pueden realizar mejoras del modelo a medida que se
disponga de más información y de más parques de prueba, y sobre
todo, de más históricos.

En cualquier caso, la previsión horaria de la energía solar


fotovoltaica vertida en la red usando técnicas de redes neuronales
parece viable.

Carlos Entrena Moratiel 108


Universidad Pontificia de Comillas - PFC

2. CONCLUSIONES AL
PROTOTIPO DE HERRAMIENTA
DE PREVISIÓN

Una vez la función PrevisionParques ha devuelto la previsión,


los errores de la red y los errores de la prueba, sólo queda definir una
forma de guardar estos resultados de forma organizada. Dicho
formato estará determinado por las necesidades del usuario de cada
herramienta, y por tanto se deja abierto.

El resto del proceso para lanzar previsiones queda así


definido según el objetivo propuesto. El prototipo de herramienta ha
sido desarrollado de manera satisfactoria.

El prototipo se puede implementar para la realización de


predicciones rápidamente; sólo requiere: Matlab, Neural Network
Toolbox, Microsoft Excel y un sistema de envío y almacenamiento de
predicciones climáticas, e históricos de producción.

Carlos Entrena Moratiel 109


Universidad Pontificia de Comillas - PFC

3. FUTURAS LÍNEAS DE
INVESTIGACIÓN

Se han detectado posibles mejoras que se podrían realizar o


estudiar en el modelo de previsión de energía solar fotovoltaica con
redes neuronales, por ejemplo:

- Añadir nuevas variables climáticas, como velocidad de


viento u horas de luz al día. Esta última puede ser una
variable calculada según el día del año con un algoritmo
sencillo, y podría proporcionar a la Red una información
valiosa a la hora de calcular las producciones en las
horas más tempranas y tardías.
- Probar arquitecturas de Red con decalajes temporales,
con redes como NARX. Esto podría permitir establecer
correlaciones entre los datos climáticos de los días
anteriores y el día de previsión. En este estudio se ha
supuesto, con el fin de simplificar la optimización del
modelo, que esta información estaba incluida en los
propios modelos climáticos de los proveedores; sin
embargo, no hay que descartar que aún queden
relaciones por aprovechar en ese ámbito. Además, las
Redes Neuronales parecen tener una capacidad adecuada
para incluir esta nueva información y mejorar así la
precisión de las predicciones.
- Aumentar el volumen de históricos es posiblemente la
forma más sencilla de mejorar los resultados del modelo.
Cuantos más datos de entrenamiento y validación, mayor
“memoria” y mejor capacidad de generalización. Esta
forma de mejorar el modelo depende del estado de la
energía fotovoltaica, y de la instalación de telemedidas
para adquisición de datos en los parques que queramos
incorporar al modelo.

Carlos Entrena Moratiel 110


Universidad Pontificia de Comillas - PFC

- Asimismo, aumentar el número de parques considerados


en el modelo puede ser una forma útil de mejorarlo, pues
esto implicaría que los errores o los comportamientos
climáticos imprevisibles se equilibrarían, cometiendo así
un menor error global.

Es importante destacar también que el modelo puede ser


ampliado fácilmente a previsiones con horizonte de dos días o más, o
incluso de pocas horas, según se disponga de datos actualizados.
Esto permitiría una mayor optimización de los recursos de cara a la
compra-venta en el Mercado Eléctrico Ibérico.

En cuanto a los posibles desarrollos posteriores del prototipo


de herramienta de previsión, se han detectado una serie de líneas
interesantes a seguir.

En primer lugar, la lógica y los algoritmos utilizados son


totalmente arbitrarios según lo que pareció más adecuado en cada
momento y vistas las intenciones iniciales. Una mejora sustancial de
la herramienta podría venir de una mejor adaptación entre los
formatos utilizados y los objetivos de la misma. Por ejemplo se podría
mejorar la base de datos, la forma de seleccionar las variables, el
encadenamiento de las funciones, las opciones de visualización, etc.
Una optimización de la lógica supondría una mejora global
importante, a pesar de que la herramienta realiza su tarea de manera
correcta.

En segundo lugar, las variables que se han introducido y que


no estaban en el Capítulo III, como el percentil 90, los datos a
horizonte D+0 o la temperatura mínima requieren una revisión
completa. No ha dado tiempo a revisar de manera adecuada las
funciones que incluyen estas nuevas variables, ni si existen errores
en el código. En el caso de los datos a horizonte D+0, ni siquiera se
ha implementado su uso. Sería importante cambiar esto para obtener
una herramienta de previsión más completa.

En tercer lugar, existe un problema con las fechas en algunas


versiones de Matlab. La función “datenum” devuelve un valor cuya
precisión es indiferente a la función “datestr” con el formato de fechas

Carlos Entrena Moratiel 111


Universidad Pontificia de Comillas - PFC

utilizado. Así, en algunas transformaciones de fechas de cadena de


caracteres a número universal se dan problemas, como que números
distintos correspondan a la misma fecha. Es necesario revisar esto,
ya sea asegurándose que no habrá problemas de precisión o
cambiando el formato de las fechas a uno que Matlab reconozca
automáticamente (como “mm/dd/aaaa”).

Por último, en cuanto a la cuestión de los parques que no


funcionan algún día por motivos de fallo técnico o mantenimiento, es
importante resaltar que un sistema de detección de dichos fallos (que
por fuerza debería ser incorporado antes de la suma de todos los
valores día a día y hora a hora durante la actualización de la base de
datos) sería bueno en el caso de incorporar un modelo más complejo.
Este modelo más complejo podría ser, por ejemplo, la extrapolación
de cálculos de unos parques a otros, mediante cálculos sencillos de
potencia instalada. Esto permitiría, por ejemplo, utilizar los parques
de los que se tienen más históricos para hacer previsiones de nuevos
parques que se irían sumando al modelo. Esta opción de cara a una
mejora total parece la mejor, aunque supondría una pérdida de
información de cara a las previsiones individuales de parques.

Carlos Entrena Moratiel 112


Universidad Pontificia de Comillas - PFC

BIBLIOGRAFÍA

ASIF. (2007). Historia de la Energía Solar Fotovoltaica.

Blázquez García, M. I. (2003). Modelos de previsión de


generación de energía eólica basados en Redes Neuronales. Madrid.

Canseco, J. (2006). Proyecto Fin de Carrera. Madrid.

Centro de Estudios de la Energía Solar (CENSOLAR). (2007).


Distribución horaria de la irradiación solar global incidente sobre
superficie horizontal en las cinco zonas climáticas definidas en el
Código Técnico de la edificación de España.

Comisión Nacional de la Energía. (2008). Información básica


de los sectores de la energía -2008-. Madrid.

Comisión Nacional de la Energía. (2008). Informe marco sobre


la demanda de energía eléctrica y gas natural, y su cobertura. Año
2008. Madrid.

Comisión Nacional de la Energía. (2009). Informe mensual de


ventas de energía del Régimen Especial - abril 2009. Madrid.

Demuth, H., Beale, M., & Hagan, M. (2008). Neural Network


Toolbox™ 6 - User's guide.

ETSI Minas. (2004). Redes neuronales y aplicaciones. Madrid.

EuroObserv'ER. (2008). Barómetro Fotovoltaico- abril 2008.


Estrasburgo.

Gilat, A. Matlab: una introducción con ejemplos prácticos. Ed.


Reverte.

Carlos Entrena Moratiel 113


Universidad Pontificia de Comillas - PFC

IIT. (2005). Renovables 2050 - Un informe sobre el potencial de


las energías renovables en la España peninsular. Madrid.

Ministerio de Industria, Turismo y Comercio. (2005). Plan de


Energías Renovables 2005-2010. Madrid.

Ministerio de Industria, Turismo y Comercio. (2008). Real


Decreto 1578/2008, de 26 de septiembre. Madrid: Boletín Oficial del
Estado.

Ministerio de Industria, Turismo y Comercio. (2004). Real


Decreto 436/2004, de 12 de marzo. Madrid: Boletín Oficial del
Estado.

Ministerio de Industria, Turismo y Comercio. (2007). Real


Decreto 661/2007, de 25 de mayo. Madrid: Boletín Oficial del Estado.

OMEL. (2009). Evolución del mercado de producción de


energía eléctrica- febrero 2009. Madrid.

Carlos Entrena Moratiel 114


Universidad Pontificia de Comillas - PFC

PARTE II –
ESTUDIO
ECONÓMICO

Carlos Entrena Moratiel 115


Universidad Pontificia de Comillas - PFC

I. ESTUDIO ECONÓMICO

Para realizar este proyecto una de las motivaciones


principales ha sido el ahorro de los costes de desvío para las
empresas distribuidoras.

En este marco, la viabilidad económica de implementar una


herramienta como la presentada es clara, pues no se requiere más
que el coste de la programación y las herramientas informáticas: un
PC, software bajo licencia y una conexión de datos para las entradas
climáticas.

En cuanto a la rentabilidad, se puede medir mediante la


precisión de los dos métodos que se plantea utilizar:

- La herramienta de factores multiplicativos proporcionada


en el RD 661/2007, que podemos aproximar como un
error medio de 74,35% cada hora de producción (valor
que corresponde a la Media de Error Real Horario para
las pruebas realizadas y expuestas en el punto 6 del
Capítulo IV).
- La herramienta diseñada mediante las técnicas de Redes
Neuronales y previsiones climáticas, que podemos
aproximar con un error del 26,67% según los Resultados,
Punto 7 del Capítulo IV de este mismo documento.

Como ejemplo de trabajo se va a tomar la producción de un


parque solar fotovoltaico de 10MW, con 1750 horas equivalentes de
funcionamiento al año (es decir, que la energía que genera durante
un año es igual a 1750 horas generando con una potencia de 10MW).

El coste medio del desvío según el Informe Mensual de los


servicios de ajuste del sistema, publicado por REE en febrero de 2009

Carlos Entrena Moratiel 116


Universidad Pontificia de Comillas - PFC

es de 37,34€/MWh, en precio medio ponderado tanto para los desvíos


a subir como a bajar. El precio medio del KWh durante el mismo mes
es, según el OMEL, de 40,71€/MWh. El coste del desvío es por tanto:

*=H/HRí= 40,71  37,34 3,37€/1I

Se obtiene como coste total anual de los desvíos:

*=H := A *=H/HRí= · 1750I · 101 58.975€

Este coste hay que multiplicarlo por la precisión del sistema


de previsión. Es decir, con un error del 74,35% se pagarán 43.848€, y
con un error del 26,67% se pagará 15.728€.

El ahorro anual que supone la herramienta creada para


dicho parque de 10MW es de 28.120€. El coste de implementación de
este proyecto, según lo calculado en el Documento II - Presupuesto,
no será superior a los 16.189€, determinados por el coste de
programación y el del Software (Matlab y Microsoft Office), si se
considera que se va a adquirir al efecto. El interés económico del
proyecto y su rentabilidad son, por tanto, relativamente grandes.

Carlos Entrena Moratiel 117


Universidad Pontificia de Comillas - PFC

PARTE III –
CÓDIGO
FUENTE

Carlos Entrena Moratiel 118


C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 1/13

% Prueba de la Red, con múltiples combinaciones de variables de


% entrada y numero de neuronas, llamando a la funcion RNToledo
(estructura_variables) a través
% de distintos tipos de iteración.
% También incluye un modo de prueba
% individual para 3 funciones: RNToledo, RedHoraria y DosRedes.
% Las estructuras finales son ResultadosVar (iteración de
variables de
% entrada), ResN (iteración de número de neuronas de entrada y
% oculta), ResInd(para una prueba individual), ResHor y Res2R.

%
===============================================================
===========
% OPCIONES
%
===============================================================
===========

iteraciones = 1; %numero de pasadas por cada


red del mismo tipo
iterarVariables = false; %Itera según las diferentes
combinaciones de variables de entrada
iterarNeuronas = false; %Itera segun el numero de
neuronas de entrada y ocultas.
pruebaRNToledo = false; %Itera un solo modelo de red,
cuyas caracteristicas se definen más abajo.
pruebaHoraria = false; %prueba de un tipo de red
usando la función RedHoraria.
pruebaDosRedes = true; %prueba para un tipo de red
usando la función DosRedes

%Comparar perfiles del BOE con Resultados de algún tipo de red.


compararPerfiles = false;
conHorario = false;
con2redes = true;

%primer dia de prediccion de radiacion


dia1 = '16-Jul-2007';

%
===============================================================
===========
% ESTRUCTURA DE VARIABLES GLOBAL--------> OPCIONES DE REDES
%
===============================================================
===========

conHorario=conHorario&compararPerfiles;
con2redes=con2redes&compararPerfiles;

119
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 2/13

%Creamos una primera estructura de variables válida para


PruebaInd,
%PruebaHoraria y PruebaDosRedes

%opciones de visualización. Para procesos iterativos se


recomienda
%desactivar todo.
EV(1).N = 'ensenarEntrenamiento';
EV(1).V = 'true';
EV(2).N = 'ensenarPrediccionFinal';
EV(2).V = 'true';
EV(3).N = 'ensenarPrueba';
EV(3).V = 'false';
EV(4).N = 'mostrarWB' ;
EV(4).V = 'false';

%opciones de variables
EV(5).N = 'coruna' ;
EV(5).V = '0' ;
EV(6).N = 'madrid' ;
EV(6).V = '1' ;
EV(7).N = 'vigo';
EV(7).V = '0' ;
EV(8).N = 'cReal';
EV(8).V = '1' ;
EV(9).N = 'leon';
EV(9).V = '0' ;
EV(10).N = 'TemperaturaMaxima' ;
EV(10).V = '1' ;
EV(11).N = 'P10';
EV(11).V = '0' ;
EV(12).N = 'nub';
EV(12).V = '1' ;

%Opciones de red. En prueba de RNToledo se aconseja aumentar el


max_fail a
%35
EV(13).N = 'BR';
EV(13).V = 'true';
EV(14).N = 'max_fail' ;
EV(14).V = '12';
EV(15).N = 'epocas' ;
EV(15).V = '300';

%opciones de conjuntos de validación y prueba. Por defecto, 70


val y 70
%test. diasPrueba y diasValidacion solo funciona si
pruebaDiasFinales. Si
%no, los conjuntos son automáticos.

120
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 3/13

EV(16).N = 'pruebaDiasFinales' ;
EV(16).V = 'false';
EV(17).N = 'pruebaDias35pruebas';
EV(17).V = 'true';
EV(18).N = 'diasPrueba';
EV(18).V = '25';
EV(19).N = 'diasValidacion';
EV(19).V = '10';

%tipo de normalización, si true, se divide cada entrada o


salida por su
%máximo
EV(20).N = 'normalizacionTipica';
EV(20).V = 'true';

%opciones para mostrar las pruebas horarias


EV(21).N = 'dia1';
EV(21).V = '25';
EV(22).N = 'dia2';
EV(22).V = '40';

%Subestructuras de variables para cada funcion

%Prueba individual
if pruebaRNToledo
EV(23).N = 'neuronasEntrada' ;
EV(23).V = '10' ;
EV(24).N = 'neuronasOculta' ;
EV(24).V = '1' ;
EV(25).N = 'neuronasCapa3' ;
EV(25).V = '0' ;
EV(26).N = 'funcionEntrada' ;
EV(26).V = '''tansig''' ;
EV(27).N = 'funcionOculta' ;
EV(27).V = '''tansig''' ;
EV(28).N = 'funcion3' ;
EV(28).V = '''tansig''' ;
EV(29).N = 'funcionSalida' ;
EV(29).V = '''logsig''' ;
elseif pruebaHoraria || conHorario
EV(23).N = 'N11' ; %Capa1, primera subred
EV(23).V = '8' ;
EV(24).N = 'N12' ; %Capa2, primera subred
EV(24).V = '3' ;
EV(25).N = 'N21' ; %Capa1, segunda subred
EV(25).V = '13' ;
EV(26).N = 'N22' ; %Capa2, segunda subred
EV(26).V = '13' ;
EV(27).N = 'F2out' ; %Funcion de salida
EV(27).V = '''logsig''' ;

121
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 4/13

EV(28).N = 'entradasRed2' ; %mete las variables en


la segunda parte de la red
EV(28).V = 'true' ;
EV(29).N = 'entradasNubes' ; %solo cuando se usa C.
Real y Madrid, mete las nubosidades
EV(29).V = 'false' ;
EV(30).N = 'retroAlimentacion' ; %Abre la conexion que
retroalimenta con la produccion diaria
EV(30).V = 'true' ;
EV(31).N = 'entradasP50' ; %como entradasNubes,
pero solo mete las P50.
EV(31).V = 'false' ;
elseif pruebaDosRedes || con2redes
EV(23).N = 'N11' ;
EV(23).V = '10' ;
EV(24).N = 'N12' ;
EV(24).V = '1' ;
EV(25).N = 'N21' ;
EV(25).V = '3' ;
EV(26).N = 'N22' ;
EV(26).V = '2' ;
EV(27).N = 'F2out' ;
EV(27).V = '''logsig''' ;

EV(28).N = 'entrenamientoReal' ; %Entrena con las


producciones horarias reales
EV(28).V = 'false' ;
EV(29).N = 'subRedes' ; %la segunda red esta
formada de subredes que se realimentan
EV(29).V = 'true' ;
EV(30).N = 'entradasSegundaRed' ; %A la 2a red se le
meten todas las entradas.
EV(30).V = 'true' ;
end

%
===============================================================
===========
% IMPORTAR DATOS
%
===============================================================
===========
%Importamos los datos ya preparados.
Entradas = textread('Entradas.dat');
Salidas20 = textread('Salidas20.dat');
Salidas1000 = textread('Salidas1000.dat' );
SalidasDiarias20 = sum(Salidas20,1);
SalidasDiarias1000 = sum(Salidas1000,1);

vecMeses = VectorMeses(Entradas,dia1);

122
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 5/13

%Eliminación de dias (entrada y salida) con produccion nula:


for i=1:size(Entradas,2)
if i>length(SalidasDiarias20)
break
end
if SalidasDiarias20(1,i) == 0 || SalidasDiarias1000(1,i) <
800
SalidasDiarias20(:,i)=[];
SalidasDiarias1000(:,i)=[];
Entradas(:,i)=[];
Salidas20(:,i)=[];
Salidas1000(:,i)=[];
vecMeses(:,i)=[];
i=i-1;
end
end

Salidas = SalidasDiarias20 + SalidasDiarias1000; %suma de


las salidas de los dos parques,
SalidaHoraria = Salidas20 + Salidas1000; %que es lo
que queremos predecir
diasTotales = size(Salidas,2);

%
===============================================================
===========
% ELIMINACIÓN DE SALIDAS HORARIAS NULAS
%
===============================================================
===========
x=[];
if compararPerfiles
condicion = 0;
else
condicion = 500;
end
for i=1:size(SalidaHoraria,1);
if sum(SalidaHoraria(i,:))<=condicion
x=[x i];
end
end
SalidaHoraria(x,:)=[];

%
===============================================================
===========
% ESTRUCTURA DE POSIBLES VARIACIONES
%
===============================================================

123
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 6/13

===========

%Creación de la estructura para iterar en IteracionVariables e


%IteracionNeuronas

EstructuraIter(1).N = 'coruna' ;
EstructuraIter(1).V = {'false', 'true'};
EstructuraIter(2).N = 'madrid' ;
EstructuraIter(2).V = {'false', 'true'};
EstructuraIter(3).N = 'vigo';
EstructuraIter(3).V = {'false', 'true'};
EstructuraIter(4).N = 'cReal';
EstructuraIter(4).V = {'false', 'true'};
EstructuraIter(5).N = 'leon';
EstructuraIter(5).V = {'false', 'true'};
EstructuraIter(6).N = 'P10';
EstructuraIter(6).V = {'false', 'true'};
EstructuraIter(7).N = 'TemperaturaMaxima' ;
EstructuraIter(7).V = {'false', 'true'};
EstructuraIter(8).N = 'nub';
EstructuraIter(8).V = {'false', 'true'};
EstructuraIter(9).N = 'diasValidacion' ;
EstructuraIter(9).V = {10,11,12,13,14,15,16,17,18,19,20};
EstructuraIter(10).N = 'neuronasEntrada' ;
EstructuraIter(10).V =
{5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25};
EstructuraIter(11).N ='neuronasOculta' ;
EstructuraIter(11).V = {0,1,2,3,4,5,6,7,8};

%
===============================================================
===========
% ITERACIÓN DE VARIABLES
%
===============================================================
===========

if iterarVariables

%inicializamos la estructura de Res


ResVar(1).variables = '' ;
ResVar(1).MSE = '' ;
ResVar(1).mediaError = '' ;
ResVar(1).net = '' ;
ResVar(1).prediccion = [];
ResVar(1).test = [];
casoEspecial = 'false';

%inicio de la iteración. Si es ProbarRedVariables2, estamos

124
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 7/13

probando
%solo con cada ciudad por separado.
if casoEspecial
ResVar = ProbarRedVariables2(EstructuraIter,
iteraciones,Entradas,Salidas);
else
ResVar = ProbarRedVariables(EstructuraIter,iteraciones,
Entradas,Salidas);
end

%
===============================================================
===========
% SALVAR LA ESTRUCTURA DE RESULTADOS
%
===============================================================
===========

save('ResIteracionVariables6' ,'ResVar' );

%
===============================================================
===========
% UTILIZACIÓN DE LOS RESULTADOS
%
===============================================================
=======

%Utilizacion de una funcion que da los vectores con la


media de los
%errores, la mediana y la desviacion tipica para cada tipo
de red.

[vectorMediaErrores,vectorMedianas,vectorDesviaciones,
vectorMSE] = EstadisticasPrueba(ResVar,iteraciones);

%Calculo de la minima media de errores


min_error = min(vectorMediaErrores)
min_desv = min(vectorDesviaciones);
min_mediana = vectorMedianas(i);

end

%
===============================================================
===========
% ITERACIÓN DE NEURONAS
%

125
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 8/13

===============================================================
===========

if iterarNeuronas

%opciones de la red que queremos iterar. Para cambios más


profundos,
%usar ProbarRedNeuronas
coruna='false';
madrid='true';
vigo='false' ;
cReal='true' ;
leon='false' ;
P10= 'false';
Tmax='true' ;
nub = 'true' ;

ResNeuronas = ProbarRedNeuronas(EstructuraIter,coruna,
madrid,vigo,cReal,leon,P10,Tmax,nub,iteraciones,...
Entradas,Salidas);

%
===============================================================
===========
% SALVAR LA ESTRUCTURA DE RESULTADOS
%
===============================================================
===========

save('ResIteracionNeuronas2' , 'ResNeuronas');

%
===============================================================
===========
% UTILIZACIÓN DE LOS RESULTADOS
%
===============================================================
=======
%Utilizacion de una funcion que da los vectores con la
media de los
%errores, la mediana y la desviacion tipica para cada tipo
de red, es
%decir, para cada grupo de iteraciones iguales.

[vectorMediaErroresN,vectorMedianasN,vectorDesviacionesN,
vectorMSEN] = EstadisticasPrueba(ResNeuronas,iteraciones);

%Calculo de la minima media de errores

min_errorN = min(vectorMediaErroresN)

126
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 9/13

min_desvN = min(vectorDesviacionesN)
min_medianasN = min(vectorMedianasN)

end

%
===============================================================
===========
% PRUEBA INDIVIDUAL
%
===============================================================
===========

if pruebaRNToledo

%Inicializar la estructura de Res


ResInd(1).variables = '' ;
ResInd(1).MSE = '' ;
ResInd(1).mediaError = '' ;
ResInd(1).net = '' ;
ResInd(1).prediccion = [];
ResInd(1).test = [];

%Llamada a la función
for i=1:iteraciones
[ResInd(i).MSE , ResInd(i).mediaError, ResInd(i).net,
ResInd(i).prediccion,...
ResInd(i).prueba] = RNToledo(EV,Entradas,Salidas);
end
mediaErroresI = [];
medianasI = [];
desviacionesI = [];
MSEI = [];

[mediaErroresI,medianasI,desviacionesI,MSEI] =
EstadisticasPrueba(ResInd,iteraciones)

%Calculamos la media del Error.


vecErrores = zeros(1,iteraciones);
for i=1:iteraciones
vecErrores(i) = ResInd(i).mediaError;
end

min_error = min(vecErrores)
indice = find(vecErrores==min(vecErrores));
figure

127
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 10/13

plot(ResInd(indice).prueba.real)
hold on ;
plot(ResInd(indice).prueba.pred,'g' )

e=ResInd(indice).prueba.real-ResInd(indice).prueba.pred;

end

%
===============================================================
===========
% PRUEBA HORARIA
%
===============================================================
===========

if pruebaHoraria

%Inicializar la estructura de Res


ResHor(1).errores = struct;
ResHor(1).net = '' ;
ResHor(1).prediccion = struct;
ResHor(1).test = struct;

%Llamada a la función
for i=1:iteraciones
[ResHor(i).errores, ResHor(i).net, ResHor(i).prediccion,...
ResHor(i).prueba] = RedHoraria(EV,Entradas,Salidas,
SalidaHoraria);
end

if iteraciones==1
ResHor(1).errores
else
vector1=[];
vector2=[];
vector3=[];
for i=1:iteraciones
vector1(i)=ResHor(i).errores.mediaErrorHorario;
vector2(i)=ResHor(i).errores.
mediaErrorHorarioEnergia;
vector3(i)=ResHor(i).errores.tiempoDuracion;
end
ErrorHorarioEnergia = mean(vector2)
ErrorHorario =mean(vector1)
Tiempo = mean(vector3)
end

end

128
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 11/13

%
===============================================================
===========
% PRUEBA DOS REDES
%
===============================================================
===========

if pruebaDosRedes

%Inicializar la estructura de Res


Res2R(1).errores = struct;
Res2R(1).net = '' ;
Res2R(1).prediccion = struct;
Res2R(1).test = struct;

%Llamada a la función
for i=1:iteraciones
[Res2R(i).errores, Res2R(i).net, Res2R(i).prediccion,...
Res2R(i).prueba] = DosRedes(EV,Entradas,Salidas,
SalidaHoraria);
end

if iteraciones==1
Res2R(1).errores
else
vector1=[];
vector2=[];
vector3=[];
for i=1:iteraciones
vector1(i)=Res2R(i).errores.mediaErrorHorario;
vector2(i)=Res2R(i).errores.
mediaErrorHorarioEnergia;
vector3(i)=Res2R(i).errores.tiempoDuracion;
end
ErrorHorarioEnergia = mean(vector2)
ErrorHorario =mean(vector1)
Tiempo = mean(vector3)
end

end

%
===============================================================
===========
% COMPARAR PERFILES BOE CON RESULTADOS DE UNA RED
%
===============================================================
===========

129
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 12/13

if compararPerfiles

Potencia = 1020; %Potencia instalada en kw


CoeficientesZona4 = textread( 'CoeficientesBOE.dat');
MatrizCoef = CoeficientesZona4(:,2:25) * Potencia;

%inicializamos Res.
errores=struct;
net= '';
prediccion=struct;
prueba=struct;

%Eliminamos las horas que siempre son nulas.


vec=sum(MatrizCoef,1);
MatrizCoef = MatrizCoef(:,vec~=0);

%Vemos a qué mes pertenecen los dias de prueba:


iitst=[];
if strcmp(EV(16).V, 'true')
iitst = [diasTotales+1-str2double(EV(18).V) :
diasTotales];
elseif strcmp(EV(17).V, 'true' )
iitst = [2:10:diasTotales];
else
iitst = [2:5:diasTotales];
end
vecMeses =vecMeses(iitst);

%Calculamos la producción horaria para cada día de prueba:


pruebaCoef=[];
for i=1:size(vecMeses,2)
pruebaCoef(:,i) = MatrizCoef(vecMeses(i),:)';
end

%Usamos una función, DosRedes o PruebaHoraria, para hacer


una
%prediccion horaria:
if conHorario
[errores_red,net,prediccion,prueba] = RedHoraria(EV,
Entradas,Salidas,SalidaHoraria);
elseif con2redes
[errores_red,net,prediccion,prueba] = DosRedes(EV,
Entradas,Salidas,SalidaHoraria);
end

%Calculamos los errores:


%Primero las matrices y vectores de las producciones:
MatCoef = pruebaCoef;
MatRedHor=prueba.pred2;

130
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 13/13

MatReal=prueba.real2;
diariaReal = sum(MatReal,1);
diariaCoef=sum(MatCoef,1);
diariaRed1=prueba.pred1;
diariaRedHor=sum(MatRedHor,1);

%Errores horarios:
MatRealCoef = abs(MatCoef-MatReal);
MatRealRed = abs(MatRedHor-MatReal);
error.totalHorarioCoef = sum(sum(MatRealCoef))/sum(sum
(MatReal));
error.totalHorarioRedHor = sum(sum(MatRealRed))/sum(sum
(MatReal));
error.mediaHorariaCoef = mean(sum(MatRealCoef,1)./sum
(MatReal,1));
error.mediaHorariaRedHor = mean(sum(MatRealRed,1)./sum
(MatReal,1));

%Errores diarios:
error.totalDiarioCoef = sum(abs(diariaReal-diariaCoef))/sum
(diariaReal);
error.totalDiarioRed1 = sum(abs(diariaReal-diariaRed1))/sum
(diariaReal);
error.totalDiarioRedHor = sum(abs(diariaReal-diariaRedHor))
/sum(diariaReal);
error.mediaDiariaCoef = mean(abs(diariaReal-diariaCoef).
/diariaReal);
error.mediaDiariaRed1 = mean(abs(diariaReal-diariaRed1).
/diariaReal);
error.mediaDiariaRedHor = mean(abs(diariaReal-
diariaRedHor)./diariaReal);

%Calculamos el error para todas las predicciones de la red,


no solo la
%prueba:

error

end

131
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\VectorMeses.m 1/1

%Funcion que nos da el mes de cada día de predicción.


%Su variable de entrada es la matriz de entradas o de salidas,
da igual, y
%devuelve un vector del número de mes.

function vector = VectorMeses(Entradas,dia1_pred)

vector=[];
num = size(Entradas,2);
dia1 = dia1_pred;
fecha1 = datenum(dia1);

for i=0:(num-1)
vectorFecha = datevec(fecha1+i);
vector(i+1) = vectorFecha(2);
end

end

132
C:\Documents and Settings\Carlos\Escritorio\2008...\ProbarRedVariables.m 1/2

%Función a la que metemos la estructura de posibles variables a


iterar y
%que itera las 5 regiones y las otras dos variables, creando
redes con
%todas las combinaciones. Devuelve la estructura de Resultados.
Llama a la
%función RNToledo, que crea las redes y las prueba.

function Resultados = ProbarRedVariables(EstructuraIter,


iteraciones,Entradas,Salidas)

%Inicializamos la estructura de variables


EstructuraVariables(1).nombre = '';
EstructuraVariables(1).valor = '' ;

%Para no enseñar el entrenamiento


EstructuraVariables(8).nombre = 'ensenarEntrenamiento';
EstructuraVariables(8).valor = 'false';
EstructuraVariables(9).nombre ='BR';
EstructuraVariables(9).valor = 'true';
EstructuraVariables(10).nombre = 'diasValidacion' ;
EstructuraVariables(10).valor = '1';
EstructuraVariables(11).nombre = 'max_fail';
EstructuraVariables(11).valor = '45';
EstructuraVariables(12).nombre = 'ensenarPrueba';
EstructuraVariables(12).valor = 'false';
EstructuraVariables(13).nombre = 'epocas' ;
EstructuraVariables(13).valor = '300';
EstructuraVariables(14).nombre = 'pruebaDiasFinales';
EstructuraVariables(14).valor = 'false';
EstructuraVariables(15).nombre = 'pruebaDiasIntercalados';
EstructuraVariables(15).valor = 'true';
EstructuraVariables(16).nombre = 'diasPrueba';
EstructuraVariables(16).valor = '1';
EstructuraVariables(17).nombre = 'mostrarWB';
EstructuraVariables(17).valor = 'false';

%Inicializamos la estructura de resultados


Resultados(1).variables = '' ;
Resultados(1).net = '' ;
Resultados(1).MSE = 0;
Resultados(1).mediaError = 0;
Resultados(1).prediccion = [];
Resultados(1).test = [];

%bucle

133
C:\Documents and Settings\Carlos\Escritorio\2008...\ProbarRedVariables.m 2/2

k=1;

for cont=0:7
bin3variables = dec2bin(cont);
if numel(bin3variables)==1
bin3variables = ['0',bin3variables];
end
if numel(bin3variables)==2
bin3variables = ['0',bin3variables];
end
for i=1:31
bin5variables = dec2bin(i);
for l=1:(5-numel(bin5variables))
bin5variables = ['0' ,bin5variables];
end

vectorBin = [bin5variables,bin3variables];

for j=1:8
EstructuraVariables(j).nombre = EstructuraIter(j).
nombre;
EstructuraVariables(j).valor = vectorBin(j);
end
for x=1:iteraciones

[Resultados(k).MSE , Resultados(k).mediaError,
Resultados(k).net, Resultados(k).prediccion,...
Resultados(k).test] = RNToledo
(EstructuraVariables,Entradas,Salidas);
Resultados(k).variables = EstructuraVariables;

k=k+1;
end

disp
('-------------------------------------------------------------
-----------')
end
end

end

134
C:\Documents and Settings\Carlos\Escritorio\200...\ProbarRedVariables2.m 1/2

%Como ProbarRedVariables, pero con los casos de cada ciudad por


separado, y
%sin validacion, utilizando Bayesian Regularization.

function Resultados = ProbarRedVariables2(EstructuraIter,


iteraciones, Entradas, Salidas)

%Inicializamos la estructura de variables


EstructuraVariables(1).nombre = '';
EstructuraVariables(1).valor = '' ;

%Para no enseñar el entrenamiento


EstructuraVariables(8).nombre = 'ensenarEntrenamiento';
EstructuraVariables(8).valor = 'false';
EstructuraVariables(9).nombre ='BR';
EstructuraVariables(9).valor = 'true';
EstructuraVariables(10).nombre = 'diasValidacion' ;
EstructuraVariables(10).valor = '1';
EstructuraVariables(11).nombre = 'max_fail';
EstructuraVariables(11).valor = '45';
EstructuraVariables(12).nombre = 'ensenarPrueba';
EstructuraVariables(12).valor = 'false';
EstructuraVariables(13).nombre = 'epocas' ;
EstructuraVariables(13).valor = '300';
EstructuraVariables(14).nombre = 'pruebaDiasFinales';
EstructuraVariables(14).valor = 'false';
EstructuraVariables(15).nombre = 'pruebaDiasIntercalados';
EstructuraVariables(15).valor = 'true';
EstructuraVariables(16).nombre = 'diasPrueba';
EstructuraVariables(16).valor = '1';
EstructuraVariables(17).nombre = 'mostrarWB';
EstructuraVariables(17).valor = 'false';

%Inicializamos la estructura de resultados


Resultados(1).variables = '' ;
Resultados(1).net = '' ;
Resultados(1).MSE = 0;
Resultados(1).mediaError = 0;
Resultados(1).prediccion = [];
Resultados(1).test = [];

%Creamos los casos particulares de vector:

bin5variables = ['00001' ;'00010'; '00100'; '01000'; '10000'];

135
C:\Documents and Settings\Carlos\Escritorio\200...\ProbarRedVariables2.m 2/2

%modificacion: Madrid y C. Real


binCRM = '01010' ;

%bucle

k=1;

for cont=0:7

bin3variables = dec2bin(cont);
if numel(bin3variables)==1
bin3variables = ['0',bin3variables];
end
if numel(bin3variables)==2
bin3variables = ['0',bin3variables];
end

%for i=1:5

vectorBin = [binCRM,bin3variables];

for j=1:8
EstructuraVariables(j).nombre = EstructuraIter(j).
nombre;
EstructuraVariables(j).valor = vectorBin(j);
end

for x=1:iteraciones

[Resultados(k).MSE , Resultados(k).mediaError,
Resultados(k).net, Resultados(k).prediccion,...
Resultados(k).test] = RNToledo
(EstructuraVariables,Entradas,Salidas);
Resultados(k).variables = EstructuraVariables;

k=k+1;
end

disp
('-------------------------------------------------------------
-----------')
%end
end

136
C:\Documents and Settings\Carlos\Escritorio\2008-...\EstadisticasPrueba.m 1/1

%Cálculo de tres vectores con la media del error, la mediana y


la desviación típica en cada grupo de "iteraciones"
%redes iguales.

function [vectorMediaErrores, vectorMedianas,


vectorDesviaciones,vectorMSE] = EstadisticasPrueba(Resultados,
iteraciones)

vectorMediaErrores=[];
vectorErrores=[];
vectorMedianas=[];
vectorDesviaciones=[];
vectorMSE=[];
vMSE =[];
j=1;
k=1;

for i=1:size(Resultados,2)

vMSE(j)=Resultados(i).MSE;
vectorErrores(j)=Resultados(i).mediaError;
if j==iteraciones
vectorMSE(k)=mean(vMSE);
vectorMediaErrores(k) = mean(vectorErrores);
vectorMedianas(k) = median(vectorErrores);
vectorDesviaciones(k) = std(vectorErrores);
k=k+1;
vectorErrores=[];
vMSE=[];
j=0;
end
j=j+1;
end

end

137
C:\Documents and Settings\Carlos\Escritorio\200...\ProbarRedNeuronas.m 1/2

%Función que itera redes con distintos numeros de neuronas para


encontrar
%la óptima. Devuelve la estructura con las redes utilizadas,
asi como
%diversos datos más.

function ResultadosNeuronas = ProbarRedNeuronas(EstructuraIter,


coruna,madrid,vigo,cReal,leon,P10,Tmax,nub,...
iteraciones,Entradas,Salidas);

%Inicializamos la estructura de variables,con los valores


elegidos en
%prueba_toledo
EstructuraVariables(1).nombre = EstructuraIter(1).nombre;
EstructuraVariables(1).valor = coruna;
EstructuraVariables(2).nombre = EstructuraIter(2).nombre;
EstructuraVariables(2).valor = madrid;
EstructuraVariables(3).nombre = EstructuraIter(3).nombre;
EstructuraVariables(3).valor = vigo;
EstructuraVariables(4).nombre = EstructuraIter(4).nombre;
EstructuraVariables(4).valor = cReal;
EstructuraVariables(5).nombre = EstructuraIter(5).nombre;
EstructuraVariables(5).valor = leon;
EstructuraVariables(6).nombre = EstructuraIter(6).nombre;
EstructuraVariables(6).valor = P10;
EstructuraVariables(7).nombre = EstructuraIter(7).nombre;
EstructuraVariables(7).valor = Tmax;
EstructuraVariables(8).nombre = EstructuraIter(8).nombre;
EstructuraVariables(8).valor = nub;

%Para no enseñar el entrenamiento. Indice 11 para que sea la


ultima
%variable
EstructuraVariables(11).nombre = 'ensenarEntrenamiento';
EstructuraVariables(11).valor = 'false';
EstructuraVariables(18).nombre = 'ensenarEntrenamiento';
EstructuraVariables(18).valor = 'false';
EstructuraVariables(19).nombre = 'BR';
EstructuraVariables(19).valor = 'true';
EstructuraVariables(20).nombre = 'diasValidacion' ;
EstructuraVariables(20).valor = '1';
EstructuraVariables(21).nombre = 'max_fail';
EstructuraVariables(21).valor = '40';
EstructuraVariables(12).nombre = 'ensenarPrueba';
EstructuraVariables(12).valor = 'false';
EstructuraVariables(13).nombre = 'epocas' ;
EstructuraVariables(13).valor = '300';
EstructuraVariables(14).nombre = 'pruebaDiasFinales';
EstructuraVariables(14).valor = 'false';
EstructuraVariables(15).nombre = 'pruebaDiasIntercalados';

138
C:\Documents and Settings\Carlos\Escritorio\200...\ProbarRedNeuronas.m 2/2

EstructuraVariables(15).valor = 'true';
EstructuraVariables(16).nombre = 'diasPrueba';
EstructuraVariables(16).valor = '1';
EstructuraVariables(17).nombre = 'mostrarWB';
EstructuraVariables(17).valor = 'false';

%Inicializamos la estructura de resultados.


ResultadosNeuronas(1).variables = '' ;
ResultadosNeuronas(1).net = '' ;
ResultadosNeuronas(1).MSE = 0;
ResultadosNeuronas(1).mediaError = 0;
ResultadosNeuronas(1).prediccion = [];
ResultadosNeuronas(1).test = [];

%Nombres de las variables de numero de neuronas


EstructuraVariables(9).nombre = EstructuraIter(10).nombre;
EstructuraVariables(10).nombre = EstructuraIter(11).nombre;

%Bucle para iterar el numero de neuronas.


k=1;

for i=1:size(EstructuraIter(10).valor,2)
EstructuraVariables(9).valor = int2str(EstructuraIter(10).
valor{i});
for j=1:size(EstructuraIter(11).valor,2)
EstructuraVariables(10).valor = int2str(EstructuraIter
(11).valor{j});

for x=1:iteraciones

[ResultadosNeuronas(k).MSE , ResultadosNeuronas(k).
mediaError, ResultadosNeuronas(k).net,...
ResultadosNeuronas(k).prediccion,
ResultadosNeuronas(k).test] = RNToledo(EstructuraVariables,
Entradas,Salidas);
ResultadosNeuronas(k).variables =
EstructuraVariables;

k=k+1;
end

disp
('-------------------------------------------------------------
-----------')
end
end

end

139
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PR...\RNToledo.m 1/8

%Prevision de la produccion en Toledo 1000kw y Toledo 20kw.


%Muestra 4 gráficos: el entrenamiento, la predicción de la red
para los
%valores de entrenamiento con su producción real, la predicción
de la red para los dias de la
%prueba y su producción real, y un diagrama de los pesos y los
bias de la red.

%Aquí está en la forma función, para poder iterar a través de


%prueba_toledo.m. Para la forma utilizable, mirar
RedNeuronalToledo.m

function [MSE,mediaError,net,prediccion,prueba] = RNToledo


(EstructuraVariables,Entradas,Salidas)

%
===============================================================
===========
% OPCIONES / VALORES POR DEFECTO
%
===============================================================
===========
%Selección de variables de entrada
coruna = true;
madrid = true;
vigo = true;
cReal = true;
leon = true;
P10 = true;
nub = true;
TemperaturaMaxima = true;

%opciones de conjuntos de validación y prueba


diasTotales = 353; %por defecto 353. Cambia en funcion de las
matrices de entrada y salida introducidas
diasValidacion = 25;
diasPrueba = 30;
pruebaDiasFinales = false;
pruebaDias35pruebas = true;
normalizacionTipica = true;

%Red neuronal
neuronasEntrada = 12;
neuronasOculta = 5;
neuronasCapa3 = 0;
funcionEntrada = 'tansig' ;
funcionOculta = 'tansig' ;
funcion3 = 'tansig' ;
funcionSalida = 'logsig' ;

140
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PR...\RNToledo.m 2/8

errorBuscado = 1e-3;
epocas = 300;
BR = true; %Regularización bayesiana, cuando no hay
validación.

%Gráficas
mostrarWB = false; %Muestra los pesos y bias. Verde=positivo
; Rojo=negativo.
ensenarEntrenamiento = false;
ensenarPrediccionFinal = false;
ensenarPrueba =false;
max_fail=45;

%Variables de interés:
%e : vector de errores cometidos en la prueba
%MSE : eso
%mediaError : sumatorio( valor absoluto(real-prediccion) ) /
%sumatorio(real) durante los dias de la prueba

P = Entradas;
T = Salidas;

%
===============================================================
===========
% CAMBIO DE VARIABLES AL SER USADO COMO FUNCION
%
===============================================================
===========

for i=1:size(EstructuraVariables,2)
evalc([EstructuraVariables(i).N,'=' ,EstructuraVariables(i).
V]);
end

diasTotales = size(P,2);

%
===============================================================
===========
% SELECCIÓN DE VARIABLES
%
===============================================================
===========

%Matrices de 10 variables, cada una para las variables de una


region.

MatCoruna = P(1:10,:);

141
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PR...\RNToledo.m 3/8

MatMadrid = P(11:20,:);

MatVigo = P(21:30,:);

MatCReal = P(31:40,:);

MatLeon = P(41:50,:);

cont=0;

%Seleccion de variables de cada region:


if ~P10
MatCoruna([2 4 6],:)=[];
MatMadrid([2 4 6],:)=[];
MatVigo([2 4 6],:)=[];
MatCReal([2 4 6],:)=[];
MatLeon([2 4 6],:)=[];
cont=1;
end

FPR = size(MatCoruna,1);

if ~nub
MatCoruna((FPR-2):FPR,:)=[];
MatMadrid((FPR-2):FPR,:)=[];
MatVigo((FPR-2):FPR,:)=[];
MatCReal((FPR-2):FPR,:)=[];
MatLeon((FPR-2):FPR,:)=[];
end

if ~TemperaturaMaxima
if cont
x=4;
else
x=7;
end
MatCoruna(x,:)=[];
MatMadrid(x,:)=[];
MatVigo(x,:)=[];
MatCReal(x,:)=[];
MatLeon(x,:)=[];
end

%Composicion de la matriz final de entradas.


P = [];
if coruna
P=[P;MatCoruna];
end
if madrid

142
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PR...\RNToledo.m 4/8

P=[P;MatMadrid];
end
if vigo
P=[P;MatVigo];
end
if cReal
P=[P;MatCReal];
end
if leon
P=[P;MatLeon];
end

P_final = P;
T_final = T;

%
===============================================================
===========
% NORMALIZACIÓN
%
===============================================================
===========

if normalizacionTipica
filas_entrada = size(P,1);
maxEntrada = zeros(1,filas_entrada);

for i=1:filas_entrada
maxEntrada(i) = max(P(i,:)');
P(i,:) = P(i,:)/maxEntrada(i);
end

maxSalida = max(T');
T = T/maxSalida;
else
[P, Pset] = mapstd(P);
[T, Tset] = mapstd(T);
% [P, Pset2] = processpca(P);
% [T, Tset2] = processpca(T);
end

%
===============================================================
===========
% SELECCIÓN DE CONJUNTOS
%
===============================================================
===========

143
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PR...\RNToledo.m 5/8

if pruebaDiasFinales
if diasValidacion~=0
%Conjunto de validación:
val.P = P(:,(diasTotales - diasValidacion - diasPrueba+1):
(diasTotales - diasPrueba));
val.T = T((diasTotales - diasValidacion - diasPrueba+1):
(diasTotales - diasPrueba));
end

%Conjunto de prueba:
test.P = P(:,(diasTotales - diasPrueba+1):diasTotales);
test.T = T((diasTotales - diasPrueba+1):diasTotales);
%Conjuntos de entrenamiento:
P = P(:,1:(diasTotales - diasValidacion - diasPrueba));
T = T(:,1:(diasTotales - diasValidacion - diasPrueba));

else

iitst = [2:5:diasTotales];
iival = [4:5:diasTotales];
iitr = [1:5:diasTotales 3:5:diasTotales 5:5:diasTotales];
if pruebaDias35pruebas
iitst = [2:10:diasTotales];
iival = [4:10:diasTotales 8:10:diasTotales];
iitr = [1:10:diasTotales 3:10:diasTotales 5:10:
diasTotales 6:10:diasTotales 7:10:diasTotales 9:10:
diasTotales...
10:10:diasTotales];
end
val.P = P(:,iival);
val.T = T(:,iival);
test.P = P(:,iitst);
test.T = T(:,iitst);
P = P(:,iitr);
T = T(:,iitr);

if diasValidacion==0
P=[P val.P];
T=[T val.T];
end

end

%
===============================================================
===========
% RED NEURONAL
%

144
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PR...\RNToledo.m 6/8

===============================================================
===========

%creamos la red neuronal


if neuronasCapa3~=0
net = newff(minmax(P),[neuronasEntrada,neuronasOculta,
neuronasCapa3,1],{funcionEntrada,funcionOculta,funcion3,
funcionSalida});
if BR
net.trainFcn = 'trainbr' ;
net = initnw(net,1);
net = initnw(net,2);
net = initnw(net,3);
net.initFcn = 'initlay' ;
end
elseif neuronasOculta~=0
net = newff(minmax(P),[neuronasEntrada,neuronasOculta,1],
{funcionEntrada,funcionOculta,funcionSalida});
if BR
net.trainFcn = 'trainbr' ;
net = initnw(net,1);
net = initnw(net,2);
net.initFcn = 'initlay' ;
end
else
net = newff(minmax(P),[neuronasEntrada,1],{funcionEntrada,
funcionSalida});
if BR
net.trainFcn = 'trainbr' ;
net = initnw(net,1);
net.initFcn = 'initlay' ;
end
end

net.trainParam.goal = errorBuscado;
net.trainParam.epochs = epocas;
net.trainParam.show = 2;
net.trainParam.max_fail = max_fail;

if ~ensenarEntrenamiento
net.trainParam.show = NaN;
end
net=init(net);

%entrenamos la red
if diasValidacion==0
[net,tr,Y] = train(net,P,T,[],[],[],test);
else
[net,tr,Y] = train(net,P,T,[],[],val,test);
end

145
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PR...\RNToledo.m 7/8

%prediccion
if ensenarPrediccionFinal
figure
if ~normalizacionTipica
T = mapstd('reverse' ,T,Tset);
Y = mapstd('reverse' ,Y,Tset);
end
plot(T)
hold on
plot(Y,'g' )
end

prediccion = sim(net,test.P);

if ~normalizacionTipica
test.T = mapstd('reverse' ,test.T,Tset);
prediccion = mapstd('reverse' ,prediccion,Tset);
end

%prueba
if ensenarPrueba
figure
plot(test.T)
hold on
plot(prediccion,'g' )
end

%Mostrar pesos y bias


if mostrarWB
figure
hintonwb(net.IW{1,1},net.b{1})
end

%Calculo del error MSE


e= (test.T - prediccion);
MSE = mse(e);

%Calculo del otro error, lo llamaremos mediaError


numerador = 0;
denominador = 0;

for i=1:size(test.T,2)
numerador = numerador + abs(test.T(i)-prediccion(i));
denominador = denominador + test.T(i);
end
mediaError = numerador/denominador;

146
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PR...\RNToledo.m 8/8

%Estructura de prediccion y prueba.


prueba=struct;
prueba.real = test.T;
prueba.pred = prediccion;

prediccion=struct;
prediccion.real = T;
prediccion.pred = Y;

end

147
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 1/12

% Nueva función para crear una red doble, en la que una primera
red calcula
% la prediccion diaria y alimenta con dicha prediccion a una
red
% constituida de 15 subredes, que calculan la produccion
horaria

function [errores,net,prediccion,prueba] = DosRedes


(EstructuraVariables,Entradas,Salidas,SalidaHoraria)
%
===============================================================
===========
% OPCIONES / VALORES POR DEFECTO
%
===============================================================
===========
tic
%Selección de variables de entrada
coruna = false;
madrid = true;
vigo = false;
cReal = true;
leon = false;
P10 = false;
nub = true;
TemperaturaMaxima = true;

%opciones de conjuntos de validación y prueba


diasTotales = 353; %por defecto 353. Cambia en funcion de las
matrices de entrada y salida introducidas
diasValidacion = 25;
diasPrueba = 30;
pruebaDiasFinales = false;
pruebaDias35pruebas = false;
normalizacionTipica = true;

%Red neuronal
N11 = 5;
N12 = 2;
N13 = 0;
N21 = 4;
N22 = 2; % Por ahora no voy a poner la posibilidad de meter 4
capas.
F11 = 'tansig' ;
F12 = 'tansig' ;
F13 = 'tansig' ;
F21 = 'tansig' ;
F22 = 'tansig' ;
F1out = 'logsig' ;
F2out = 'logsig' ;
errorBuscado = 1e-3;

148
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 2/12

epocas = 300;
BR = true; %Regularización bayesiana, cuando no hay
validación.
max_fail=5;
entrenamientoReal=false;
subRedes = true;
entradasSegundaRed = false;

%Gráficas
mostrarWB = false; %Muestra los pesos y bias. Verde=positivo
; Rojo=negativo.
ensenarEntrenamiento = true;
ensenarPrueba =false;
dia1=15;
dia2=17;

%Variables de interés:
%e : vector de errores cometidos en la prueba
%MSE : eso
%mediaError : sumatorio( valor absoluto(real-prediccion) ) /
%sumatorio(real) durante los dias de la prueba

P = Entradas;
T1 = Salidas;
T2 = SalidaHoraria;

%
===============================================================
===========
% CAMBIO DE VARIABLES AL SER USADO COMO FUNCION
%
===============================================================
===========

for i=1:size(EstructuraVariables,2)
evalc([EstructuraVariables(i).N,'=' ,EstructuraVariables(i).
V]);
end

diasTotales = size(P,2);

%
===============================================================
===========
% SELECCIÓN DE VARIABLES
%
===============================================================

149
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 3/12

===========

%Matrices de 10 variables, cada una para las variables de una


region.
MatCoruna = P(1:10,:);
MatMadrid = P(11:20,:);
MatVigo = P(21:30,:);
MatCReal = P(31:40,:);
MatLeon = P(41:50,:);
cont=0;
%Seleccion de variables de cada region:
if ~P10
MatCoruna([2 4 6],:)=[];
MatMadrid([2 4 6],:)=[];
MatVigo([2 4 6],:)=[];
MatCReal([2 4 6],:)=[];
MatLeon([2 4 6],:)=[];
cont=1;
end
FPR = size(MatCoruna,1);
if ~nub
MatCoruna((FPR-2):FPR,:)=[];
MatMadrid((FPR-2):FPR,:)=[];
MatVigo((FPR-2):FPR,:)=[];
MatCReal((FPR-2):FPR,:)=[];
MatLeon((FPR-2):FPR,:)=[];
end
if ~TemperaturaMaxima
if cont
x=4;
else
x=7;
end
MatCoruna(x,:)=[];
MatMadrid(x,:)=[];
MatVigo(x,:)=[];
MatCReal(x,:)=[];
MatLeon(x,:)=[];
end

%Composicion de la matriz final de entradas.


P = [];
if coruna
P=[P;MatCoruna];
end
if madrid
P=[P;MatMadrid];
end
if vigo
P=[P;MatVigo];
end

150
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 4/12

if cReal
P=[P;MatCReal];
end
if leon
P=[P;MatLeon];
end

P_final = P;
T_final1 = T1;
T_final2 = T2;

%
===============================================================
===========
% NORMALIZACIÓN
%
===============================================================
===========

if normalizacionTipica
filas_entrada = size(P,1);
maxEntrada = zeros(1,filas_entrada);
maxSalidaH = zeros(1,size(T2,1));

for i=1:filas_entrada
maxEntrada(i) = max(P(i,:)');
P(i,:) = P(i,:)/maxEntrada(i);
end

maxSalidaD = max(T1');
indice = find(T1==max(T1'));
T1 = T1/maxSalidaD;

for i=1:size(T2,1)
maxSalidaH(i) = max(T2(i,:)');
%maxSalidaH(i) = T2(i,indice);
T2(i,:) = T2(i,:)/maxSalidaH(i);
end

else
[P, Pset] = mapstd(P);
[T1, T1set] = mapstd(T1);
[T2, T2set] = mapstd(T2);
end

%
===============================================================
===========
% SELECCIÓN DE CONJUNTOS

151
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 5/12

%
===============================================================
===========

T = cell(2,1);
T{1,1} = T1;
T{2,1} = T2;
P_mat=P;
P=cell(1);
P{1,1}=P_mat;

if pruebaDiasFinales
if diasValidacion~=0
%Conjunto de validación:
val.P=cell(1);
val.P{1,1} = P{1,1}(:,(diasTotales - diasValidacion -
diasPrueba+1):(diasTotales - diasPrueba));
val.T = cell(2,1);
val.T{1,1} = T1(:,(diasTotales - diasValidacion -
diasPrueba+1):(diasTotales - diasPrueba));
val.T{2,1} = T2(:,(diasTotales - diasValidacion -
diasPrueba+1):(diasTotales - diasPrueba));
end

%Conjunto de prueba:
test.P=cell(1);
test.P{1,1} = P{1,1}(:,(diasTotales - diasPrueba+1):
diasTotales);
test.T =cell(2,1);
test.T{1,1} = T1(:,(diasTotales - diasPrueba+1):
diasTotales);
test.T{2,1} = T2(:,(diasTotales - diasPrueba+1):
diasTotales);
%Conjuntos de entrenamiento:
P{1,1} = P{1,1}(:,1:(diasTotales - diasValidacion -
diasPrueba));
T=cell(2,1);
T{1,1} = T1(:,1:(diasTotales - diasValidacion -
diasPrueba));
T{2,1} = T2(:,1:(diasTotales - diasValidacion -
diasPrueba));

else

iitst = [2:5:diasTotales];
iival = [4:5:diasTotales];
iitr = [1:5:diasTotales 3:5:diasTotales 5:5:diasTotales];
if pruebaDias35pruebas
iitst = [2:10:diasTotales];
iival = [4:10:diasTotales 8:10:diasTotales];
iitr = [1:10:diasTotales 3:10:diasTotales 5:10:

152
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 6/12

diasTotales 6:10:diasTotales 7:10:diasTotales 9:10:


diasTotales...
10:10:diasTotales];
end
val.P = cell(1);
val.P{1,1} = P{1,1}(:,iival);
val.T=cell(2,1);
val.T{1,1} = T1(:,iival);
val.T{2,1} = T2(:,iival);
test.P=cell(1);
test.P{1,1} = P{1,1}(:,iitst);
test.T = cell(2,1);
test.T{1,1} = T1(:,iitst);
test.T{2,1} = T2(:,iitst);
P{1,1} = P{1,1}(:,iitr);
T{1,1} = T1(:,iitr);
T{2,1} = T2(:,iitr);

if diasValidacion==0
P{1,1}=[P{1,1} val.P{1,1}];
T{1,1}=[T1 val.T{1,1}];
T{2,1}=[T2 val.T{2,1}];
end

end

%
===============================================================
===========
% RED NEURONAL
%
===============================================================
===========

%Primera Red, y entrenamiento:

if N13~=0
net1 = newff(minmax(P{1,1}),[N11,N12,N13,1],{F11,F12,F13,
F1out});
if BR
net1.trainFcn ='trainbr' ;
net1 = initnw(net1,1);
net1 = initnw(net1,2);
net1 = initnw(net1,3);
net1.initFcn = 'initlay' ;
end
elseif N12~=0

153
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 7/12

net1 = newff(minmax(P{1,1}),[N11,N12,1],{F11,F12,F1out});
if BR
net1.trainFcn = 'trainbr' ;
net1 = initnw(net1,1);
net1 = initnw(net1,2);
net1.initFcn = 'initlay' ;
end
else
net1 = newff(minmax(P{1,1}),[N11,1],{F11,F1out});
if BR
net1.trainFcn = 'trainbr' ;
net1 = initnw(net1,1);
net1.initFcn = 'initlay' ;
end

end

net1.trainParam.epochs = epocas;
net1.trainParam.goal = errorBuscado;
net1.trainParam.max_fail = 35;
net1.trainParam.show =2;
net1.trainParam.show = NaN;

%Validacion y error de la primera red:


val1.P = val.P;
val1.T = {val.T{1,1}};
test1.P = test.P;
test1.T = {test.T{1,1}};

media=[];
minima=[];
%Seleccionamos la mejor de 5 redes.

for i=1:7
net1 =init(net1);
if diasValidacion~=0
[net1,tr,Y,E] = train(net1,P,{T{1,1}},[],[],val1,
test1);
else
[net1,tr,Y,E] = train(net1,P,{T{1,1}},[],[],[],test1);
end
media(i)=mean(E{1,1});
minima = min([media(i) minima]);
if minima==media(i)
P2 = Y;
test2.P = sim(net1, test1.P);
val2.P = sim(net1, val1.P);
prediccion1 = test2.P{1,1};
end

154
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 8/12

end

if ensenarEntrenamiento
prueba=sim(net1,test1.P);
figure
plot(test1.T{1,1})
hold on
plot(prueba{1,1},'g' );
end

prediccion.pred1 = P2{1,1}; %primera parte de la prediccion


final de la red
prediccion.real1 = T{1,1};

%Segunda red:

%Creamos los vectores de entrenamiento, si el modo


entrenamiento real esta
%activado
if entrenamientoReal
P2=T;
val2.P = val1.T;
end

if entradasSegundaRed
P2{1,1} = [P2{1,1} ; P{1,1}];
val2.P{1,1} = [val2.P{1,1} ; val1.P{1,1}];
test2.P{1,1} = [test2.P{1,1} ; test1.P{1,1}];
end

if subRedes %%%%15 subredes que se retroalimentan


net = network;

net.numInputs = 1;
capas = 3*size(T2,1); % numero de capas, incluidas las de
salida.
net.numLayers = capas;
for i=1:capas
net.biasConnect(i) = 1;
end
%Connects
net.inputConnect(1:3:capas,1) = 1;
for i=1:(capas-1)
net.layerConnect(i+1,i) = 1;
end

net.outputConnect(1,3:3:capas) = 1;
net.targetConnect(3:3:capas) = 1;

155
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 9/12

%inputs
net.inputs{1}.range = minmax(P2{1,1});
net.inputs{1}.size = size(P2{1,1},1);
%layers
for i=1:3:capas
net.layers{i}.size = N21;
net.layers{i}.transferFcn = F21;
net.layers{i+1}.size = N22;
net.layers{i+1}.transferFcn = F22;
net.layers{i+2}.size = 1;
net.layers{i+2}.transferFcn = F2out;
end
for i=1:capas
net.layers{i}.initFcn = 'initnw' ;
end
%functions
net.initFcn = 'initlay' ;
net.performFcn = 'mse';
if BR
net.trainFcn = 'trainbr' ;
else
net.trainFcn = 'trainlm' ;
end

%parámetros
net.trainParam.epochs = epocas;
net.trainParam.goal = errorBuscado;
net.trainParam.max_fail = max_fail;
net.trainParam.show =2;

%inputs de la red definidos en el bucle de la red 1

%targets de la red
T2_cell = cell(size(T2,1),1);
for i=1:size(T2,1)
T2_cell{i,1} = T{2,1}(i,:);
test2.T{i,1} = test.T{2,1}(i,:);
val2.T{i,1} = val.T{2,1}(i,:);
end

else %%%Una sola red con 15 neuronas en la ultima capa%%%%%%%

if N22~=0
net = newff(minmax(P2{1,1}),[N21,N22,size(T2,1)],{F21,
F22,F2out});
if BR
net.trainFcn = 'trainbr' ;
net = initnw(net,1);
net = initnw(net,2);

156
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 10/12

net.initFcn = 'initlay' ;
end
else
net = newff(minmax(P2{1,1}),[N21,size(T2,1)],{F21,
F2out});
if BR
net.trainFcn = 'trainbr' ;
net = initnw(net,1);
net.initFcn = 'initlay' ;
end

end

net.trainParam.epochs = epocas;
net.trainParam.goal = errorBuscado;
net.trainParam.max_fail = max_fail;
net.trainParam.show =2;

%Definimos los targets:


T2_cell = {T{2,1}};
val2.T = {val.T{2,1}};
test2.T = {test.T{2,1}};

end

if ~ensenarEntrenamiento
net.trainParam.show = NaN;
end

net=init(net);
%entrenamos la red
if diasValidacion==0
[net,tr,Y2,E] = train(net,P2,T2_cell,[],[],[],test2);
else
[net,tr,Y2,E] = train(net,P2,T2_cell,[],[],val2,test2);
end

prediccion.pred2 = cell2mat(Y2);
prediccion.real2 = cell2mat(T2_cell);

%
===============================================================
===========
% GRÁFICAS
%
===============================================================
===========
prediccion2 = sim(net,test2.P);
if subRedes
matrizTargets = cell2mat(test2.T);

157
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 11/12

matrizPrev = cell2mat(prediccion2);
else
matrizTargets = test2.T{1,1};
matrizPrev = prediccion2{1,1};
end

%Calculo del error MSE


e1= (test1.T{1,1} - prediccion1);
errores.MSE1 = mse(e1);
e2= (matrizTargets - matrizPrev);
errores.MSE2 = mse(e2);

for i=1:size(matrizPrev,2)
for j=1:size(matrizPrev,1)
matrizPrev(j,i) = matrizPrev(j,i)*maxSalidaH(j);
matrizTargets(j,i) = matrizTargets(j,i)*maxSalidaH(j);
end
prediccion1(i) = prediccion1(i)*maxSalidaD;
test1.T{1,1}(i) = test1.T{1,1}(i)*maxSalidaD;
end

%Enseñamos los distintos dias de prueba


if ensenarPrueba
dia2 = min([dia2 size(prediccion1,2)]); %para evitar
sobrepasar el maximo dia de la prueba
for i=dia1:dia2
figure
plot(matrizTargets(:,i))
hold on
plot(matrizPrev(:,i),'g')
end
end

prueba = struct;
prueba.real1 = test1.T{1,1};
prueba.real2 = matrizTargets;
prueba.pred1 = prediccion1;
prueba.pred2 = matrizPrev;

%
===============================================================
===========
% ERRORES
%
===============================================================
===========

158
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\DosRedes.m 12/12

%Calculo del otro error, lo llamaremos mediaError


numerador1 = 0;
denominador1 = 0;
numerador2 = 0;
denominador2 = 0;

for i=1:size(test1.T{1,1},2)
numerador1 = numerador1 + abs(test1.T{1,1}(i)-prediccion1
(i));
denominador1 = denominador1 + test1.T{1,1}(i);
numerador2 = numerador2 + abs(matrizTargets(:,i)-matrizPrev
(:,i));
denominador2 = denominador2 + matrizTargets(:,i);
end
errores.mediaError1 = numerador1/denominador1;
errores.mediaError2 = numerador2./denominador2;
errores.mediaErrorHorario = mean(errores.mediaError2);
errores.mediaErrorHorarioEnergia = sum(errores.mediaError2.
*maxSalidaH')/sum(maxSalidaH);

%Calculo del error de la suma de produccion horaria comparada a


la
%produccion prevista y real.
energiaSuma = sum(matrizPrev,1);

errorPred=[];
errorReal=[];
for i=1:size(energiaSuma,2)
errorPred(i) = abs(prediccion1(i) - energiaSuma(i))
/prediccion1(i);
errorReal(i) = abs(test1.T{1,1}(i) - energiaSuma(i))/test1.
T{1,1}(i);
end

errores.errorHorarioPred = mean(errorPred);
errores.errorHorarioReal = mean(errorReal);
errores.tiempoDuracion = toc;

end

159
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PROYE...\SOLAR.m 1/1

%Lanzar una prevision de energia.

ruta='BBDD.mat' ;

tiempoActualizacion=ActualizarBBDD(ruta);

EV=CrearEstructuraVariables();

diaPrueba='10/07/2008' ; %fecha en formato dd/mm/aaaa a partir


de la cual se desea hacer una prueba, en caso de
%no tener previsiones de radiacion para hacer una
prevision
%de energia.

[prevision,errores_prueba,errores_red] = PrevisionParques(ruta,
EV, diaPrueba )

160
C:\Documents and Settings\Carlos\Escritorio\2008-20...\ActualizarBBDD.m 1/2

%Actualizar .mat de bases de datos de temperatura, radiaciones,


nubosidades y producciones
%Lee los .xls correspondientes hasta la fecha indicada.
%FICHEROS
% -Nub.xls
% -TmaxTmin.xls
% -Producciones
% -Radiaciones/*archivos de previsiones de radiacion en
bruto*

function tiempoActualizacion = ActualizarBBDD(ruta)

tic
FF='dd/mm/yyyy' ;
fecha1 = '16/07/2007'; %primera fecha con datos de radiacion
carpeta = 'C:\Documents and Settings\Carlos\Escritorio\2008-
2009\PROYECTO\PREVISIONES\Radiaciones';
%direccion de la carpeta donde estan las radiaciones

%Variables y vectores de fechas.


[nub,nub_f] = xlsread('Nub', 'Nubosidades' );
[temp,temp_f] = xlsread('TmaxTmin', 'Temperaturas' );
%[HL,HL_f] = xlsread('HL','Horas Luz');
[rad,rad_f] = leerRadiaciones(fecha1,carpeta);

nub_f(1:3,:)=[]; temp_f(1:2,:)=[]; %quitar cabecera


nub_f = nub_f(:,1); temp_f=temp_f(:,1); %coger las fechas

%Producciones y vectores de fechas.


[cond,hojas] = xlsfinfo('Producciones');
prod=cell(1,size(hojas,2));
prod_f=cell(1,size(hojas,2));
aux_prod=cell(1,size(hojas,2));
for i=1:size(hojas,2)

[prod{i},prod_f{i}]=xlsread( 'Producciones',hojas{i});
%Vector de fechas para las producciones
prod_f{i}(1,:)=[]; prod_f{i}=prod_f{i}(:,3);
prod{i}(1,:)=[];
prod{i}(:,1:2)=[];

%Preparar los datos a UTM


aux_prod{i}=[];
for k=1:size(prod_f{i})
estacion=CalculaEstacion(prod_f{i}{k});
vector=prod{i}(k,:);
if estacion
vector=circshift(vector,[0 -1]);
else

161
C:\Documents and Settings\Carlos\Escritorio\2008-20...\ActualizarBBDD.m 2/2

vector=circshift(vector,[0 -2]);
end
aux_prod{i}=[aux_prod{i};vector];
end
prod{i}=aux_prod{i};

end

% save('BBDD',nub,nub_f,temp,temp_f,rad,rad_f,prod,prod_f);
save(ruta);

tiempoActualizacion = toc;

end

162
C:\Documents and Settings\Carlos\Escritorio\2008-20...\leerRadiaciones.m 1/1

%Importar radiaciones para el actualizador

function [rad,rad_f] = leerRadiaciones(fecha1,carpeta)

continuar=1;
i=0;
FF='dd/mm/yyyy' ;
rad_dia0=[];
rad_dia1=[];
rad_f={};

while continuar
direccion = strcat('E00224-' ,ComponerFecha(fecha1),'-
Radiacion-corto.dat'); %primera parte de la dirección
direccion2=strcat(carpeta,'\' ,direccion); %dirección
completa
rad_f{i+1,1} = fecha1; %se añade la fecha al vector de
fechas
try
matDia=importdata(direccion2); %se prueba si da error
al intentar leer un archivo
catch
break;
end
matDia=importdata(direccion2); %se lee los datos de un
archivo .dat
AUX0 = matDia.data(1:5,4:12); %matriz auxiliar con las
previsiones a D+0
AUX1 = matDia.data(1:5,13:21); %matriz auxiliar con las
previsiones a D+1
rad_dia1 =[rad_dia1; AUX1(1,:) AUX1(2,:) AUX1(3,:) AUX1
(4,:) AUX1(5,:)];
rad_dia0 = [rad_dia0; AUX0(1,:) AUX0(2,:) AUX0(3,:) AUX0
(4,:) AUX0(5,:)]; %se preparan los datos de radiación en el
formato adecuado
i=i+1;
fecha_aux=datevec(fecha1,FF);
fecha1 = datestr(double(datenum(fecha_aux))+1 , FF); %se
suma un día a la fecha
end

rad_dia0 = [rad_dia0; zeros(1,45)];


rad_dia1 = [zeros(1,45); rad_dia1];

rad=[rad_dia0 rad_dia1];

end

163
C:\Documents and Settings\Carlos\Escritorio\2008-20...\ComponerFecha.m 1/1

%Funcion para crear los nombres de los archivos como nos envian
las
%radiaciones:

function fecha_fin = ComponerFecha(fecha)

FF='dd/mm/yyyy' ;

diaBuscado=datevec(fecha,FF);

if diaBuscado(1,2)<10
b=strcat('0' ,int2str(diaBuscado(1,2)));
else
b=int2str(diaBuscado(1,2));
end
if diaBuscado(1,3)<10
c=strcat('0' ,int2str(diaBuscado(1,3)));
else
c = int2str(diaBuscado(1,3));
end
fecha_fin = strcat(int2str(diaBuscado(1,1)), b ,c);

end

164
C:\Documents and Settings\Carlos\Escritorio\2008-200...\CalculaEstacion.m 1/1

%Funcion para calcular si un dia es de horario de invierno o de


verano.
%Copiada de N-libis

function estacion=CalculaEstacion(diaEntrada)

FF='dd/mm/yyyy';

%vectorizo la fecha. Solo me interesa el año.


[anio,mes,dia] = datevec(diaEntrada,FF);
diaEntrada = datenum(diaEntrada,FF);

%Asigno unos valores iniciales a dia1 y dia2. Empiezo a


buscar desde el
%final de mes y a partir de ahi voy bajando hasta que
determine que dia
%es el domingo.
dia1=datenum(['31/03/' ,int2str(anio)],FF);
dia2=datenum(['31/10/' ,int2str(anio)],FF);

while weekday(dia1)~=1
dia1=dia1-1;
end
while weekday(dia2)~=1
dia2=dia2-1;
end
%Si el dia se encuentra entre dia1 y dia2 entonces se
asigna a estacion
%el valor O, que significa que es horario de verano, y si
no, se le
%asigna el valor 1
if diaEntrada>dia1 && diaEntrada<=dia2
estacion=0;
else
estacion=1;
end
end

165
C:\Documents and Settings\Carlos\Escritorio\...\CrearEstructuraVariables.m 1/2

%Funcion para crear la configuración de una red :

function EV = CrearEstructuraVariables()

%opciones de visualización. Para procesos iterativos se


recomienda
%desactivar todo.
EV(1).N = 'ensenarEntrenamiento';
EV(1).V = 'true';
EV(2).N = 'ensenarPrediccionFinal';
EV(2).V = 'true';
EV(3).N = 'ensenarPrueba';
EV(3).V = 'true';
EV(4).N = 'mostrarWB' ;
EV(4).V = 'false';

%opciones de entradas
EV(5).N = 'coruna' ;
EV(5).V = '0' ;
EV(6).N = 'madrid' ;
EV(6).V = '1' ;
EV(7).N = 'vigo';
EV(7).V = '0' ;
EV(8).N = 'cReal';
EV(8).V = '1' ;
EV(9).N = 'leon';
EV(9).V = '0' ;
EV(10).N = 'Tmax';
EV(10).V = '1' ;
EV(11).N = 'P10';
EV(11).V = '0' ;
EV(12).N = 'nub';
EV(12).V = '1' ;
EV(13).N = 'P90';
EV(13).V = '1' ;
EV(14).N = 'Tmin';
EV(14).V = '1' ;
EV(15).N = 'Horizonte0'; %se meten las predicciones
para el D+0
EV(15).V = '0' ;

%Opciones de red.
EV(16).N = 'BR'; %entrenamiento bayesiano
EV(16).V = 'true';
EV(17).N = 'max_fail' ;
EV(17).V = '15';
EV(18).N = 'epocas' ;
EV(18).V = '300';
EV(19).N = 'Separadas' ; %dos redes separadas
EV(19).V = 'false';

166
C:\Documents and Settings\Carlos\Escritorio\...\CrearEstructuraVariables.m 2/2

EV(20).N = 'N11'; %Capa1, primera subred


EV(20).V = '8' ;
EV(21).N = 'N12'; %Capa2, primera subred
EV(21).V = '3' ;
EV(22).N = 'N21'; %Capa1, segunda subred
EV(22).V = '13';
EV(23).N = 'N22'; %Capa2, segunda subred
EV(23).V = '13';
EV(24).N = 'Fcapas' ; %funcion de las capas
EV(24).V ='''tansig''';
EV(25).N = 'Fout'; %Funcion de salida
EV(25).V = '''logsig''';

end

167
C:\Documents and Settings\Carlos\Escritorio\2008-2...\PrevisionParques.m 1/4

%
===============================================================
===========
% Funcion para hacer una prevision de la produccion.
%
===============================================================
===========

function [ prevision , errores_prueba, errores_red ] =


PrevisionParques(BaseDatos, EV, diaPrueba )

%diaPrueba: si es distinto de 0, se hace una prueba con los


valores a
%partir de ese dia. Prevision tendra dos campos: realidad y
prevision, en
%ese caso.
FF = 'dd/mm/yyyy'; %formato de las fechas

%Importar Datos
load(BaseDatos);

%
===============================================================
===========
%Escoger intervalo de entrenamiento, y de prueba o prevision:
primeras={ nub_f{1},temp_f{1},rad_f{1}};
ultimas={nub_f{size(nub_f,1)},temp_f{size(temp_f,1)},rad_f{size
(rad_f,1)}};
for i=1:size(hojas,2)
primeras{i+3}=prod_f{i}{1};
ultimas{i+3}=prod_f{i}{size(prod_f{i},1)};
end
cont = 3;
if EV(10).V== '0' && EV(14).V=='0' %si no usamos las
temperaturas
primeras{2}=[];
ultimas{2}=[];
cont = cont-1;
end
if EV(12).V== '0' %si no usamos las nubosidades
primeras{1}=[];
ultimas{1}=[];
cont = cont-1;
end

%Que entrenamientos podemos hacer.


Ent = max(double(datenum(primeras,FF))):min(double(datenum
(ultimas,FF)));
Ent = Ent';

%Que previsiones podemos hacer.

168
C:\Documents and Settings\Carlos\Escritorio\2008-2...\PrevisionParques.m 2/4

Prev = max(double(datenum(primeras(1:cont),FF))):min(double
(datenum(ultimas(1:cont),FF)));
Prev=Prev';

if Prev(size(Prev))>Ent(size(Ent))
a=Ent(size(Ent));
Prev = Prev((find(Prev == a)+1):size(Prev));
condicion=0;
elseif (diaPrueba~=0)
if (double(datenum(diaPrueba,FF)) < min(double(datenum
(ultimas,FF))))
Prev = [double(datenum(diaPrueba,FF)):Prev(size
(Prev))]';
Ent = Ent(1:(find(Ent==double(datenum(diaPrueba,FF)))
-1));
condicion=1;
end
else
Prev=0;
condicion=2;
end

%%%Primer y ultimo dia de entrenamiento y prevision.


primerDiaEnt = Ent(1);
ultimoDiaEnt = Ent(size(Ent,1));

primerDiaPrev = Prev(1);
ultimoDiaPrev = Prev(size(Prev,1));

Ftemp =datenum(temp_f,FF);
Fnub =datenum(nub_f,FF);
Frad =datenum(rad_f,FF);
for i=1:size(prod_f,2)
Fprod{i} = datenum(prod_f{i},FF);
end

%==========================================================
%conjuntos de entrenamiento
x1= Ftemp==primerDiaEnt; x2 = Ftemp==ultimoDiaEnt;
ind1=find(x1); ind2=find(x2);
Ftemp1 = Ftemp(ind1:ind2);
temp1 = temp(ind1:ind2,:);
%-----------
x1= Fnub==primerDiaEnt; x2 = Fnub==ultimoDiaEnt;
ind1=find(x1); ind2=find(x2);
Fnub1 = Fnub(ind1:ind2);
nub1 = nub(ind1:ind2,:);
%-----------
x1= Frad==primerDiaEnt; x2 = Frad==ultimoDiaEnt;

169
C:\Documents and Settings\Carlos\Escritorio\2008-2...\PrevisionParques.m 3/4

ind1=find(x1); ind2=find(x2);
Frad1 = Frad(ind1:ind2);
rad1 = rad(ind1:ind2,:);

Pent = [temp1,nub1,rad1]; %matriz de entradas para el


entrenamiento.
%----------
Tent= zeros((ultimoDiaEnt-primerDiaEnt+1),24); %%Matriz de
salidas para el entrenamiento.
for i=1:size(Fprod,2)
x1= Fprod{i}==primerDiaEnt; x2 = Fprod{i}==ultimoDiaEnt;
ind1=find(x1); ind2=find(x2);
Fprod1{i} = Fprod{i}(ind1:ind2);
prod1{i} = prod{i}(ind1:ind2,:);
Tent = Tent + prod1{i};
end

%Conjuntos de prevision
if condicion~=2
x1= Ftemp==primerDiaPrev; x2 = Ftemp==ultimoDiaPrev;
ind1=find(x1); ind2=find(x2);
Ftemp2 = Ftemp(ind1:ind2);
temp2 = temp(ind1:ind2,:);
%-----------
x1= Fnub==primerDiaPrev; x2 = Fnub==ultimoDiaPrev;
ind1=find(x1); ind2=find(x2);
Fnub2 = Fnub(ind1:ind2);
nub2 = nub(ind1:ind2,:);
%-----------
x1= Frad==primerDiaPrev; x2 = Frad==ultimoDiaPrev;
ind1=find(x1); ind2=find(x2);
Frad2 = Frad(ind1:ind2);
rad2 = rad(ind1:ind2,:);

Pprev = [temp2,nub2,rad2];
else
Pprev=0;
end
%----------
if condicion==1
Tprev= zeros((ultimoDiaPrev-primerDiaPrev+1),24); %%
Matriz de salidas para la previsión.
for i=1:size(Fprod,2)
x1= Fprod{i}==primerDiaPrev; x2 = Fprod{i}
==ultimoDiaPrev;
ind1=find(x1); ind2=find(x2);
Fprod2{i} = Fprod{i}(ind1:ind2);
prod2{i} = prod{i}(ind1:ind2,:);
Tprev = Tprev + prod2{i};

170
C:\Documents and Settings\Carlos\Escritorio\2008-2...\PrevisionParques.m 4/4

end

Tprev=Tprev';
x=[];
minimoHorario = 0.01*mean(sum(Tprev,1));
for i=1:size(Tprev,1);
if sum(Tprev(i,:))<=minimoHorario
x=[x i];
end
end
Tprev(x,:)=[];
else
Tprev=0;
end

%
===============================================================
===========
% Empezamos con la red:

[prevision, errores_red, red ] = RedSolar(Pent,Tent,Pprev,Ent,


EV);

%Cálculo de los errores de la prueba


errores_prueba=0;

if ensenarPrueba
figure
plot(sum(Tprev',1))
hold on
plot(prevision.diaria,'g' )

for i=1:size(prevision.horaria,2)
figure
plot(Tprev(:,i))
hold on
plot(prevision.horaria,'g' )
end
end

171
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PRO...\RedSolar.m 1/7

%Red para la prevision de la energia solar fotovoltaica


producida en uno o
%mas parques solares, a partir de las previsiones de radiacion,
nubosidad y
%temperatura.

function [prevision, errores_red, red , tiempo] = RedSolar


(Pent,Tent,Pprev,Fent,EV)

tic

numeroPruebas = size(Pprev,1);
if Pprev~=0
P_ini = [Pent;Pprev]'; %las unimos al principio para
poder normalizar y seleccionar variables a la vez.
numeroPruebas = size(Pprev,1);
else
P_ini = Pent';
numeroPruebas=0;
end
T1 = sum(Tent',1);
T2 = Tent';
FECHAS = Fent;

%
===============================================================
===========
% CAMBIO DE VARIABLES AL SER USADO COMO FUNCION
%
===============================================================
===========

for i=1:size(EV,2)
evalc([EV(i).N,'=' ,EV(i).V]);
end

diasTotales = size(P_ini,2);

%
===============================================================
===========
% ELIMINACIÓN DE DÍAS CON PRODUCCIÓN TOTAL NULA (ENTRADAS Y
SALIDAS)
%
===============================================================
===========

172
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PRO...\RedSolar.m 2/7

for i=1:size(P_ini,2)
if i>length(T1)
break
end
if T1(1,i) == 0
T1(:,i)=[];
T2(:,i)=[];
P_ini(:,i)=[];
FECHAS(i)=[];
i=i-1;
end
end

condicion = 0.01*mean(T1);
diasTotales = size(T2,2);

%eliminación de entradas y salidas horarias nulas


% x=[];
%
% for i=1:size(T2,1);
% if sum(T2(i,:))<=condicion %ya se hace en
PrevisionParques
% x=[x i];
% end
% end
% T2(x,:)=[];

%
===============================================================
===========
% SELECCIÓN DE VARIABLES
%
===============================================================
===========
%Quitamos las realidades, y las previsiones a D+0:
P_ini([3:4:20 4:4:20 24:6:50 25:6:50 26:6:50 51:95],:)=[];
%Ordenamos por ciudades:
Temp=P_ini(1:10,:);
Nubosidades=P_ini(11:25,:);
Radiaciones=P_ini(26:70,:);
Radiaciones=[Radiaciones(10:18,:); Radiaciones(28:36,:);
Radiaciones(1:9,:); Radiaciones(19:27,:); Radiaciones(37:
45,:)];
P=[];
for i=1:5 %matriz de entradas global
P=[P; Radiaciones(1:9,:); Temp(1:2,:); Nubosidades(1:3,:)];
Radiaciones(1:9,:)=[];
Temp(1:2,:)=[];
Nubosidades(1:3,:)=[];
end

173
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PRO...\RedSolar.m 3/7

Eliminaciones=[]; %vector con los elementos que luego se


eliminaran de la matriz de entradas

if ~Tmax; Eliminaciones=[Eliminaciones, 10:14:70]; end

if ~Tmin; Eliminaciones=[Eliminaciones, 11:14:70]; end

if ~nub; Eliminaciones=[Eliminaciones, 12:14:70, 13:14:70, 14:


14:70]; end

if ~P10; Eliminaciones=[Eliminaciones, 2:14:70, 5:14:70, 8:14:


70]; end

if ~P90; Eliminaciones=[Eliminaciones, 3:14:70, 6:14:70, 9:14:


70]; end

P(Eliminaciones,:)=[];
filas=size(P,1);
entradasPorRegion =filas/5;
Eliminaciones=[];
if ~madrid; Eliminaciones=[Eliminaciones, 1:entradasPorRegion];
end
if ~cReal; Eliminaciones=[Eliminaciones, (entradasPorRegion+1):
2*entradasPorRegion]; end
if ~coruna; Eliminaciones=[Eliminaciones,
(2*entradasPorRegion+1):3*entradasPorRegion]; end
if ~vigo; Eliminaciones=[Eliminaciones,
(3*entradasPorRegion+1):4*entradasPorRegion]; end
if ~leon; Eliminaciones=[Eliminaciones,
(4*entradasPorRegion+1):5*entradasPorRegion]; end

P(Eliminaciones,:)=[];

P_final = P;
T_final1 = T1;
T_final2 = T2;
filas_entradas=size(P,1);

%
===============================================================
===========
% NORMALIZACIÓN
%
===============================================================
===========

filas_entrada = size(P,1);

174
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PRO...\RedSolar.m 4/7

maxEntrada = zeros(1,filas_entrada);
maxSalidaH = zeros(1,size(T2,1));

for i=1:filas_entrada
maxEntrada(i) = max(P(i,:)');
P(i,:) = P(i,:)/maxEntrada(i);
end

for i=1:size(T2,1)
maxSalidaH(i) = max(T2(i,:)');
T2(i,:) = T2(i,:)/maxSalidaH(i);
end

maxSalidaD = max(T1');
T1 = T1/maxSalidaD;

%
===============================================================
===========
% SELECCIÓN DE CONJUNTOS
%
===============================================================
===========

T = cell(2,1);
T{1,1} = T1;
T{2,1} = T2;
P_mat=P;
P=cell(1);
P{1,1}=P_mat;
diasEnt= diasTotales-numeroPruebas;

P_test=P{1,1}(:,(diasEnt+1):diasTotales);
P{1,1}=P{1,1}(:,1:diasEnt);

iival = [5:5:diasEnt];
iitr = [1:5:diasEnt 2:5:diasEnt 3:5:diasEnt 4:5:diasEnt];

%conjunto de validacion
val.P{1,1}= P{1,1}(:,iival);
val.T{1,1}=T{1,1}(:,iival);
val.T{2,1}=T{2,1}(:,iival);

%conjunto de entrenamiento
P{1,1}=P{1,1}(:,iitr);
T{1,1}=T{1,1}(:,iitr);
T{2,1}=T{2,1}(:,iitr);

175
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PRO...\RedSolar.m 5/7

%
===============================================================
===========
% RED NEURONAL
%
===============================================================
===========

net = network; %creación del objeto RN

net.numInputs = 1; %número de matrices de entrada

capas = 6;
net.numLayers = capas; % numero de capas, incluidas las de
salida.
for i=1:capas
net.biasConnect(i) = 1; %activación del bias en cada capa
end
%Conexiones de las capas entre sí, con los inputs y con las
salidas (targets)
net.inputConnect(1,1) = 1; %primera capa primera subred--
>inputs
net.inputConnect(4,1) = 1; %primera capa segunda subred--
>inputs
net.layerConnect = [0 0 0 0 0 0; 1 0 0 0 0 0; 0 1 0 0 0 0; 0 0
1 0 0 0;
0 0 0 1 0 0; 0 0 0 0 1 0]; %conexiones de las capas
net.outputConnect = [0 0 1 0 0 1]; %activación de outputs de
una capa
net.targetConnect = [0 0 1 0 0 1]; %conexión de las salidas
objetivo con las capas de salida

%Preparación de los inputs


net.inputs{1}.range = minmax(P{1,1});
net.inputs{1}.size = size(P{1,1},1);
%Preparación e inicialización de las capas
net.layers{1}.size = N11; %número de neuronas
net.layers{1}.transferFcn = Fcapas; %función de transferencia
net.layers{2}.size = N12;
net.layers{2}.transferFcn = Fcapas;
net.layers{3}.size = 1;
net.layers{3}.transferFcn = Fout;
net.layers{4}.size = N21;
net.layers{4}.transferFcn = Fcapas;
net.layers{5}.size = N22;
net.layers{5}.transferFcn = Fcapas;
net.layers{6}.size = size(T{2,1},1);
net.layers{6}.transferFcn = Fout;
for i=1:capas
net.layers{i}.initFcn = 'initnw' ; %inicialización de las

176
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PRO...\RedSolar.m 6/7

capas
end

%Funciones de la RN
net.initFcn = 'initlay' ; %función de inicialización
net.performFcn = 'mse' ;
if BR
net.trainFcn = 'trainbr' ; %entrenamiento BR
else
net.trainFcn = 'trainlm' ; %entrenamiento L-M
end

%parámetros de la RN
net.trainParam.epochs = epocas; %máximo de épocas de
entrenamiento
net.trainParam.goal = 1e-3; %objetivo de error
net.trainParam.max_fail = max_fail;
net.trainParam.show =2;
if ~ensenarEntrenamiento
net.trainParam.show = NaN; %visualización de la ventana de
entrenamiento
end
net=init(net);

%entrenamos la red
[net,tr,Y] = train(net,P,T,[],[],val);

%
---------------------------------------------------------------
-----------
% GRÁFICAS Y ERRORES
%
---------------------------------------------------------------
-----------

%Desnormalizamos%%%%%%%%%%%

if Pprev~=0
prediccion = sim(net,P_test{1,1});
prediccion1 = prediccion(1,:);
prediccion(1,:)=[];
prediccion2 = prediccion;

for i=1:size(prediccion2,2)
for j=1:size(prediccion2,1)
prediccion2(j,i) = prediccion2(j,i)*maxSalidaH
(j);
end
prediccion1(i) = prediccion1(i)*maxSalidaD;
end

177
C:\Documents and Settings\Carlos\Escritorio\2008-2009\PRO...\RedSolar.m 7/7

end

if ensenarPrediccionFinal
figure
plot(T{1,1})
hold on
plot(Y{1,1}(1,:),'g' )
end

%salidas
red=net;
errores_red = tr.perf(size(tr.perf,2));
prevision.diaria = prediccion1;
prevision.horaria = prediccion2;

%tiempo de ejecucion de la funcion


tiempo =toc;

end

178
DOCUMENTO 2
PRESUPUESTO
Universidad Pontificia de Comillas - PFC

ÍNDICE

ÍNDICE...................................................................................................................................2

I. PRESUPUESTO ........................................................................................................3

Carlos Entrena Moratiel 2


Universidad Pontificia de Comillas - PFC

I. PRESUPUESTO

Se presentan en este documento los cálculos indicativos del


coste del proyecto, en caso de comprarse software y hardware al
efecto, y contratar a un ingeniero para programarlo. Se supone que los
datos climáticos y de producción ya están disponibles para otras
aplicaciones o son gratuitos. Se dividen en:

- Mano de obra
- Software
- Hardware

Coste de la mano de obra

El coste de la hora de un ingeniero es 55€. La herramienta de


previsión se ha desarrollado en unas 220 horas. Por tanto el coste de
la mano de obra es de:

  
   55 € · 220 . €

Coste del software

Se requiere para programar la herramienta:

- MATLAB: 1.950€
- Neural Network Toolbox: 1.000€
- Microsoft Office 2007 PYME: 639€

   . !"#€

Carlos Entrena Moratiel 3


Universidad Pontificia de Comillas - PFC

Coste del hardware

Un PC portátil común, dotado de Windows, es suficiente. En


función de los precios de mercado, que suelen ser más caros que los
que pagan las empresas, se obtiene:

 $
  !€

Coste total del proyecto

 % 500 & 3.589 & 12.100 +. "#€

Este presupuesto es totalmente indicativo, pues se han


sobreestimado los factores. Por ejemplo, en toda empresa hay licencias
de Microsoft Office y PCs, así que habría que calcular qué proporción
de las amortizaciones de dichos activos corresponden al proyecto.

Carlos Entrena Moratiel 4

You might also like