Cześć,
Sprawdziłby mi ktoś czy dobrze to mam zrobione? Z góry dziękuję. :)
Program:
- dokonuje interpolacji funkcją sklejania 1-go rzędu funkcji f(x) = sin(x) / x na równomiernej siatce węzłów o danej liczbie przedziałów n w przedziale [a,b]
- wykonuje wykresy funkcji f(x) oraz funkcji interpolującej dla 4 wartości n oraz wyznacza wykresy norm ||||1 oraz ||||2 dla błędu interpolacji wykorzystując metodę trapezów.
function z = teoaprox5(a,b,n)
if a > b
c=b;
b=a;
a=c;
end
% Wyznaczanie elementów po podziale na n części
delta=(b-a)/n;
X=a:delta:b;
aux=size(X);
% Tworzenie tablicy używanej przy wykresie
X2=a:0.01:b;
% Eliminacja Y(i)==0
for i=1:1:aux(2);
if X(i)==0;
X(i)=0.0001;
end
end
aux=size(X2);
for i=1:1:aux(2);
if X2(i)==0;
X2(i)=0.0001;
end
end
% Obliczenie funkcji nie interpolowanej
Y2=sin(X2)./X2;
% Tworzenie danych do interpolacji oraz interpolacja
Y=sin(X)./X;
aux=size(X);
FIT = polyfit(X,Y,aux(2)-1);
Yint= polyval(FIT,X2);
% Rysowanie wykresów
plot(X2,Yint,'g.',X2,Y2,'r.');
xlabel('x'); ylabel('y');title('Wykres funkcji y=f(x) oraz funkcji interpolującej');
axis([a b -0.5 1.1]); legend('funkcja interpolująca','funkcja interpolowana');
% Liczenie norm
norma1 = trapz(Y);
norma2 = sqrt(trapz(Y.*Y));
disp('norma1: ');disp(norma1);
disp('norma2: ');disp(norma2);