%============================================================================
%(0) Vorbemerkungen
%Berechnung von s(t)=\sum_ja_jB_{j,k}(t) bei 
%gegebenen Knoten t_j, Koeffizienten a_j, gegebener Ordnung k
%und gegebenen Argumenten t in [t_ell,t_{ell+1}[. Der Aufruf hat die Form:

%        function s=splinesfct(Knoten,Koeff,Ordnung,Argumente);

%Liegen die Argumente nicht in einem Intervall [t_ell,t_{ell+1}[, 
%so wird das Programm mit einer Fehlermeldung abgebrochen.
%Für a=(0,0,...0,1,0,...,0,0), mit a_ell=1 ist s=B_{ell,k}.
function  s=splinesfct(Knoten,Koeff,Ordnung,Argumente);
%============================================================================
%(1) Umbenennungen
t=Knoten;k=Ordnung;tt=Argumente;
%la=length(tt);lk=length(Knoten);
%============================================================================
%(2) Intervall finden
%Zuerst wird geprüft, in welchem Intervall die gegebenen Argumente tt liegen:
mi=min(tt);ma=max(tt);
if mi==t(length(t))
  ell=length(Knoten)-k-1;
  else
  K=find(t<=mi);
  ell=max(K);
  if t(ell+1)<=ma
    error('Argumente nicht in einem einzigen Intervall');
  end; %if
end; %if
%Prüfung zu Ende, Intervall ist [t_ell,t_{ell+1}[.
%============================================================================
%(3) Vorbesetzung
for j=ell-k+1:ell
  a(j,:)=Koeff(j)*ones(size(tt));
end; %for j
%============================================================================
%(4) eigentliche Rekursion
for r=0:k-2
  for j=ell:-1:ell-k+r+2   %rückwärts!
    if t(j+k-r-1)>t(j)
      omega(j,:)=(tt-t(j))/(t(j+k-r-1)-t(j));
      else
      omega(j,:)=zeros(1,l);
    end; %if 
    a(j,:)=(1-omega(j,:)).*a(j-1,:)+omega(j,:).*a(j,:);
  end; %for j
end; %for k
%============================================================================
(5) Schlu\ss
s=a(ell,:);
return;
%============================================================================
