INSTYTUT AUTOMATYKI
ZAKŁAD TEORII STEROWANIA
Semestr: IV
Wydział: EEIiA
Grupa: 4C2, poniedziałek 1015
LABORATORIUM METOD NUMERYCZNYCH
Ćwiczenie nr 3
Temat: Interpolacja i aproksymacja
Imię i Nazwisko |
Nr indeksu |
Tomasz Jończyk |
163527 |
Piotr Morawiec |
163567 |
Celem ćwiczenia było praktyczne zaznajomienie się z podstawowymi aspektami interpolacji wielomianowej, interpolacji funkcjami sklejanymi i aproksymacji średniokwadratowej.
Interpolacja metodą rodziny trójkątnej
Funkcja 1
%function [c]=inter1(x,y)
x=linspace(-6,3,15);
y=exp(-(x/3)).*cos(x);
n=length(x);
m=n;
%Mianownik
mianownik2=ones(n,n);
for i=2:n
for j=1:n
if j<i
mianownik(i,j)=(x(i)-x(j));
else
mianownik(i,j)=1;
end
end
end
mianownik;
%mianownik2=prod(mianownik(4,:));
%Licznik
c=ones(n,1);
c(1,1)=y(1);
for i=2:n
c(i,1)=(y(i))/prod(mianownik(i,:));
h=i-1;
g=i;
for j=1:n
h=h-1;
g=g-1;
if j<i
c(i,1)=c(i,1)-((c(g,1)*prod(mianownik(i,(1:(h)))))/prod(mianownik(i,:)));
end
end
end
c %wartosci poszczegolnych c
U=1 %wartosc wielomianu w danym punkcie
for i=1:n
X(:,m)=x(1,i);
R=U-x(1,1:i-1);
wsp(i,:)=prod(R);
wynik(i,:)=c([i],1)*wsp(i,:)
end
sum(wynik)
wynik =
7.0948
-38.2252
-3.4819
208.5858
-283.9372
73.2480
87.1065
-61.1182
10.4051
1.0631
-0.3689
0.0153
0.0000
-0.0000
-0.0000
ans =
0.3871
Dla funkcji y= exp(-(x/3)).*cos(x), gdzie x zawiera się w przedziale [-6,3] wartości funkcji w x=1 wyniosła y= 1.174367344.
Funkcja 2
%function [c]=inter2(x,y)
x=linspace(-4,6,15);
y=(x./(sqrt(1.+x.^2)));
n=length(x);
m=n;
%Mianownik
mianownik2=ones(n,n);
for i=2:n
for j=1:n
if j<i
mianownik(i,j)=(x(i)-x(j));
else
mianownik(i,j)=1;
end
end
end
mianownik;
%mianownik2=prod(mianownik(4,:));
%Licznik
c=ones(n,1);
c(1,1)=y(1);
for i=2:n
c(i,1)=(y(i))/prod(mianownik(i,:));
h=i-1;
g=i;
for j=1:n
h=h-1;
g=g-1;
if j<i
c(i,1)=c(i,1)-((c(g,1)*prod(mianownik(i,(1:(h)))))/prod(mianownik(i,:)));
end
end
end
c %wartosci poszczegolnych c
U=1 %wartosc wielomianu w danym punkcie
for i=1:n
X(:,m)=x(1,i);
R=U-x(1,1:i-1);
wsp(i,:)=prod(R);
wynik(i,:)=c([i],1)*wsp(i,:)
end
sum(wynik)
wynik =
-0.9701
0.0943
0.2352
0.5482
1.1841
1.4925
-1.7581
-0.1190
0
0
0
0
0
0
0
ans =
0.7071
Dla funkcji y=(x./(sqrt(1.+x.^2))), gdzie x zawiera się w przedziale [-4,6] wartości funkcji w x=1 wyniosła y= 0.7071.
Aproksymacja
function [c]=apro(x,y)
%obliczam fi_0
l=length(x);
fi_1=ones(l,1);
for i=1:l
fi_0(i)=exp(x(i));
end
a00=dot(fi_0,fi_0);
a01=dot(fi_0,fi_1);
a10=dot(fi_1,fi_0);
a11=dot(fi_1,fi_1);
b0=dot(fi_0,y);
b1=dot(fi_1,y);
A=[a00 a01;a10 a11];
B=[b0;b1];
c=inv(A)*B;
yy=c(1) + c(2)*exp(x);
%wielomian aproksymujący stopnia drugiego
p = polyfit(x, y, 2);
yp = polyval(p, x);
%Wykresy:
plot(x,y,'g-',x,yy,'b-',x,yp,'r-'),grid,legend('funkcja prawidlowa','aproksymacja sredniokwadratowa','aproksymacja wielomianem drugiego stopnia'),xlabel('x'),ylabel('f(x)'),title('Aproksymacja średniokwadratowa i wielomianem drugiego stopnia');
plot(x,abs(y-yy),'r-',x,abs(y-yp),'b-'),grid,legend('aproksymacja sredniokwadratowa','aproksymacja wielomianem drugiego stopnia'),xlabel('x'),ylabel('blad'),title('Wykres błędu');
Dla:
x=[0.000 0.100 0.200 0.300 0.400 0.500 0.600 0.700 0.800 0.900 1.000]
y=[4.1724 4.1040 4.1022 4.2587 4.2130 4.3558 4.7028 4.6478 4.6564 4.8710 4.9451]
a = 0.5290
b = 3.5407