%   script per la verifica del fenomeno di Runge
%   (oscillazioni per interpolazioni su nodi equidistanti)

%   vettore contenente i valori di n prescelti per l'esempio
nv = [ 4, 9, 14, 19 ];

figure(1)
clf
hold on

% vettore di punti per i grafici continui
xp = linspace( -1, 1, 251);

for in = 1:length(nv)
    
    n = nv(in);
    i = 0:n;
    %   vettore di n+1 valori equispaziati in [-1,1] 
    xni = -1 + 2*i/n;
    % equivale a xni = linspace( -1, 1, n+1 );
    
    %   funzione da interpolare: 1/(1+25*x^2)
    fni = 1 ./ ( 1 + 25*xni.^2 );
    
    subplot( 2,2, in)
    hold on
    %   disegna i punti interpolati
    plot( xni, fni, 'm*' )
    %   disegna la funzione originaria
    f = 1 ./ ( 1 + 25*xp.^2 );
    plot( xp, f, 'b--' )
    
    %   determina la struttura polinomiale approssimante
    pn = polyfit( xni, fni, n );
    %   valuta il polinomio pn nei punti xp
    fpoly = polyval( pn, xp );
    plot( xp, fpoly, 'r-' )
    
    % tracciamo l'asse y
    plot([0 0], [min([fpoly f]) max([fpoly f])], 'k-')  
    axis tight
    xlabel('x')
    ylabel('y')
    titlestr = ['Grado del polinomio approssimante n = ', num2str(n)];
    title(titlestr)
end
    
    
    