%Wir rufen das Interpolationsprogramm l06_bsplineinter.m mit verschiedenen Daten
%auf. Die Daten sind (X,fu(X)), fu enth\"alt den Funktionsnamen als String. Nur 
%vor der Zeile "Beginn des Programms" sind Eintragungen zu machen und ggf. ist
%der Aufruf durch "[Loesung]=l06_bsplinesinterpol(k,X,Y,Knoten);" zu ersetzen.
%Programm: Gerhard Opfer, 13. Mai 1999.  Wesentlicher Programmteil: l06_deBoor.m
clear

%=================Auswahl der zu interpolierenden Funktion====================
fu='l06_Schwarz'; 
         %Ansonsten: fu='tan', fu ='sqrt', etc, einsetzen

%=======================Auswahl der Splineordnung=============================
k=4; %k=4: kubische Splines

%===========================Auswahl der Knoten================================
X=[1,2.5,5.25,9.5,12,14.5,17]; %7Daten, aus Schwarz, 2. Aufl., S. 137

%=========================Beginn des Programms================================
n=length(X);   Y=feval(fu,X);
[Loesung,Knoten]=l06_bsplinesinterpol(k,X,Y);
%Da wir die L\"osung gern sehen wollen, ist es zweckm\"a\ss ig, die B-Splines
%f\"ur die ausgerechneten oder gew\"ahlten Knoten an vielen x-Werten 
%auszuwerten. Wir rechnen dabei die fr\"uheren X-Werte ggf. nochmal aus. 
%Wir nehmen das in Kauf, da das das Programm sehr vereinfacht. Will man auch
%die Splineknoten vorgeben, ersetze man den obigen Aufruf durch
%[Loesung]=l06_bsplinesinterpol(k,X,Y,Knoten);

dis=161; %die reine Willk\"ur
Intervall=linspace(X(1),X(length(X)),dis);
Bfein=l06_deBoor(k,Knoten,Intervall); %Bfein hat n Zeilen, dis Spalten
Bild=Bfein'*Loesung;

figure(1)
%Fehlerfunktion wird gezeichnet
Bildexakt=feval(fu,Intervall);
maxx=max(abs(Bildexakt'-Bild));
plot(Intervall,Bildexakt-Bild',[X(1),X(n)],[0 0]);hold on
plot(X,zeros(size(X)),'ro'); %Interpolationsknoten markiert in rot mit "o".
plot(Knoten,zeros(size(Knoten)),'gx'); %Splineknoten in gr\"un mit "x".
xlabel(['Fehlerfunktion f\"ur ',fu,', Ordnung = ',int2str(k)])
hold off

%Bei gr\"o\ss erer Abweichung werden Funktion und Spline gezeichnet
if maxx>0.1
  figure(2)
  %Funktion in rot, und Interpolierende in gr\"un, nur sinnvoll, 
  %wenn der Fehler noch sichtbar ist, hier > 0.1
  plot(Intervall,feval(fu,Intervall),'r',[X(1),X(n)],[5 5]);hold on
  plot(Intervall,Bild','g');
  plot(X,5*ones(size(X)),'ro');
  plot(Knoten,zeros(size(Knoten)),'gx');
  xlabel(['Funktion ',fu,' und Spline mit Ordnung = ',int2str(k),...
          ', Fehlermax = 'num2str(maxx),]);
  hold off
end; %if maxx

%Bei vorgegebenen Interpolationsknoten und automatischen Splineknoten:
%klappt gut f\"ur tangens in [0,pi/4], k=3 und k=4
%dito Wurzel in [0.25,1]
%Beispiel Schwarz: leidlich, aber nicht schlechter als bei Schwarz.
