% ###################################################################
% Desenho da função tangente hiperbólica e da sua variante periódica
% ###################################################################

%formattype='-djpeg'; % JPEG
%formattype='-deps';  % EPS
formattype='-dpng';  % PNG
formatoptions='-r600';  % Resolução (outras resoluções -r300 ; -r1200
path_figures=['.\figures\'];

T=16; % Periodo da Função
% Frequência e frquência angular fundamental
f=1/T;
wo=2*pi*f;

m=8;  % n . de harmónicos da Série de Fourier

% ----- Função tangente hiperbólica ------
x1=(-T/2:T/1000:T/2)';
F1=my_tansig(x1);
% ----------------------------------------

% ----- Função hiberbólica multi-simétrica de período T -----
x=(-T/2:T/1000:T/2)';
F=my_tansig(x);

I=x<-T/4;
F(I)=my_tansig(-x(I)-T/2);

I=x>=T/4;
F(I)=my_tansig(-x(I)+T/2);
% ----------------------------------------------------------

% Calculo dos coeficientes da Série de Fourier => Método dos minimos
% quadrados
A=sin(wo.*x);
for  i=2:m
    wi=(2*i-1)*wo;
    %d=factorial(2*i-1);
    A=[A sin(wi.*x)];
end

a=inv(A'*A)*A'*F; % Parametros da Decomposição de Fourier (Método minimos quadrados)

Ff=A*a; % Ff -> curva da Série de Fourier

%% Erro da aproximação da Função Tangente Hiperbólica multi-simétrica (no
% intervalo [-T/2, T/2])

E=mean((F-Ff).^2); 
fprintf('\n Média do erro quadrático da aproximação com %d termos no intervalo [-T/2 ,T/2]= %d',m,E);

% Erro no intervalo [-T/4, +T/4]
xr=(-T/4:T/1000:T/4)';
Fr=my_tansig(xr);

Ffr=a(1)*sin(wo.*xr);
for i=2:m
    wi=(2*i-1)*wo;
    %d=factorial(2*i-1);
    %Ffr=Ffr+a(i)*sin(wi.*xr)/d;
    Ffr=Ffr+a(i)*sin(wi.*xr);
end
Er=mean((Fr-Ffr).^2).*T/1000;

%% Valor teórico do cálculo do integral do Erro no intervalo [-T/4 , T/4]
sigma=a; %.*1./factorial(1:m)';
Er_T=(1-4/T*my_tansig(T/4)-0.5*sum(sigma.^2))*T/2;
fprintf('\n Média do erro quadrático da aproximação no intervalo [-T/4 ,T/4] = %d (%d)',Er, (Er_T));

% #####################
%       GRAFICOS
% #####################
hf(1)=figure(1);
h=plot(x1,F1,'k',x,Ff,'b--');
set(h,'linewidth',2);
hold on;
plot([-1;-1]*T/4,[-1 1],'k--',[1;1]*T/4,[-1 1],'k--',[-1;1]*T/2,[0 0],'k--');
hold off;
grid on;
ylim([-1,1]);
xlabel('$x$','Interpreter','latex');
ylabel('$\phi(x) \:\:\: \& \:\:\: \Phi(x)$','Interpreter','latex');
legend('$\phi(x)$','$\Phi(x)$','Interpreter','latex','Location','NorthWest')
%print([path_figures,'tansig_periodica'],formattype,formatoptions); 

% Harmónicos da Série de Fourier
Ffh=A(:,1)*sigma(1);
for i=2:m
    Ffh=[Ffh A(:,i)*sigma(i)];
end
hf(2)=figure(2);
h=plot(x,Ff,'k',x,Ffh);
set(h,'linewidth',2);
title('Fourier harmonics');
xlabel('$a$','Interpreter','latex');
%text(0,1,'\Phi(a)');

lg=[repmat('w_',m,1) num2str((1:m)') repmat('    ',m,1)];
lg=['\Phi(a)';lg]
legend(lg,'FontSize',7,'Location','southeast')

% Repartição da função de activação
hf(3)=figure(3);
clf;
hold on;
k=1;
for alfa=1:-0.125:0
F1=a(1)*sin(wo.*xr.*alfa).*cos(wo.*xr.*(1-alfa));
F2=a(1)*cos(wo.*xr.*alfa).*sin(wo.*xr.*(1-alfa));
for i=2:m
    wi=(2*i-1)*wo;
    F1=F1+a(i)*sin(wi.*xr.*alfa).*cos(wi.*xr.*(1-alfa));
    F2=F2+a(i)*cos(wi.*xr.*alfa).*sin(wi.*xr.*(1-alfa));
end
subplot(1,9,k)
h=plot(xr,F1,'k',xr,F2,'b',xr,F1+F2,'m');
set(h(1:2),'linewidth',2);
title(['\eta =',num2str(alfa)]);
xlabel('$a$','Interpreter','latex');
str='${\varphi _{j}}\left( {\eta  \times a,\left( {1 - \eta } \right) \times a} \right){\rm{ }}|{\rm{ }}$';
ylabel(str,'Interpreter','latex');
k=k+1;
end
hold off;

str=['.\figures\','tanh_decomposicao','_'];
set(hf(3),'Position',[6 630 1900 340]);
for i=1:3
    strfig=[str,'fig',num2str(i),'.png'];
    print(i, strfig, '-dpng','-r1200');
    %print(gcf,'foo.png','-dpng','-r300'); 
end
% ----------------------
function T=my_tansig(x)
% Tangente hiperbólica
T=(exp(x)-exp(-x))./(exp(x)+exp(-x));
end
