Interpolacja funkcjami sklejanymi (spline-funkcjami) w przeciwieństwie do interpolacji wielomianowej polega na przybliżaniu krzywej nie jednym
wielomianem opartym na węzłach \(\displaystyle{ x_{0}, x_{1},..., x_{n} }\) lecz różnymi wielomianami, w każdym przedziale \(\displaystyle{ [x_{i-1}, x_{i}], \ \ i=1,2,,n+1.}\)
Jeżeli tymi wielomianami są wielomiany pierwszego stopnia (funkcje liniowe), to mamy doczynienia z interpolacją liniowymi fnkcjami sklejanymi
albo splajnami liniowymi.
Ciekawostką historyczną jest fakt , że z pierwsze modele splajnów zostały zbudowane przez Eulera i Braci Berrnoulli w siedmnastym stuleciu
ubiegłego tysiąclecia.
Były to elastyczne pręty z rowkiem i zawieszonymi z boku ciężarkami tzw. "kaczkami". Służyły one do konstrukcji krzywych.
Niech:
\(\displaystyle{ a = x_{1}< x_{2}<...< x_{n}= b,}\)
wtedy
\(\displaystyle{ S_{i}(x) = f(x_{i}) + \frac{f(x_{i+1})-f(x_{i})}{x_{i+1}-x_{i}} \cdot (x-x_{i})= f(x_{i}) +f[x_{i+1}, x_{i}] \cdot (x-x_{i}), \ \ i=1,2,..., n-1 \ \ (1) }\)
\(\displaystyle{ S(x) = \begin{cases} S_{1}(x), \ \ \mbox{jeśli} \ \ x< a \\ S_{n-1}(x) \ \ \mbox{jeśli} \ \ x>b. \end{cases} \ \ (2) }\)
Przykład
Znajdziemy funkcje sklejane dla danych w tabeli:
\(\displaystyle{ \begin{tabular}{|c|c|c|c|c|c|} x & 1 & 1,5 & 2 & 2,5 & 3 \\ \hline
f(x) & 1 & 3 & 7 & 10 & 15 \end{tabular} }\)
Na podstawie \(\displaystyle{ (1) }\)
\(\displaystyle{ S_{1}(x) = \frac{f(1,5) -f(1)}{1,5 -1} (x-1) +f(1) = \frac{3-1}{0,5}(x-1)+1 = 4x -3,}\)
\(\displaystyle{ S_{2}(x) = \frac{f(2,0) -f(1,5)}{2-1,5} (x-1,5)+ f(1,5) = \frac{7-3}{0,5}(x-1,5)+3 = 8x -9,}\)
\(\displaystyle{ S_{3}(x) = \frac{f(2,5) -f(2,0)}{2,5-2} (x- 2) + f(2)= \frac{10-7}{0,5}(x-2)+7 = 6x -5,}\)
\(\displaystyle{ S_{4}(x) = \frac{f(3) -f(2,5)}{3-2,5} (x- 2,5) +f(2,5) = \frac{15-10}{0,5}(x-2,5)+10 = 10x -15.}\)
Na podstawie \(\displaystyle{ (2) }\)
\(\displaystyle{ S(x) =\begin{cases} 4x-3 \ \ \mbox{gdy} \ \ x\in [1.0,1.5] \\ 8x-9 \ \ \mbox{gdy} \ \ x\in [1.5, 2.0] \\ 6x-5 \ \ \mbox{gdy} \ \ x\in [2.0, 2.5] \\ 10x-15 \ \ \mbox{gdy} \ \ x\in [2.5, 3.0]. \end{cases} }\)
Program w MATLAB
Kod: Zaznacz cały
function spl1(x,y,c)
% Liniowa funkcja sklejana
n=length(x);
for i=n-1:-1:2
dis=c-x(i);
if (dis>=0)
break
end
end
if (dis<0)
i=1;
dis=c-x(1);
end
m=(y(i+1)-y(i))/(x(i+1)-x(i));
spl1=y(i)+m*dis;
disp(' Liniowa funkcja sklejana')
disp('_____________________________________________')
disp([' x y c=' ,num2str(c),' '])
disp('_____________________________________________')
for j=1:n
fprintf('%12.6f %12.6f',x(j),y(j))
if (j==i)
fprintf('\n S(c)= %10.6f',spl1)
end;
fprintf('\n')
end
Kod: Zaznacz cały
>> spl1(x,y,2.2)
Liniowa funkcja sklejana
_____________________________________________
x y c=2.2
_____________________________________________
1.000000 1.000000
1.500000 3.000000
2.000000 7.000000
S(c)= 8.200000
2.500000 10.000000
3.000000 15.000000