
%splajny kubiczne
a=0;b=4;
x=linspace(a,b,5);
y=randn(size(x));
pp=spline(x,y);
pph=spline(x,[0,y,0]);
s=linspace(a,b,300);
plot(s,ppval(pp,s),";not-a-knot;",s,ppval(pph,s),";herm w.brz.;",x,y,"*")
pause(1);
plot(s,ppval(pp,s)-ppval(pph,s),x,0*x,"*")

%splajn bazowy tzn s(x(k)=1 s(x(j))=0 j<>k 
a=0;b=4;
x=linspace(a,b,10);
y=zeros(size(x));y(5)=1;
pp=spline(x,y);
pph=spline(x,[0,y,0]);
s=linspace(a,b,300);
plot(s,ppval(pp,s),";not-a-knot;",s,ppval(pph,s),";herm w.brz.;",x,y,"*")
pause(1);
y(5)=0;y(3)=1;
pp=spline(x,y);
pph=spline(x,[0,y,0]);
s=linspace(a,b,300);
plot(s,ppval(pp,s),";not-a-knot;",s,ppval(pph,s),";herm w.brz.;",x,y,"*")

%spline o minimalnym nosniku
a=0;b=4;
x=linspace(a,b,11);
y=zeros(size(x));
y(7)=4;y(6)=y(8)=1;
pp=spline(x,y);
pph=spline(x,[0,y,0]);
s=linspace(a,b,300);
plot(s,ppval(pp,s),";not-a-knot;",s,ppval(pph,s),";herm w.brz.;",x,y,"*")
pause(1);


%testowanie rzedu zbieznosci wezly rownoodlegle
function [er,PP]=testzbsk(f,a,b,wb=0,poz=10)
%funkcja testujaca zbieznosc spljanow interpolacyjnych kubicznych s_{f,N}
%na N+1 wezlach rownoodleglych (2 typy war brzegowych do wyboru)
%liczymy przyblizenia er(k,2)=||f-s_{f,N}||_\infty dla N=2^k 
%INPUT
%f - wskaznik do funkcji (wywolany na wektorze x=(x(k)) powinien zwrocic 
%wektor z wartosciami f(x(k)) 
%a,b - konce odcinka
%wb typ warunkow brzegowych - 0 - not-a-knot, wektor 2 wartosci [ya,yb]
%   wb Hermitowskie czyyli splajn interpolacyjny spelni s'(a)=ya s'(b)=yb
%poz - ilosc poziomow 
%OUTPUT
%er - wektor z przyblizonymi normami ||f-s_{f,N}||_\infty dla N=4,8,16,..,2^poz
%Przyklad 
%er=testzbsk(@sin,0,2*pi,wb=0,poz=10)
%rzad zbieznosci dla wiekszych N wychodzi ok 4 tzn blad O(h^4): 
%log2( er(1:end-1,2)./er(2:end,2))
 N=4;
 s=linspace(a,b,10000);
 z=linspace(a,b,300);
 fs=f(s);
 er=zeros(poz-1,2);
 for k=2:poz,
  x=linspace(a,b,N+1);
  y=f(x);
  if(length(wb)>1)
   yy=zeros(1,N+3);
   yy(1)=wb(1);yy(end)=wb(2);
   yy(2:N+2)=y;
  else yy=y;
  end
  pp=spline(x,yy);
  PP{k-1}=pp;
  er(k-1,[1 2])=[N,norm(f(s)-ppval(pp,s),'inf')];
  if(k<4)
   plot(z,f(z),";f;",z,ppval(pp,z),";spline;",x,y,"*");pause(1);
  end
  N*=2;
 end
end 


er=testzbsk(@sin,0,2*pi,wb=0,poz=10)
%rzad zbieznosci dla wiekszych N wychodzi ok 4 tzn blad O(h^4): 
log2( er(1:end-1,2)./er(2:end,2))

%warunki Hermitowskie
er=testzbsk(@sin,a=0,b=2*pi,wb=[cos(a),cos(b)],poz=10)
%rzad zbieznosci dla wiekszych N wychodzi ok 4 tzn blad O(h^4): 
log2( er(1:end-1,2)./er(2:end,2))



%warunki Hermitowskie
er=testzbsk(@(x) x.^9,a=0,b=1,wb=[0,9],poz=10)
%rzad zbieznosci dla wiekszych N wychodzi ok 4 tzn blad O(h^4): 
log2( er(1:end-1,2)./er(2:end,2))


%warunki Hermitowskie x^9
[er,PP]=testzbsk(@(x) x.^9,a=0,b=1,wb=[0,9],poz=9);
er
%rzad zbieznosci dla wiekszych N wychodzi ok 4 tzn blad O(h^4): 
log2( er(1:end-1,2)./er(2:end,2))


%warunki nak x^9
[er,PP]=testzbsk(@(x) x.^9,a=0,b=1,wb=0,poz=9);
er
%rzad zbieznosci dla wiekszych N wychodzi ok 4 tzn blad O(h^4): 
log2( er(1:end-1,2)./er(2:end,2))

