clear all
close all
clc

P = 0:pi/12:pi/2;
T = sin(P);

sigm=newff(minmax(P),[1],{'tansig'},'trainlm'); %crearea neuronului tansigmoidal, ce urmeaza a fi antrenat cu 
                                                %subrutina 'learngd' (metoda gradientului)

%parametrii specifici antrenarii
sigm.trainParam.lr=input('Valoarea ratei de invatare: ');
sigm.trainParam.epochs=1;
iteratii=300;
sigm.trainParam.goal=1.5e-3;
sigm.trainParam.show=inf; %eroarea nu este afisata in timpul antrenarii, deoarece antrenarea este efectuata epoca cu epoca
                          %eroarea va fi memorata la fiecare pas si afisarea va fi facuta la sfirsit

%suprafata erorii
w_range = -4.5:0.5:4.5;;
b_range = -4.5:0.5:4.5;
figure;
ES = errsurf(P,T,w_range,b_range,'tansig')/length(T); %valorile erorii medii patratice
plotes(w_range,b_range,ES,[50 25]);

%alegerea cu mouse-ul a parametrilor initiali ai retelei
subplot(1,2,2);
h = text(mean(get(gca,'xlim')),mean(get(gca,'ylim')),'* Alege cu mouse-ul *');
set(h,'horizontal','center', 'fontweight','bold');
[sigm.IW{1,1},sigm.b{1}] = ginput(1); %valorile alese cu mouse-ul devin parametrii initiali ai retelei
fprintf('\nValoarea ponderii initiale: %g\nValoarea deplasarii initiale: %g\n',sigm.IW{1,1},sigm.b{1});
delete(h);

%antrenarea retelei si reprezentarea la fiecare pas (epoca) a parametrilor pe suprafata de eroare
eroare(1)=mse(T-sim(sigm,P)); %eroarea medie patratica inainte de inceperea antrenarii; vectorul "eroare" va contine evolutia erorii
pondere(1)=sigm.IW{1,1}; %vectorul care va contine evolutia ponderilor
deplasare(1)=sigm.b{1}; %vectorul care va contine evolutia deplasarilor
h=plotep(sigm.IW{1,1},sigm.b{1},eroare(1)); %parametrii initiali reprezentati pe suprafata de eroare (cu eroarea corespunzatoare)

for i=1:iteratii
    [sigm,tr]=train(sigm,P,T);
    h=plotep(sigm.IW{1,1},sigm.b{1},tr.perf(1),h); %evolutia parametrilor pe suprafata de eroare
    title(strcat('Iteratia:',num2str(i)));
    eroare(i+1)=tr.perf(1); %eroarea pt noile valori ale parametrilor
    pondere(i+1)=sigm.IW{1,1};
    deplasare(i+1)=sigm.b{1};
    if eroare(i)<=sigm.trainParam.goal
        break; %iesire pe conditia de atingere a pragului de eraore impus
    end
end
iteratii=i; %numarul de epoci cit a durat antenarea
fprintf('\n\nAntrenarea a durat %g iteratii\n',iteratii);
fprintf('\nEroarea medie patratica obtinuta este %g\n',eroare(iteratii));
fprintf('\n\nValorile parametrilor finali:\nPonderea: %g\nDeplasarea: %g\n\n',sigm.IW{1,1},sigm.b{1});

%evolutia erorii
disp('Apasati o tasta pt a vedea evolutia erorii functie de nr de epoci...');
pause;
figure;
semilogy((0:iteratii),eroare);
xlabel('iteratii');
ylabel('eroarea');
title('Eroarea medie patratica functie de numarul de iteratii');

%dinamica aproximarii
disp('Apasati o tasta pt a vedea aproximarea initiala...');
pause;
figure;
plot(P,T,'r+'); %punctele prin care se doreste aproximarea
xlabel('vectori prototip P');
ylabel('vectori tinta T');
hold on;
h=plot(P,tansig(pondere(1)*P+deplasare(1)));
title('Aproximarea initiala');

disp('Apasati o tasta pt a vedea evolutia dinamica a aproximarii...');
pause;
for i=1:iteratii,
    pause(0.1);
    delete(h);
    h=plot(P,tansig(pondere(i+1)*P+deplasare(i+1)),'b*-');
    title(strcat('Iteratia:',num2str(i)));
end

hold off;
