function [ nx, Ey, Mat ] = factStirling( N )
% 
%   IN: N numero intero
%
%   OUT -
%
%   Stampa a schermo una tabella di k! a confronto con
%   la sua approssimazione di Stirling 
% 
%       S(k) = sqrt( 2 Pi k ) * (k/e)^k
% 
%   e con gli errori assoluto Ea e relativo Er commessi
%   nell'usare l'approssimazione.
% 
%   Inoltre, presenta un grafico di Er vs. k
%   con k = 1 .... n
%
%   (cfr. stirling_app.ods per spreadsheet)
%
%   Nov 07

if nargin < 1 || isempty(N)
    N=10;   % valore di default di N (variabile di chiamata in ingresso)
end

figure(N)
clf
hold on

clc;
e=exp(1);
sep='----------------------------------------------------------------------------';
disp(sep)
fprintf('n\t    n!\t\t S(n)\t\t Ea\t\t Er\t\tErpc\n')
disp(sep)
nfact=1;

fid = fopen('stirling.txt', 'w');
fprintf(fid,sep);
fprintf(fid,'\n');
fprintf(fid,'n\t    n!\t\t S(n)\t\t Ea\t\t Er\t\tErpc\n');
fprintf(fid,sep);
fprintf(fid,'\n');

for n=1:N
   nfact(n) = factorial(n);
   s(n) = sqrt(2*pi*n)*((n/e)^n);
   Ea(n) = abs(nfact(n) - s(n));
   Er(n) = Ea(n)/nfact(n);
   Erpc(n) = Er(n)*100; 
      
   fprintf(fid,'%2d\t %7d\t %10.2f\t %3.2e\t %3.2e\t %3.2f\n',...
      n,nfact(n),s(n),Ea(n),Er(n),Erpc(n) );
  
  plot( n, Er(n), '*r' );
    
  Ey(n) = Er(n);
end

fclose(fid)

nx = 1:N;

fprintf('%2d\t %7d\t %10.2f\t %3.2e\t %3.2e\t %3.2f\n', ...
    [nx;nfact;s;Ea;Er;Erpc] );
  
% creazione di una matrice contenente i dati calcolati
Mat=[nx;nfact;s;Ea;Er;Erpc]';

%plot( nx, Ey, '*r')
plot( nx, Ey, 'k-')

hold off

xlabel('\itn', 'Position', [N-0.5 -0.005])
ylabel('{\itE_r}', 'Rotation', 0, 'Position', [-0.1 Ey(1)] )
title('Errore relativo per l''approssimazione di Stirling di n! vs n')

