Professional Documents
Culture Documents
AGRADECIMIENTOS
A mis profesores del ICAI y del École Centrale Paris, por lo que
me han enseñado.
RESUMEN
SUMMARY
ÍNDICE
I. ANTECEDENTES ..................................................................................................9
1. OBJETIVOS ...................................................................................................... 26
2. METODOLOGÍA ............................................................................................. 28
1. INTRODUCCIÓN............................................................................................ 47
7. RESULTADOS................................................................................................. 86
2. FUNCIONES .................................................................................................... 97
ÍNDICE DE FIGURAS Y
TABLAS
Ec. 6- ER ......................................................................................................................... 51
Ec. 16- condición que debe cumplir una franja horaria para ser
incorporada al modelo ............................................................................................................. 103
PARTE I –
MEMORIA
I. ANTECEDENTES
1. LA ENERGÍA SOLAR
2. LA ENERGÍA SOLAR FV EN
EUROPA Y EN ESPAÑA
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
3. REGULACIÓN ECONÓMICA
DEL SECTOR SOLAR
FOTOVOLTAICO
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
4. PREDICCIÓN DE UN SISTEMA
CON ENERGÍA SOLAR
Motivación
II. OBJETIVOS Y
METODOLOGÍA
1. OBJETIVOS
2. METODOLOGÍA
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
1. EL SISTEMA NERVIOSO Y LA
NEURONA BIOLÓGICA
2. LA RED NEURONAL
ARTIFICIAL
Neurona simple
·
Capa de neuronas
Funciones de transferencia
1
1
Ec. 2- función de transferencia sigmoidea
1
1
Ec. 3- función tangente hiperbólica
Tipos de redes
3. ENTRENAMIENTO Y USO DE
REDES NEURONALES
4. APLICACIONES DE REDES
NEURONALES
IV. CREACIÓN Y
OPTIMIZACIÓN DEL MODELO
DE PREDICCIÓN
1. INTRODUCCIÓN
2. TIPOS DE ERROR
MSE
Y Y
#$
Ec. 5- MSE
Donde:
N: número de días.
Error Real
Ec. 6- ER
Error en Energía
"
1 !# |
|)# )
*
#$
"
1 |%# %&# |
1
#$
)# * · %#
!# * · %&#
)
"
1 |),# )!,# |
+,
*,
#$
"
1 ∑. !
,$ |),# ),# |
+
∑. ,$ *,
#$
Conclusión
3. ARQUITECTURAS DE REDES
NEURONALES
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.
Fig. 10-
10 Red Neuronal horaria
Fig. 11-Ejemplo
11 de Red Neuronal serie-paralelo
Fig. 12-
12 Red diaria-horaria con realimentación
Conclusión
4. SELECCIÓN DE VARIABLES
Radiación solar
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
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
Nubosidad
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
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
- P50;
- P50, Nub;
- P50, Tmax;
- P50, Nub, Tmax;
- P50, P10;
- P50, P10, Nub;
- P50, P10, Tmax;
- P50, P10, Nub, Tmax;
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
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
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
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
- P50
- Nubosidad
- Temperatura máxima
- Cada una de ellas en las regiones de Madrid y Ciudad
Real
5. OPTIMIZACIÓN DE LOS
PARÁMETROS DE LA RED
Normalización
Número de neuronas
siguiente:
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
Tipo de entrenamiento
Funciones de transferencia
Conclusiones
6. COMPARACIÓN CON EL
SISTEMA DE PREDICCIÓN POR
PERFILES
7# 8#9
9$
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
7. RESULTADOS
Error Error en
Real Energía
Red Neuronal Diaria 16,37 8,71
Tabla 11- Error para la previsión diaria (%)
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 (%)
Ejemplos de predicciones
Predicciones de prueba
6000
5000
Energía fotovoltaica [kWh]
4000
1000
0
1 5 9 13 17 21 25 29 33 37
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
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
V. DESARROLLO DE UNA
HERRAMIENTA DE
PREVISIÓN
1. ESTRUCTURA DEL
PROGRAMA
Datos iniciales
Datos de salida
2. FUNCIONES
ActualizarBBDD
leerRadiaciones
CrearEstructuraVariables
PrevisionParques
∑U#$ ∑
T
9$ )#9
K;/;E;
V
Ec. 15- media de producción durante un día
Ec. 16- condición que debe cumplir una franja horaria para ser
incorporada al modelo
RedSolar
VI. CONCLUSIONES
1. CONCLUSIONES AL MODELO
DE PREVISIÓN
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.
2. CONCLUSIONES AL
PROTOTIPO DE HERRAMIENTA
DE PREVISIÓN
3. FUTURAS LÍNEAS DE
INVESTIGACIÓN
BIBLIOGRAFÍA
PARTE II –
ESTUDIO
ECONÓMICO
I. ESTUDIO ECONÓMICO
PARTE III –
CÓDIGO
FUENTE
%
===============================================================
===========
% OPCIONES
%
===============================================================
===========
%
===============================================================
===========
% 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
%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' ;
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';
%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
%
===============================================================
===========
% 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 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
===========
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
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
%
===============================================================
=======
[vectorMediaErrores,vectorMedianas,vectorDesviaciones,
vectorMSE] = EstadisticasPrueba(ResVar,iteraciones);
end
%
===============================================================
===========
% ITERACIÓN DE NEURONAS
%
125
C:\Documents and Settings\Carlos\Escritorio\2008-2...\prueba_toledo.m 8/13
===============================================================
===========
if iterarNeuronas
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);
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
%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)
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
%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
%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
%inicializamos Res.
errores=struct;
net= '';
prediccion=struct;
prueba=struct;
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);
error
end
131
C:\Documents and Settings\Carlos\Escritorio\2008-2009\...\VectorMeses.m 1/1
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
%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
135
C:\Documents and Settings\Carlos\Escritorio\200...\ProbarRedVariables2.m 2/2
%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
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
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';
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
%
===============================================================
===========
% 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;
%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
%
===============================================================
===========
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;
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
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
===============================================================
===========
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
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
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
%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
===========
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
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
%
===============================================================
===========
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;
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
%Segunda red:
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
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;
%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
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;
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
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
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
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);
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
ruta='BBDD.mat' ;
tiempoActualizacion=ActualizarBBDD(ruta);
EV=CrearEstructuraVariables();
[prevision,errores_prueba,errores_red] = PrevisionParques(ruta,
EV, diaPrueba )
160
C:\Documents and Settings\Carlos\Escritorio\2008-20...\ActualizarBBDD.m 1/2
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
[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)=[];
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
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=[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:
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
function estacion=CalculaEstacion(diaEntrada)
FF='dd/mm/yyyy';
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
function EV = CrearEstructuraVariables()
%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
end
167
C:\Documents and Settings\Carlos\Escritorio\2008-2...\PrevisionParques.m 1/4
%
===============================================================
===========
% Funcion para hacer una prevision de la produccion.
%
===============================================================
===========
%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
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
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,:);
%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:
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
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);
%
===============================================================
===========
% 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
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
%
===============================================================
===========
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
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;
end
178
DOCUMENTO 2
PRESUPUESTO
Universidad Pontificia de Comillas - PFC
ÍNDICE
ÍNDICE...................................................................................................................................2
I. PRESUPUESTO ........................................................................................................3
I. PRESUPUESTO
- Mano de obra
- Software
- Hardware
55 € · 220
. €
- MATLAB: 1.950€
- Neural Network Toolbox: 1.000€
- Microsoft Office 2007 PYME: 639€
$
!€