function [p,errore,erroreC] = runge(n,M)

%  'runge' costruisce il pol. interp. per la funzione 1/(1+x^2)
%  nell'intervallo [-5,5]
%  OUTPUT:
%  vettore dei coefficienti del polinomio interpolatore
%  errori di interpolazione
%  INPUT:
%  numero di nodi, ampiezza della griglia
%  Studiare l'andamento degli errori ('errore' e 'erroreC')
%  al variare del numero di nodi (fare un grafico delle due
%  tipologie di errore)

% Nodi di Interpolazione di Lagrange
nodi=linspace(-5,5,n) ;

y=1./(1+nodi.^2) ;
N=length(nodi)-1 ;
% Usare: polyfit, polyval
p=polyfit(nodi,y,N) ;

x=linspace(-5,5,M) ;
ypol=polyval(p,x) ;
f=1./(1+x.^2) ;
figure
plot(x,ypol,'r')
hold on
plot(x,f)
plot(nodi,y,'mx','LineWidth',2)  % plot dei valori nei nodi
title('Funzione di Runge')
errore=norm((f-ypol),inf) ;

text(0,0.8,['Grado del polinomio interpolatore: '  num2str(N) ' - Errore=' ...
    num2str(errore)]) 

% Nodi di Chebishev: 'n' numero di nodi 
nodi_cheb=zeros(n,1) ;
a=-5 ;
b=5 ;
PM=(a+b)/2 ;
for i=1:n
    nodi_cheb(i)=PM-((b-a)/2)*cos((i-1)*pi/(n-1)) ;
end
disp('Nodi di Cheb: ') 
%disp(nodi_cheb)
y=1./(nodi_cheb.^2+1) ;
% Voglio costruire il polinomio interpolatore della funzione
% di Runge relativamente ai nodi di Chebishev
pcheb=polyfit(nodi_cheb,y,N) ;
ypolcheb=polyval(pcheb,x) ;

plot(x,ypolcheb,'g--')
plot(nodi_cheb,y,'kx','LineWidth',2)  % plot dei valori nei nodi
erroreC=norm(f-ypolcheb,inf) ;
disp('Errore di interpolazione Chebishev')
disp(erroreC)

end

