%% Negyedik gyakorlat: Interpoláció II.
%
%% 1. Hermite-Fejér interpoláció
% Cél: egy f: \mathbb{R} \rightarrow \mathbb{R} függvény n+1darab pontban (ún. alappontban) ismert (x_i, f_i) vagy (x_i, f'(x_i)) értékeiből állítsunk elő egy olyan (megadott tulajdonságokkal rendelkező) g görbét, amire teljesül, hogy g(x_i) = f_i és g'(x_i) = f'(x_i).
% Határozzuk meg az Hermite--féle interpolációs polinomot, ha
% f(1)=0, \; f(2)=1, \; f'(2)=3, \; f''(2)=-2, \; f(3)=1.
%         Megoldás: Alkalmazzuk az előző feladatsoron megismert Newton-féle interpolációt azzal a kiegészítéssel, hogy teljesül az alábbi összefüggés:
% f[x_i, x_i, \dots x_i] = \frac{f^{(k)} (x_i)}{k!},
% ahol a bal oldalon k+1 darab x_i tag szerepel.
% Jelen esetben a táblázat:
% \matrix{ x_i & f(x_i) & f[x_i, x_{i+1}] & f[x_i, x_{i+1}, x_{i+2}] & f[x_i, x_{i+1}, x_{i+2}, x_{i+3}] & f[x_i, x_{i+1}, x_{i+2}, x_{i+3}, x_{i+4}] \cr
% 1 & 0 & & & & \cr
% 2 & 1 & \frac{1-0}{2-1}=1  & & & \cr
% 2 & 1 & \frac{3}{1!}=3  & \frac{3-1}{2-1}=2 & & \cr
% 2 & 1 & \frac{3}{1!}=3  & \frac{-2}{2!}=-1 & \frac{-1-2}{2-1}=-3 & \cr
% 3 & 1 & \frac{1-1}{3-2}=0  & \frac{0-3}{3-2}=-3 & \frac{-3-(-1)}{3-2}=-2 & \frac{-2-(-3)}{3-1}=\frac{1}{2}
%  }
% Ekkor az interpolációs polinom:
% H_5(x) = 0+1 \cdot (x-1) + 2 \cdot (x-1)(x-2) + (-3) (x-1)(x-2)^2 + \frac{1}{2} (x-1)(x-2)^3 .
% (A deriváltak miatt kerülnek bele az (x-2) tagok magasabb hatványai.)
%
%% 2. Spline interpoláció
% A cél, hogy olyan, szakaszonként polinomokkal interpoláljuk a függvényértékeket, ahol a csatlakozási pontokban nem csak folytonos az interpoláció, hanem n
% -edfokú spline esetén n-1-szer deriválható is.
%             2. Írjuk fel azt az S_2(x) másodfokú splinet, amely illeszkedik a (-1,2), \; (0,1), \; (2,-1) pontokra és S'(2)=-2.
%             Megoldás: A spline-t alkotó másodfokú polinomokat keressük az alábbi alakban:
% S_1(x) =a_1 x^2+ b_1 x + c_1, \quad \text{ha} \;x \in [-1,0], \\
% S_2(x) =a_2 x^2+ b_2 x + c_2, \quad \text{ha} \;x \in [0,2].
% A csatlakozási pontokban kapott egyenletek:
% S_1(-1)=a_1-b_1+c_1=2,\\
% S_1(0)=c_1=1,\\
% S_2(0)=c_2=1,\\
% S_2(2)=4a_2 + 2 b_2  + c_2=-1.
% Mivel S_2'(2)=4a_2 + b_2 = -2, így a negyedik egyenletből:
% 4 a_2 + 2 b_2 + 1 = -1\\
% -2 + b_2 +1= -1
% azaz b_2=0 és a_2=-\frac{1}{2}, azaz  S_2(x)=-\frac{x^2}{2}+1 . Hasonlóan, a S_1'(0)=S_2'(0) feltétel miatt
% 0=S_2'(0)=S_1'(0)=b_1.
% Így tehát a_1=1, azaz S_1(x)=x^2+1.
%
%             3. Tekintsük az f(x) = \sin\left(\frac{\pi}{2}x \right) függvényt és a {-1, 0, 1}alappontrendszert! Határozzuk meg az f-et interpoláló köbös splinet Hermite--féle peremfeltétellel, azaz f'(-1) = f'(1) = 0.
%             Megoldás: Jelen esetben a spline alakja:
% S_1(x) = a_1x^3 + b_1x^2 + c_1x + d_1, \quad \text{ha} \ x \in [-1, 0]\\
% S_2(x) = a_2x^3 + b_2x^2 + c_2x + d_2, \quad \text{ha} \ x \in [0, 1].
% Az interpolációs feltételek:
% S_1(-1) = -1 \rightarrow -a_1 + b_1 - c_1 + d_1 = -1 \\
% S_1(0) = 0 \rightarrow d_1 = 0 \\
% S_2(0) = 0 \rightarrow d_2 = 0 \\
% S_2(1) = 1 \rightarrow a_2 + b_2 + c_2 + d_2 = 1.
% A deriváltak egyenlősége miatt:
% S'_1(-1) = 0 \rightarrow 3a_1 - 2b_1 + c_1 = 0 \\
% S'_2(1) = 0 \rightarrow 3a_2 + 2b_2 + c_2 = 0.\\
%
% S'_1(0) = S'_2(0) \rightarrow c_1 = c_2 \\
% S''_1(0) = S''_2(0) \rightarrow b_1 = b_2.
% A kapott egyenletrendszer tehát
% -a_1 + b_1 - c_1 = -1, \\
% a_2 + b_1 + c_1 = 1, \\
% 3a_1 - 2b_1 + c_1 = 0, \\
% 3a_2 + 2b_1 + c_1 = 0.
% Ennek megoldása Matlabbal:

A=[-1 0 1 -1; 0 1 1 1; 3 0 -2 1; 0 3 2 1];
b=[-1; 1; 0; 0];
x=A\b

%
%             4. Tekintsük az x = -2:0.5:2 pontokban az y = -\frac{1}{4}x^4 + \frac{1}{2}x^2 függvényt. Használjuk az interpl függvényt és rajzoltassuk ki a kapott közelítő megoldásokat.
% Megoldás:

x = -2:0.5:2; 
y = -0.25*x.^4 + 0.5*x.^2; 
xi = linspace(-2, 2); 
ynear = interp1(x, y, xi, 'nearest'); 
ylin = interp1(x, y, xi, 'linear'); 
ypc = interp1(x, y, xi, 'pchip'); 
yspl = interp1(x, y, xi, 'spline'); 
subplot(2,2,1), plot(xi,ynear,x,y,'o'), title('Nearest neighbor interpolation') 
hold on \\
subplot(2,2,2), plot(xi,ylin,x,y,'o'), title('Linear interpolation') 
subplot(2,2,3), plot(xi,ypc,x,y,'o'), title('Piecewise cubic Hermite interpolation')
subplot(2,2,4), plot(xi,yspl,x,y,'o'), title('Cubic spline interpolation')