Treść zadania
„Aproksymacja średniokwadratowa” – Dla danego zbioru punktów:
x | 0 | 1 | 2 | 3 |
---|---|---|---|---|
y | 0.98 | 0.35 | 0.19 | 0.15 |
wyznacz ręcznie współczynniki funkcji f(x)=1/(ax+b) stosując metodę aproksymacji średniokwadratowej i porównaj wyniki z wyliczeniami numerycznymi stosując odpowiednie skrypty Octava. Następnie wyznacz wartości norm E∞, E1, E2 dla tak wyznaczonej funkcji f(x). Wykreśl podane punkty {xi,y(xi) } oraz funkcję f(x) używając komendy plot. Wydruki wykresów (wraz z kodem) dołącz do sprawozdania.
Wstęp teoretyczny
Aproksymacja dyskretna – funkcję dyskretną y=f(x) oraz jej zadane wartości można przedstawić w formie tabelarycznej.
Tabela 1. Zadane wartości funkcji dyskretnej
xi | x0 | x1 | … | xn |
---|---|---|---|---|
yi = f(xi) | y0 | y1 | … | yn |
Kolejnym krokiem jest wybranie funkcji aproksymującej. Zwykle jest nią wielomian uogólniony, o postaci F(x) = a0φ0(x) + a1φ1(x) + … + amφm(x), w którym:
φ0, φ1, φm – wielomiany bazowe wymiarowej przestrzeni liniowej
a0, a1, am – współczynniki aproksymacyjne (szukane).
Jako funkcje bazowe stosuje się zwykle jednomiany (1, x1,x2…xm) lub funkcje trygonometryczne (1, cosx, sinx …)
Zagadnienie oznacza się jako iloczyn skalarny o postaci :
Znalezienie optymalnych współczynników ak, k = 0,1…,m sprowadza się finalnie do rozwiązania układu równań liniowych (układ normalnu). Rezultaty obliczeń układu o postaci poniżej, pozwala na wyznaczenie współczynników a0, a1, …, am.
Kod z programu MatLAB
clc; clear all; close all; format compact;
xi=[0 1 2 3 ];
yi=[0.98 0.35 0.19 0.15];
%zadana funkcja f(x)=1/(ax+b) -> f(x)=1/(a0+a1*x)
%zastąpIĘ f(x) przez g(x)-> aproksymacja wielomianami
% g(x)= 1/f(x)= (a0+a1*x)
gi=1./yi;
%funkcja ask - ze strony zakładu.Użyję do aproksymacji średniokwadratowej
%dla funkcji liniowej f(x)= (a1*x + a0) dla zbioru N punktów
[a1,a0]=ask(xi,gi);
%wartości f(x) dla obliczonych współczyników a0,a1
yii=1./(a0+a1*xi);
disp(sprintf('---- Współczynniki funkcji f(x)1/(a0 + a1*x) ----'))
disp(sprintf('a0= %.4f a1= %.4f - wyliczone programem ',a0,a1))
disp(sprintf('a0= %.4f a1= %.4f - wyliczone "ręcznie" ',1.06,1.93))
disp(sprintf('---- ----- ---- ---- ---- ---- ---- ----'))
disp(sprintf(' i %.0f %.0f %.0f %.0f',0:1:3))
disp(sprintf(' x %.0f %.0f %.0f %.0f',0:1:3))
disp(sprintf(' y %.4f %.4f %.4f %.4f',yi))
disp(sprintf(' g(xi) %.4f %.4f %.4f %.4f',gi))
disp(sprintf(' f(xi) %.4f %.4f %.4f %.4f',yii))
%rysowanie na wykresie punktów {xi, y(xi)} oraz funkcji f(x)
a=min(xi);
b=max(xi);
x=linspace(a,b);
fx=1./(a0+a1*x);
%fxx=1./(1.06+1.93*x);
%plot(xi,yi,'rx',x,fx,'g',x,fxx,'b','markersize',15);
plot(xi,yi,'rx',x,fx,'b','markersize',15);
xlim([-0.1 3.1])
grid on
%wyznaczanie wartości norm
%Norma maksimum
A=abs(yii-yi)
Emax=max(A);
%Norma średnia
Suma=0;
for i=1:4
Suma=Suma+A(i);
end
E1=(1/4)*(Suma);
%Norma średniokwadratowa
Suma=0;
for i=1:4
Suma=Suma+A(i)^2;
end
E2=sqrt((1/4)*(Suma));
disp(sprintf(' Wartości norm:'))
disp(sprintf(' Emax - norma maksimum Emax=%.4f ',Emax))
disp(sprintf(' E1 - norma średnia E1=%.4f ',E1))
disp(sprintf(' E2 - norma średniokwadratowa E2=%.4f ',E2))
Powyższy program wygenerował wykres:
Wykres 1. Wynik obliczeń
Do obliczeń użyta została funkcja ask.m, zaczerpnięta z zakładowej strony wraz z listą zadań z działu aproksymacja średniokwadratowa. Ma ona poniższą postać:
function [A,B]=ask(X,Y)
%Input X - wspolrzedne x-owe punktow
% Y - wspolrzedne y-owe punktow
%Output A - wspolczynnik A w dopasowaniu A*x+B
% B - wspolczynnik B w dopasowaniu A*x+B
xmean=mean(X);
ymean=mean(Y);
sumx2=(X-xmean)*(X-xmean)';
sumxy=(Y-ymean)*(X-xmean)';
A=sumxy/sumx2;
B=ymean-A*xmean;
end
Rezultaty obliczeń
---- Współczynniki funkcji f(x)1/(a0 + a1*x) ----
a0= 1.0501 a1= 1.9345 - wyliczone programem
a0= 1.0600 a1= 1.9300 - wyliczone "ręcznie"
---- ----- ---- ---- ---- ---- ---- ----
i 0 1 2 3
x 0 1 2 3
y 0.9800 0.3500 0.1900 0.1500
g(xi) 1.0204 2.8571 5.2632 6.6667
f(xi) 0.9523 0.3351 0.2033 0.1459
A =
0.0277 0.0149 0.0133 0.0041
Wartości norm:
Emax - norma maksimum Emax=0.0277
E1 - norma średnia E1=0.0150
E2 - norma średniokwadratowa E2=0.0172
W poniższej tabelach zestawione zostały wyniki obliczeń ręcznych oraz wykonanych przez program.
Tabela 2. Obliczone wartości współczynników
Wartości współczynników a0, a1 |
---|
Ręcznie |
MatLAB |
Tabela 3. Obliczone wartości f(x) dla aproksymacji średniokwadratowej
Wartości f(x) dla aproksymacji średniokwadratowej |
---|
Z treści zadania |
Ręcznie |
MatLAB |
Tabela 4. Obliczone wartości norm
Obliczone wartości norm |
---|
Ręcznie |
MatLAB |
Wnioski
Rezultaty obliczeń ręcznych i wykonanych pod MatLABem są zbliżone,
rozbieżności wynikają prawdopodobnie z dokładności obliczeń,
dokładność obliczeń ręcznych jest ograniczona w stosunku do obliczeń wykonanych przez program,
najmniejszą wartość normy posiada norma średnia, co oznacza że błąd dla niej jest najmniejszy, a tym samym metoda ta jest najdokładniejsza.