Interpolacja wielomianowa, nazywana interpolacją Lagrange’a, a także po prostu interpolacją jest metodą numerycznego przybliżania funkcji wielomianem Lagrange’a stopnia n, przyjującym w n+1 punktach, zwanych węzłami interpolacji wartości takie same jak przybliżana funkcja. Stosowana jest w naukach doświadczalnych, w których dysponuje się skończoną liczbą danych do określenia zależności między wielkościami, a także w celu uproszczenia skomplikowanych funkcji.
Pierre Bézier w latach 60. XX wieku opisał typ krzywych nazywanych krzywymi Béziera, które pierwotnie używane były przy projektowaniu nadwozi samochodów Renault.
Krzywe Béziera są krzywymi parametrycznymi, tzn. każda współrzędna punktu krzywej jest pewną funkcją liczby rzeczywistej będącej wspomnianym parametrem; aby określić krzywą na płaszczyźnie potrzebne są dwie funkcje, aby określić krzywą w przestrzeni – trzy, itd. Ze względu na rodzaj tych funkcji mówi się o krzywych wielomianowych oraz krzywych wymiernych. Powszechnie stosuje się również krzywe złożone z kawałków gładko połączonych krzywych wielomianowych bądź wymiernych, tzw. krzywych B-sklejanych (także: krzywych gładkich).
Niezależnie od rodzaju krzywej na jej przebieg wpływa łamana kontrolna określona za pomocą punktów kontrolnych, których liczba jest zwykle niewielka. Ta cecha bardzo ułatwia pracę interakcyjną, bowiem człowiek w naturalny sposób może ustalać położenie punktów i w łatwy sposób korygować błędy.
$$x\left( t \right) = \cos^{3}(\frac{t}{4})$$
$$y\left( t \right) = \sin^{3}(\frac{t}{4})$$
t ∈ ⟨0, 8π⟩
Interpolację wykonałam za pomocą funkcji polyfit, która tworzy wielomian interpolacyjny Lagrange’a. Do uzyskania wartości w konkretnych punktach użyłam funkcji polyval.
function z = teoaproxc7(n) % n = liczba przedziałów w przedziale [a,b] a=0; b=8*pi; m=3; %stopien funkcji B-spline % Wyznaczanie elementów po podziale na n części delta=(b)/(n); T=a:delta:b; U=0:1/(n+m+m):1; %n+m for all original objects T2=a:0.01:b; % Obliczenie funkcji interpolowanej X2=cos(T2./4).^3; Y2=sin(T2./4).^3; % Tworzenie danych do interpolacji oraz interpolacja X=cos(T./4).^3; Y=sin(T./4).^3; aux=size(T); FITX=polyfit(T,X,aux(2)-1); FITY=polyfit(T,Y,aux(2)-1); X2int= polyval(FITX, T2); Y2int= polyval(FITY, T2); |
---|
Aproksymację wykonałam korzystając ze wzoru:
$$p\left( t \right) = \sum_{i = 0}^{m - n - 1}p_{i}N_{i}^{n}\left( t \right)\ dla\ t \in \lbrack u_{n},\ \text{\ u}_{m - n}\rbrack$$
$$N_{i}^{n}\left( t \right) = \frac{t - u_{i}}{u_{i + n} - u_{i}}N_{i}^{n - 1}\left( t \right) + \frac{u_{i + n + 1} - t}{u_{i + n + 1} - u_{i + 1}}N_{i + 1}^{n - 1}\left( t \right)\ dla\ n > 0$$
$$N_{i}^{0}\left( t \right) = \left\{ \begin{matrix}
1\ dla\ t \in \lbrack u_{i},\ u_{i + 1}) \\
0\ w\ przeciwnym\ przypadku \\
\end{matrix} \right.\ $$
n – stopień krzywej
m+1 – liczba węzłów
pi – i-ty punkt kontrolny
Nin(t) – unormowana funkcja B-sklejana stopnia n
% Tworzenie danych do aproksymacji oraz aproksymacja for i=1:m X(n+i)=X(i); Y(n+i)=Y(i); end index=1; k=U(m+1); % t -> [U3, Un-3] while k<=U(n+4) %-m X2apx(index)=0; Y2apx(index)=0; for j=1:n+3 % n-stopień-1 (n-3-1) i+1 -> n-3 X2apx(index)=X2apx(index)+X(j)*N(m,j,k,U); Y2apx(index)=Y2apx(index)+Y(j)*N(m,j,k,U); end k=k+0.002; index=index+1; end |
---|
By skorzystać z powyższego wzoru rekurencyjnego zdefiniowałam następującą funkcję:
function ret=N(n,i,t,u) if n==0 if t >= u(i) && t< u(i+1) ret=1; else ret=0; end else ret=((t-u(i))/ (u(i+n) - u(i))) * N(n-1,i,t, u) + (u(i+n+1) - t)/(u(i+n+1)-u(i+1)) * N(n-1, i+1, t, u); end end |
---|
Wykresy wykonałam za pomocą funkcji plot. Dodałam również opis osi oraz ograniczyłam wartości na osi poziomej oraz pionowej do przedziału x∈ < −1, 1>, y∈<-1, 1>.
% Rysowanie wykresów plot(X2,Y2,'r.',X2int,Y2int,'g.',X2apx,Y2apx,'b.-'); xlabel('x'); ylabel('y');title('Wykres funkcji y=f(x) oraz funkcji interpolującej'); axis([-1 1 -1 1]); legend('funkcja interpolowana','interpolacja Lagrangea','aproksymacja B-spline'); |
---|
∥f1∥ = ∫ab|f(x)|dx
$$\left\| f_{2} \right\| = \sqrt[2]{\int_{a}^{b}{f^{2}(x)\text{dx}}}$$
%Normy Nix=X2-X2int; Niy=Y2-Y2int; norma1i=simpson(abs(Nix),a,b)+simpson(abs(Niy),a,b); norma2i=sqrt(simpson(Nix.*Nix,a,b))+sqrt(simpson(Niy.*Niy,a,b)); |
---|
Liczenie norm dla funkcji interpolowanej i aproksymowanej:
deltaux=(b)/(index-2); Taux=a:deltaux:b; Xaux=cos(Taux./4).^3; Yaux=sin(Taux./4).^3; Nx=X2apx-Xaux; Ny=Y2apx-Yaux; norma1a=simpson(abs(Nx),a,b)+simpson(abs(Ny),a,b); norma2a=sqrt(simpson(Nx.*Nx,a,b))+sqrt(simpson(Ny.*Ny,a,b)); |
---|
Wyniki
N=5 | N=10 | N=50 | N=100 | |
---|---|---|---|---|
∥f1∥ interpolacja | 10.9945 | 3.0170 | 3.4401e-004 | 4.8551e+004 |
∥f2∥ interpolacja | 2.8094 | 1.2672 | 3.6939e-004 | 8.4087e+004 |
∥f1∥ aproksymacja | 27.4690 | 17.6545 | 3.8991 | 1.8619 |
∥f2∥ aproksymacja | 5.9055 | 3.8871 | 0.9143 | 0.4376 |
Wnioski
Jak widać na powyższych wykresach, zadana krzywa stosunkowo łatwo interpoluje się interpolacją Lagrange’a. natomiast aproksymacja przy małej ilości węzłów daje dużo gorsze przybliżenie przebiegu funkcji natomiast warto zauważyć, że mimo tego dobrze odzwierciedla jej kształt. Dla liczby węzłów 50 aproksymacja daje przybliżony rezultat jaki interpolacja osiąga już przy 10 węzłach. Dalszy wzrost liczby punktów podziału zwiększa dokładność aproksymacji, lecz powoduje również zakłócenie prac algorytmu interpolacji Lagrange, który przy tak dużej liczbie danych nie potrafi ich prawidłowo zinterpretować.