%
% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
% Esercitazione n.4 (Enrico Bertolazzi)
%
% Esempio di Runge per verificare la NON CONVERGENZA
% della intepolazione polinomiale.
%
function runge

  % metto i parametri per la interpolazione polinomiale in un cell array. 
  % I numeri sono il grado del polinomio interpolante, 
  % le stringhe sono la formattazione per il comanfo plot.
  N = { {4,'-k'}, ...
        {8,'-g'}, ...
        {12,'-m'} } ;
        % sopra il grado 12 ployfit da un avvertimento perche' non riesce
        % a calcolare "bene" il polinomio interpolante a causa del 
        % cattivo condizionamento del problema

  % x contiene le ascisse per il plottaggio delle curve e dei polinomi interpolanti
  x = -5:0.01:5;

  hold on ; % da adesso in poi il comando plot scrive sulla stessa finestra
  axis([-5 5 -1 1.1]) ; % dimensiono l'area di plottaggio
  plot( x, rfun(x), '-r', 'LineWidth', 2 ) ; % disegna la curva y = 1/(1+x^2)
  for k=1:length(N)
    % N{k}{1} = grado del polinomio interpolante
    % N{k}{2} = stringa formattazione per plot
    xp = -5:10/N{k}{1}:5 ; % costruisco vettore delle x con i punti di interpolazione equispaziati
    p  = polyfit( xp, rfun(xp), N{k}{1} ) ; % costruisco il polinomio interpolante,
                                            % fai doc polyfit per avere piu' informazioni
    plot( x, polyval(p, x), N{k}{2} ); % plottaggio del polinomio interpolante,
                                       % fai doc polyval per avere piu' informazioni
  end
  hold off ; % da adesso in poi il comando plot NON scrive sulla stessa finestra

end

function y = rfun( x )
  y = 1 ./ ( 1 + x .^ 2 ) ;
end