% Arquivo para o Treinamento da Rede Neural com os Dados do Controlador PID
% Título: Projeto de Controle da Temperatura do Tanque de
% Mistura de Água - Planta Didática SMAR - Rede Neural. 
% O metodo usado é de Backpropagation do erro
% A arquitetura neural utilizada está disposta da seguinte maneira: 
% 3 neurônios na primeira camada, 20 neurônios na escondida e 1 na ultima 
% camada. A função de ativação da camada escondida é tangente sigmoidal e  
% da camada de saida Logaritmo Sigmoidal.
% Os pesos Treinados são salvados no arquivo pesos.mat para logo ser usado
% no controle neural
% Alunos: Jefersson Martins Cury e Antônio Julio de Almeida Amoras
% Prof.: Dr. Alberto Jose Alvares
% Curso: Automação de Processos - Redes Industriais e Instrumentação
% Inteligente
clc
clear all
alpha=0.01; % Fator de Apredizagem
load data; % Carregando a data de conhecimento para a RN na forma de vetor 
load pesos;
janela = 999;
sp = VtrFy32Sp(:,80:janela); % Vetor de dados do Set Point
pv = VtrTit32Ai(:,80:janela); % Vetor de dados Variavel do Processo Tit32Ai
mv = VtrFy32Ao(:,80:janela); % Vetor de dados Variavel de Controle Fy32Ao
y(1) = mv(1); % valor antigo mv(k-1)
y(2) = mv(2); % valor antigo mv(k-2)
for cc = 1:1000
for k=3:janela-80
    ep(k) = sp(k)-pv(k);
    x = [y(k-1) y(k-2) ep(k)]';
    %--------------------- Saida das Neuronas Ocultas ---------------------
    Zin = V*x;
    Z = tansig(Zin+Vo);
    %-------------------------- Saida da Rede -----------------------------
    Yin = W'*Z;
    Y = logsig(Yin+Wo); %Se as Saidas são nodos
    %--------------- Atualizando os Pesos da Camada de Saida --------------
    y(k) = Y;
    e = mv(k)- 100*y(k);
    delta = e*dlogsig(Yin,Y); %Se as Saidas são Neuronas                 
    AW = alpha*delta*Z;
    AWo = alpha*delta;
    W = W + AW;
    Wo = Wo + AWo;
    %----------------- Atualizando os Pesos da Camada Oculta --------------
    deltainJ = delta*W;
    deltaJ = deltainJ.*dtansig(Zin,Z);  
    AV = alpha*deltaJ*x';
    AVo = alpha*deltaJ;
    V = V + AV;                    
    Vo = Vo + AVo;
    ee(k-2)=e/100;
end
ec(cc)=sum(ee.^2)/2;
end
save pesos V Vo W Wo ee
maximo = max(ee(:,100:250)); % maximo valor do erro de treinamento
minimo = min(ee(:,100:250)); % minimo valor do erro de treinamento
dif = maximo - minimo; 
%plot(0:268,ee) % Grafico do erro en função do Nro de Muestras.
plot(0:999,ec) % Grafico do erro en função do Nro de Muestras.
%title('Erro')