Estoy diseñando una interfaz gráfica con GUI para matlab, y tengo un problema,
MI interfaz tiene dos botones, en el primero tengo programada las órdenes para entrenar una red neuronal, en el segundo, las propias para hacer una simulación con dicha red.
El problema es que cuando ejecuto la simulación, matlab me da un error diciendo que no tiene guardada la variable RED_ENTRENADA, que par mi es la red neuronal entrenada en el anterior botón. Quisiera me ayudaran con este problema porque no puedo seguir :(
gracias, un saludo.
PD: adjunto códigos de ambos botones, el programa es mas largo.
function red_Callback(hObject, eventdata, handles)
Xusuario=xlsread('usuarios_registrados.xlsx');% datos del usuario
Xfecha=xlsread('laborabilidad y eventos.xlsx');% fechas, contiene mes, dia, hora, laborabilidad y evento
X=xlsread('entradas_parking.xlsx');%datos historicos de variables de entrada
Y=xlsread('demanda_esperada_parking.xlsx');%datos historicos de demanda electrica
Xpuntos=xlsread('punto de recarga_parking.xlsx');%datos asociados a cada punto de recarga
Xmeteo=xlsread('meteorologia.xlsx');%datos meteorologico asociado a cada punto
%----------------------------------------------------------------------%
%ADECUAR CADA VARIABLE AL RANGO [-1,1]
%MATRIZ X DE VARIABLES DE ENTRADA, CON DATOS PARA EL ENTRENAMIENTO DE LA RED NEURONAL.
%LAS VARIABLES SE MUEVEN EN LOS RANGOS ESPECIFICADOS A CONTINUACION
X1=(2.*X(1,:)-13)./11;%MES DEL AÑO [01,12]
X2=(X(2,:)-4)./3;%DIA DE LA SEMANA [01,07]
X3= (2*X(3,:)-23)./23;%HORA DEL DIA [00,23]
X4= X(4,:)*2-1;%LABORABLE O NO LABORABLE[0,1]
X5= X(5,:)*2-1;%EVENTOS EN LA ZONA DEL PUNTO [0,1]
X6= (X(6,:)-3)./2; %INFORMACION ECONOMICA [1,5]
X7= ((2*X(7,:))./5)-1; %MEDIA COCHES HORARIO [0,5]
X8= X(8,:)./40-0.5;%TEMPERTURA HORARIA [-20,60]
X9= X(9,:)*2-1;%LLUEVE O NO LLUEVE [0,1]
%FORMAR UNA MATRIZ X_NORM CON LOS VECTORES ANTERIORES
X_NORM=[X1;X2;X3;X4;X5;X6;X7;X8;X9];
%MATRIS Y DE DATOS DE DEMANDA EÉCTRICA HISTÓRICA PARA EL ENTRENAMIENTO
%NORMALIZAR LOS DATOS DE LA DEMANDA ESPERADA
[yn,ys]=mapminmax(Y,-1, 1);
%------------------------------------------------------------------------%
%INICIALIZACION, PARAMETRIZACION Y ENTRENAMIENTO DE LA RED NEURONAL.
%DEFINIMOS LA RED Y LA INICIALIZAMOS
%W = initzero(6,[-1 1;-1 1;-1 1;-1 1;-1 1;-1 1;-1 1;-1 1;-1 1]);%pesos inicializados a 0
%b = initzero(6,[1 1]);%bias inicializados a 0
RED=newff([-1 1;-1 1;-1 1;-1 1;-1 1;-1 1;-1 1;-1 1;-1 1],[5 1],{'tansig','purelin'},'trainlm');
RED= init(RED);%inicializar los pesos de las funciones
RED.initFcn='initlay';
RED.layers{1}.initFcn='initnw';
%PREDETERMINAR LOS PARÁMETROS DE LA RED
RED.trainParam.goal = 0.00;%objetivo entrenamiento
RED.trainParam.show = 20;%visulaizacion del entrenamiento de la red
RED.trainParam.epochs=1000;%ciclos de entrenamiento
disp('ENTRENANDO LA RED NEURONAL...ESPERE POR FAVOR')
%ENTRENAMIENTO DE LA RED
[RED_ENTRENADA, tr]=train (RED, X_NORM, yn);
handles.RED_ENTRENADA=RED_ENTRENADA;
guidata(hObject,handles)
%SIMULACIÓN DE LA RED
%LA SIMULACION DE LA RED CON LOS DATOS INTRODUCIDOS SE ENCUENTRA EN OTRO
%FICHERO PARA QUE SE PUEDA DESACOPLAR EL ENTRENAMIENTO DE LA SIMULACIÓN
% --- Executes on button press in prediccion.
function prediccion_Callback(hObject, eventdata, handles)
Xfecha=xlsread('laborabilidad y eventos.xlsx');% fechas, contiene mes, dia, hora, laborabilidad y evento
X=xlsread('entradas_parking.xlsx');%datos historicos de variables de entrada
Y=xlsread('demanda_esperada_parking.xlsx');%datos historicos de demanda electrica
Xpuntos=xlsread('punto de recarga_parking.xlsx');%datos asociados a cada punto de recarga
Xmeteo=xlsread('meteorologia.xlsx');%datos meteorologico asociado a cada punto
%con esto estoy cogiendo la posicion del elemento en el menu, como es
%numerico, no tengo problema
x_1=(get(handles.popupmenu9,'Value'));
x_2=(get(handles.dias,'Value'));
x_3=(get(handles.horas,'Value'));
x_1_f=(get(handles.popupmenu4,'Value'));
x_2_f=(get(handles.popupmenu5,'Value'));
x_3_f=(get(handles.popupmenu7,'Value'));
num=str2double(get(handles.num,'string'));
if isnan(num)
errordlg('You must enter a numeric value', 'Bad Input', 'modal')
end
if num<=0
errordlg('You must enter a positive value', 'Bad Input', 'modal')
end
x_3=x_3-1;
x_3_f=x_3_f-1;
if x_1==x_1_f && x_2==x_2_f && x_3~=x_3_f
h=abs(x_3_f-x_3); %distancia entre hora final y hora inicial en absoluto
for j=1:1:h+1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2;
fecha_inicial(j,4)=x_3+j-1;
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
else
% SI ESTA EN HORAS Y DIAS DISTINTOS
if x_1==x_1_f && x_2~=x_2_f && x_3~=x_3_f
d=abs(x_2_f-x_2)+1; %distancia entre dia final y dia inicial
h= 24*d-(24-x_3_f)-(x_3-1); %distancia entre hora final y hora inicial en absoluto
for j=1:1:(24-x_3)
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2;
fecha_inicial(j,4)=x_3+j-1;
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
inicio=25-x_3;% valor en el que tiene que empezar el bucle de dias enteros
for j=(inicio):1:(inicio+24*(d-2))%todo lo que queda por rellenar
if j>=inicio && j<=(inicio+24)-1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+1;
fecha_inicial(j,4)=j-inicio;
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
if j>(inicio+24)-1 && j<=(inicio+24*2);
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+2;
fecha_inicial(j,4)=j-(inicio+24);
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
if j>(inicio+24*2)-1 && j<=(inicio+24*3)-1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+3;
fecha_inicial(j,4)=j-(inicio+24*2);
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
if j>(inicio+24*3)-1 && j<=(inicio+24*4)-1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+4;
fecha_inicial(j,4)=j-(inicio+24*3);
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
if j>(inicio+24*4)-1 && j<=(inicio+24*5)-1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+5;
fecha_inicial(j,4)=j-(inicio+24*4);
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
% for k=1:1:d-2 %bucle por tipo de dia, dentro de 0 a 23 horas
% fecha_inicial(j,1)=x_1;
end
end
for j=(h-x_3_f):1:h
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+d-1;
fecha_inicial(j,4)=x_3+j-24*(d-1)-1;
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
%SI ESTA LA MISMA HORA PERO DISTINTO DIA
if x_1==x_1_f && x_2~=x_2_f && x_3==x_3_f %DISTINTO DIA MISMA HORA
d=abs(x_2_f-x_2)+1; %distancia entre dia final y dia inicial
h= 24*(d-1)+1; %distancia entre hora final y hora inicial en absoluto
for j=1:1:(24-x_3)
fecha_inicial(j,1)=2011;
fecha_inicial(j,1)=x_1;
fecha_inicial(j,2)=x_2;
fecha_inicial(j,3)=x_3+j-1;
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
inicio=25-x_3;% valor en el que tiene que empezar el bucle de dias enteros
for j=(inicio):1:(inicio+24*(d-2))%todo lo que queda por rellenar
if j>=inicio && j<=(inicio+24)-1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+1;
fecha_inicial(j,4)=j-inicio;
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
if j>(inicio+24)-1 && j<=(inicio+24*2)
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+2;
fecha_inicial(j,4)=j-(inicio+24);
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
if j>(inicio+24*2)-1 && j<=(inicio+24*3)-1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+3;
fecha_inicial(j,4)=j-(inicio+24*2);
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
if j>(inicio+24*3)-1 && j<=(inicio+24*4)-1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+4;
fecha_inicial(j,4)=j-(inicio+24*3);
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
if j>(inicio+24*4)-1 && j<=(inicio+24*5)-1
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+5;
fecha_inicial(j,4)=j-(inicio+24*4);
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
end
end
for j=(h-x_3_f):1:h
fecha_inicial(j,1)=2011;
fecha_inicial(j,2)=x_1;
fecha_inicial(j,3)=x_2+d-1;
fecha_inicial(j,4)=x_3+j-24*(d-1)-1;
fecha_inicial(j,5)=00;
fecha_inicial(j,6)=00;
end
end
j=size(fecha_inicial,1); %TAMAÑO VECTOR DE FECHAS
%------------------------------------------------------------------------%
%DEFINIR VECTORES DE LAS VARIABLES DE ENTRADA PARA ALMACENARLAS
x_1=[1,j];
x_2=[1,j];
x_3=[1,j];
x_4=[1,j];
x_5=[1,j];
x_6=[1,j];
x_7=[1,j];
x_8=[1,j];
x_9=[1,j];
%ALMACENAR DATOS NECESARIOS PARA SIMULAR LA RED.
%ESTOS DATOS SE COGEN DE .XLSX PERO DEBERÍAN SER DATOS ONLINE PARA QUE
%FUERA REALISTA
for k=1:1:j
%DATOS DE MES, DIA Y HORA
x_1(1,k)=fecha_inicial(k,2);%almacena meses
x_2(1,k)=fecha_inicial(k,3);%almacena dias
x_3(1,k)=fecha_inicial(k,4);%almacena horas
%DATOS DE LABORABILIDAD Y EVENTOS
for i=1:1:size(Xfecha,1)
if Xfecha(i,1)==fecha_inicial(k,2) && Xfecha(i,2)==fecha_inicial(k,3) && Xfecha(i,3)==fecha_inicial(k,4)
x_4(1,k)= Xfecha(i,4);%dato de laborable o no
x_5(1,k)= Xfecha(i,5);%dato evento o no (en zona punto de carga)
end
end
%DATOS DE ECONOMIA, RUTAS, MEDIA USO HORARIO, HACE FALTA BASE DATOS PUNTOS_RECARGAS.
for i=1:1:size(Xpuntos,1)
if Xpuntos(i,1)==num && Xpuntos(i,2)==fecha_inicial(k,2) && Xpuntos(i,3)==fecha_inicial(k,3) && Xpuntos(i,4)==fecha_inicial(k,4)
x_6(1,k)=Xpuntos(i,5);% información economica de la zona
x_7(1,k)=Xpuntos(i,6);%%media uso horario de coches
end
end
%DATOS TEMPERATURA, LLUVIA Y NUBOSIDAD, HACE FALTA BASE DATOS METEOROLOGIA
for i=1:1:size(Xmeteo,1)
if Xmeteo(i,1)==num && Xmeteo(i,2)==fecha_inicial(k,2) && Xmeteo(i,3)==fecha_inicial(k,3) && Xmeteo(i,4)==fecha_inicial(k,4)
x_8(1,k)=Xmeteo(i,5);%temperatura horaria
x_9(1,k)=Xmeteo(i,6);%llueve o no llueve
end
end
end
%-----------------------------------------------------------------------%
%NORMALIZO EL DATO QUE QUE INTRODUCIDO EL USUARIO
for k=1:1:j
X_1(1,k)=(2.*x_1(1,k)-13)./11;%MES DEL AÑO [01,12]
X_2(1,k)= (x_2(1,k)-4)./3;%DIA DE LA SEMANA [01,07]
X_3(1,k)= (2*x_3(1,k)-23)./23;%HORA DEL DIA [00,23]
X_4(1,k)= x_4(1,k)*2-1;%LABORABLE O NO LABORABLE[0,1]
X_5(1,k)= x_5(1,k)*2-1;%EVENTOS EN LA ZONA DEL PUNTO [0,1]
X_6(1,k)=(x_6(1,k)-3)./2; %INFORMACION ECONOMICA [1,5]
X_7(1,k)= ((2*x_7(1,k))./5)-1; %MEDIA COCHES HORARIO [0,5]
X_8(1,k)= x_8(1,k)./40-0.5;%TEMPERTURA HORARIA [-20,60]
X_9(1,k)= x_9(1,k)*2-1;%LLUEVE O NO LLUEVE [0,1]
end
%FORMAR UNA MATRIZ x_norm CON LOS VECTORES ANTERIORES
x_norm=[X_1;X_2;X_3;X_4;X_5;X_6;X_7;X_8;X_9];
for i=1:1:j
Yf(1,i) = RED_ENTRENADA(x_norm(:,i)); <-------------- %%AQUI ESTA MI PROBLEMA%%
YF(1,i)= mapminmax('reverse',Yf(1,i),ys);
end
xlswrite('resultados_simulacion.xlsx',YF,'x1','A1')
disp('demanda esperada en el intervalo de fecha introducido')
v = [fecha_inicial(:,:)]; %#ok<NBRAK>
k=size(v,1);
n= datestr(v);
x=datevec(n);
startDate=datenum(n);
primera=startDate(1,1);
endDate=datenum(n);
ultima=endDate(k,1);
xData=linspace(primera,ultima,k);
YF=[1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6];mi problema esta