%=============================Kommentar======================================
%L\"osung von Interpolationsproblemen mit Hilfe von B-Splines. Gegeben 
%  (1) Ordnung k>=2, (Grad = k-1)
%  (2) Interpolationsknotenfolge X strikt aufsteigend, L\"ange n,
%  (3) Wertefolge Y, L\"ange n,
%  (4) Splineknotenfolge Knoten, nicht absteigend, mit n+k Knoten.

%Die Angabe (4) der Splineknoten kann entfallen, dann werden die 
%Splineknoten mit Mittelbildung aus den Knoten X wie in (7.2) beschrieben,
%generiert. Diese Methode ist zu empfehlen. In diesem Fall sind die 
%Splineknoten Ausgabeparameter.

%Berechnet wird ein Spline S der Ordnung k mit den vorgegebenen 
%oder berechneten Splineknoten, so da\ss\
%  (5) S(X)=Y.

%Wir adaptieren einen Algorithmus von de Boor, S. 134 
%zur Berechnung der B-Splines. Ein Zwischenresultat ist eine n mal n-Matrix B,
%die die n Werte aller B-Splines zeilenweise enth\"alt und aus der 
%der L\"osungsvektor (Spaltenvektor, L\"ange n) berechnet wird.
%Aufruf:

                %[Loesung]=l06_bsplineinterp(k,X,Y,Knoten); oder
         %[Loesung,Knoten]=l06_bsplineinterp(k,X,Y);

%Programm: Gerhard Opfer, 13. Mai 1999
%Wesentlicher Programmteil: l06_deBoor.m

%===============================Vorspann=====================================
function [Loesung,Knoten]=bsplineinterp(k,X,Y,Knoten);
n=length(X);
if nargin==3 %Splineknoten werden generiert:
  Knoten(1:k)=X(1)*ones(1,k);
  Knoten(n+1:n+k)=X(n)*ones(1,k);
  Knoten(1)=Knoten(1)-0.01;Knoten(n+k)=Knoten(n+k)+0.01;
  for j=1:n-k
    Knoten(k+j)=sum(X([j+1:j+k-1]))/(k-1);
  end; %for j
  if nargout==2
    Knoten=Knoten;
  end; %if nargout
end; %if nargin
if length(Knoten)-n~=k
  error('Diskrepanz zwischen Anzahl von Spline- und Interpolationsknoten');
end; %if
%Test: Sind die Bedingungen von Schoenberg-Whitney erf\"ullt.
for j=1:n
links=Knoten(j);rechts=Knoten(j+k);mitte=X(j);
  if links>=rechts
    error(['Knoten ',int2str(j),' hat zu hohe Vielfachheit']);
      elseif links >= mitte | mitte >= rechts
      error(['Am Knoten ',int2str(j),' Schoenberg-Whitney verletzt!']); 
  end; %if
end; %for j
%=============================Vorspann Ende==================================

%===============================B-Splines====================================

B=l06_deBoor(k,Knoten,X);
   %Die Matrix B hat n Zeilen und n Spalten mit einer 
   %Bandbreite unterhalb k: B(j,k)=0, wenn |j-k|>=k.

%===============================Ende B-Splines===============================
Loesung=B'\Y';
%==============================L\"osung gefunden=============================
