

#zad 1 test polyfit

f=@(x) sin(x);
x=[-1 2 3 4];
y=f(x);

p=polyfit(x,y,length(x)+1);
s=linspace(-1,4,1000);
fs=f(s);
ps=polyval(p,s);
err=norm(ps-fs,"inf") #discerete sup nor mof the error
plot(s,fs,";f;",s,ps,x,y,"+");


#zad 2 przyklad Rungego
f=@(x) sin(x);
a=-1;b=4;
function [err,erc]=testLinterp(f=@(x) sin(x),a=-1,b=4,n0=2,nmax=20,DISP="")
#testujemy interpolacje Lagrangea na wezlach rownoodleglych 
#i Czebyszewa - rysujemy wykresy funkcji i obu wiel. interp
#INPUT
#f - uchwyt do funckji interpolowanej(musi dzialac wektorowo)
#a,b - konce odcinka
#n0,nmax - mini i max stopien wielomianu dla jakiego testujemy
#DISP - napis z nazwa przykladu
#OUTPUT 
#err,errc - dyskretne bledy max dla obu interpolacji (na 1000 pktach) 
 nn=n0:2:nmax;
 k=1;
 for n=nn,
  x=linspace(a,b,n+1); #wezly rownoodlegle
  xc=(a+b)/2 + 0.5*(b-a)*cos(pi*(0.5+(0:n))/(n+1)); #w. Czebyszewa
  y=f(x);yc=f(xc);
  p=polyfit(x,y,n);pc=polyfit(xc,yc,n);
  s=linspace(a,b,1000);
  fs=f(s);
  ps=polyval(p,s);pcs=polyval(pc,s);
  err(k)=norm(ps-fs,"inf"); #discrete sup nor mof the error
  erc(k++)=norm(pcs-fs,"inf");
  plot(s,fs, [";" DISP " n=" num2str(n) ";"],s,ps,";pr;",s,pcs,";pc;",x,y,"+;wr;",xc,yc,"*;wc;");pause(1);
 endfor
end

[err,erc]=testLinterp(f=@(x) sin(x),a=-1,b=4,2,8,"sin");
[err,erc]=testLinterp(f=@(x) sin(5*x),a=-1,b=4,2,20,"sin(5x)");

#przyklad Rungego 
f=@(x) (1.0./(1.0 + x.*x))
[err,erc]=testLinterp(f, -5,5,2,20,"prz. Runge");



#zad 3 przyklad Rungego spajnami kubicznymi

function [err]=testspline(f=@(x) sin(x),a=-1,b=4,N0=2,M=5,DISP="")
#testujemy interpolacje splajnowa kubiczna  na wezlach rownoodleglych
#war brzegowe typu not-a knot  
#i rysujemy wykresy funkcji i splajnu interp
#INPUT
#f - uchwyt do funckji interpolowanej(musi dzialac wektorowo)
#a,b - konce odcinka
#N0 - ilosc pododcinkow na poczatku  (h=(b-a)/N0
#M- ilosc polowien kroku tzn podwajana ilosci pododcinkow
#DISP - napis z nazwa przykladu
#OUTPUT 
#err,errc - dyskretne bledy max dla obu interpolacji (na 1000 pktach) 

 N=N0;
 for k=1:M,
  x=linspace(a,b,N+1); #wezly rownoodlegle
  y=f(x);
  pp=spline(x,y);
  s=linspace(a,b,1000);
  fs=f(s);
  pps=ppval(pp,s);
  err(k)=norm(pps-fs,"inf"); #discrete sup norm of the error
  plot(s,fs, [";" DISP " N=" num2str(N) ";"],s,pps,";spline;",x,y,"+;wr;");pause(1);
  N=N*2;
 endfor
end

[err]=testspline(f=@(x) sin(x),a=-1,b=4,2,4,"sin");
M=length(err);rat=err(1:M-1)./err(2:M)
log2(rat)
[err]=testspline(f=@(x) sin(5*x),a=-1,b=4,2,8,"sin(5x)");
M=length(err);rat=err(1:M-1)./err(2:M)
log2(rat)
#przyklad Rungego 
f=@(x) (1.0./(1.0 + x.*x))
[err]=testspline(f, -5,5,2,8,"prz. Runge");
M=length(err);rat=err(1:M-1)./err(2:M)
log2(rat) #wynik sugeruje ze blad sie zachowuje jak O(h^4)=O(N^{-4})






