Treść zadania
Dla funkcji f(x)=sin2(x) w punktach {0, π/3, π/2, 3 π/4} wyznacz używając skryptów Octava (Matlaba) postać naturalnej funkcji sklejanej S3 (wielomian trzeciego stopnia) dla zadanego zbioru punktów. Następnie wyznacz (znów używając skryptów) postać wielomianu interpolacyjnego P3(x) metodą Newtona. Znając postacie funkcji S3(x) i P3(x) wykreśl za pomocą komendy plot błędy lokalne E1(x)=abs(f(x)-P3(x)) oraz E2(x)=abs(f(x)-S3(x)) i skomentuj rezultat. Wykreśl podane punkty oraz przebieg wyznaczonego wielomianu interpolacyjnego P3(x), S3(x) i funkcji f(x) używając komendy plot. Wydruk wykresy (wraz z kodem) dołącz do sprawozdania.
Wstęp teoretyczny
Interpolacja funkcjami sklejanymi – metoda numeryczna polegająca na przybliżaniu nieznanej funkcji wielomianami niskiego stopnia.
Dla przedziału <a, b>, zawierającego wszystkie n+1 węzły interpolacji, tworzy się m przedziałów:
takich, że
i w każdym z nich interpoluje się funkcję wielomianem (raczej niskiego stopnia) interpolacyjnym.
"Sklejenie" tych wielomianów ma tworzyć funkcję sklejaną.
Funkcja sklejana S jest funkcją interpolującą funkcję F, jeżeli:
, dla są węzłami interpolacyjnymi funkcji F.
Kod źródłowy
clc: close all; clear all;
x=[0 pi/3 pi/2 3*pi/4];
y=sin(x).^2;
S=nsfit(x,y);
N=length(x)-1;
H=diff(x);
D=diff(y)./H;
A=H(2:N-1);
B=2*(H(1:N-1)+H(2:N));
C=H(2:N);
U=6*diff(D);
for k=2:N-1
temp=A(k-1)/B(k-1);
B(k)=B(k)-temp*C(k-1);
U(k)=U(k)-temp*U(k-1);
end
M(N)=U(N-1)/B(N-1);
for k=N-2:-1:1
M(k+1)=(U(k)-C(k)*M(k+2))/B(k);
end
M(1)=0;
M(N+1)=0;
for k=0:N-1
S(k+1,1)=(M(k+2)-M(k+1))/(6*H(k+1));
S(k+1,2)=M(k+1)/2;
S(k+1,3)=D(k+1)-H(k+1)*(2*M(k+1)+M(k+2))/6;
S(k+1,4)=y(k+1);
end
xpom=linspace(x(1),x(4));
ypom=sin(xpom).^2;
x1=x(1):0.01:x(2); y1=polyval(S(1,:),x1-x(1));
x2=x(2):0.01:x(3); y2=polyval(S(2,:),x2-x(2));
x3=x(3):0.01:x(4); y3=polyval(S(3,:),x3-x(3));
[E,F]=newpoly(x,y);
n=length(x);
F=zeros(n,n);
F(:,1)=y';
for j=2:n
for k=j:n
F(k,j)=(F(k,j-1)-F(k-1,j-1))/(x(k)-x(k-j+1));
end
end
E=F(n,n);
for k=(n-1):-1:1
E=conv(E,poly(x(k)));
m=length(E);
E(m)=E(m)+F(k,k);
end
yy=polyval(E,xpom);
Error1=abs(ypom-yy);
ypom1=sin(x1).^2;
ypom2=sin(x2).^2;
ypom3=sin(x3).^2;
E1=abs(ypom1-y1);
E2=abs(ypom2-y2);
E3=abs(ypom3-y3);
subplot(3,1,1);
hh1=plot(xpom,yy,'k-',x1,y1,x2,y2,x3,y3,'g:',xpom,ypom,'r-');
subplot(3,1,2);
hh2=plot(xpom,Error1,'k-');
title('błąd lokalny dla wielomianu Newtona')
subplot(3,1,3);
hh3=plot(x1,E1,x2,E2,x3,E3,'k-');
title('błąd lokalny dla funkcji sklejanych')
Wyniki obliczeń – wykresy.
Analiza wniosków.
Błędy lokalne wyszły nieduże. Największe błędy były na pierwszym przedziale. Z powyższych wykresów widać, że funkcje sklejane nieznacznie lepiej dopasowują się do badanej funkcji ponieważ na drugim oraz trzecim przedziale ich błąd lokalny wraz ze wzrostem wartości x maleje, dlatego jeżeli to możliwe należy stosować dopasowanie funkcjami sklejanymi.