clear all
close all
clc

P = 0:.02:1;
T =1+exp(-P).*sin(2*pi*P-pi/2);

plot(P,T,'r+');
xlabel('Vectori prototip');
ylabel('Vectori tinta');

disp('Apasati o tasta pt a seta parametrii retelei neuronale...');
pause;

neur=input('\n\nNumarul de neuroni de intrare: ');
sigm=newff(minmax(P),[neur 1],{'tansig' 'purelin'},'traingd');

disp('Valorile initiale ale parametrilor:')
disp('     Stratul de intrare:')
sigm.IW{1,1}
sigm.b{1}
disp('     Stratul de iesire:')
sigm.LW{2,1}
sigm.b{2}

iteratii=input('\nNumar de iteratii: '); % 300;
sigm.trainParam.lr=input('\nValoarea ratei de invatare: ');
sigm.trainParam.epochs=1;
sigm.trainParam.goal=2e-4;
sigm.trainParam.show=inf;

figure(1);
hold on;
h=plot(P,sim(sigm,P));
title('Aproximarea initiala');
eroare(1)=mse(T-sim(sigm,P)); %eroarea medie patratica inainte de inceperea antrenarii; vectorul "eroare" va contine evolutia erorii

for i=1:iteratii,
    [sigm,tr]=train(sigm,P,T);
    eroare(i+1)=tr.perf(1);
    pause(0.1);
    delete(h);
    title(strcat('Iteratia:',num2str(i)));
    h=plot(P,sim(sigm,P));
    if eroare(i)<=sigm.trainParam.goal
        break;
    end
end

%evolutia erorii
disp('Apasati o tasta pt a vedea evolutia erorii functie de nr de epoci...');
pause;
iteratii=i; %numarul de epoci cit a durat antenarea
fprintf('Eroarea medie patratica obtinuta este %g\n\n',eroare(i));
fprintf('\n\nAntrenarea a durat %g iteratii\n',iteratii);
disp('Valorile finale ale parametrilor:')
disp('     Stratul de intrare:')
sigm.IW{1,1}
sigm.b{1}
disp('     Stratul de iesire:')
sigm.LW{2,1}
sigm.b{2}

figure;
semilogy((0:iteratii),eroare);
xlabel('iteratii');
ylabel('eroarea');
title('Eroarea medie patratica functie de numarul de iteratii');

disp('Apasati o tasta pt a vizualiza capacitatea de generalizare a retelei antrenate...');
pause;

% verificare capacitate de genralizare a retelei antrenate
Pg1 = -0.1:.02:0;
Tg1 =1+exp(-Pg1).*sin(2*pi*Pg1-pi/2);
Pg2 = 1:.02:1.1;
Tg2 =1+exp(-Pg2).*sin(2*pi*Pg2-pi/2);

figure(1); hold on
plot(Pg1, Tg1, 'r*'); plot(Pg2, Tg2, 'r*');
Yg1= sim(sigm,Pg1); Yg2= sim(sigm,Pg2);
plot(Pg1, Yg1, 'g-');  plot(Pg2, Yg2, 'g-');
hold off;
