% ###################################################################
% 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 Hierbó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',5,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;
    wi=(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);
fprintf('\n Média do erro quadrático da aproximação no intervalo [-T/4 ,T/4] = %d (%d)',Er, (Er_T));

% #####################
%       GRAFICOS
% #####################
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');
print([path_figures,'tansig_periodica'],formattype,formatoptions); 


% Harmónicos da Série de Fourier
Ffh=A(:,1)*sigma(1);
for i=1:m
    Ffh=[Ffh A(:,i)*sigma(i)];
end
figure(2);
h=plot(x,Ff,'k',x,Ffh);
set(h,'Linewidth',2);
title('Fourier harmonics');
lg=[repmat('w',m,1) num2str((1:m)')]
legend(lg)

% ----------------------
function T=my_tansig(x)
% Tangente hiperbólica
T=(exp(x)-exp(-x))./(exp(x)+exp(-x));
end
