%% Splinefunktionen
% NB: Dieses Programm verwendet die Matlab-Funktionen spmak und fnval, welche nur in der "Curve Fitting Toolbox" von Matlab verfügbar sind.
% Wir betrachten folgende Stützstellen (siehe Buch)
%          \tau = \{\tau_0,\ldots, \tau_{\ell+1}\} \quad \text{mit}~~0=\tau_0<\ldots<\tau_{\ell+1}=1.
% Wir wählen \ell=10 und \ell+2 Stützstellen \tau_j:

ell=10;
Knoten=[0 0.1 0.15 0.3 0.4 0.45 0.55 0.65 0.7 0.75 0.9 1];

% Jede Splinefunktion S aus dem Raum der kubischen Splines \mathbb{P}_{4,\tau} (siehe Buch) kann in einer B-Spline-Basis dargestellt werden:
%               S(x)= \sum_{j=1}^{4+\ell} c_j N_{j,4}(x).
% Die Koeffizienten ("Kontrollkoeffizienten") werden festgelegt und die Splinefunktion S wird geplottet.
% Für 1 \leq m \leq 4+\ell betrachten wir erst den Fall c_m=1, c_j=0 für alle j\neq m, also eine kubische B-Spline-Basisfunktion S=N_{m,4}\in\mathbb{P}_{4,\tau}.

m=9
e_m=zeros(1,ell+4); 
e_m(m)=1; % m-ter Einheitsvektor
f1=figure;
clf(f1);
makeplotS(Knoten,e_m,[0,1],f1);

%
% Wir wählen nun einen anderen Koeffizientenvektor mit einem Parameter c=c_6, den man variieren kann.

c=1.2;
Koeffizienten=[0.3 0.5 0.1 1 -0.1 c -0.6  0.7 0 0.7 0 -1 0.2 1];
figure(100); f2=gcf;
makeplotS(Knoten,Koeffizienten,[-1 1.5],f2);
hold on;

%% Aktivität:
% Wählen Sie den Index m, um verschiedene B-Spline-Basisfunktionen zu betrachten.
% Sie können den Parameter c variieren, um eine neue Splinefunktion hinzuzufügen. Beobachten Sie die Effekte. Sie können ggf. auch einen anderen Koeffizientenvektor wählen.
%

function y=SplineAuswertung(x,Knoten,Koeffizienten)
    Knotenerweiterung=[0 0 0  Knoten 1 1 1]; 
    sp=spmak(Knotenerweiterung,Koeffizienten);
    y=fnval(sp,x);
end

%

function makeplotS(Knoten,Koeffizienten,yrange,f)
    x=linspace(0,1,101);
    y=SplineAuswertung(x,Knoten,Koeffizienten);
    figure(f);
    plot(x,y,Knoten,yrange(1),'*','MarkerSize',12);
    ylim(yrange);
    legend('Splinefunktion','Knoten');
    hold on;
end