Politechnika Śląska
Gliwice
Wydział Automatyki Elektroniki i Informatyki
Rok akademicki 2008/2009
Kierunek: Automatyka i Robotyka sem. IV
Semestr letni
Laboratorium Metod Numerycznych
Ćwiczenie 6: Aproksymacja
Wykonali:
Barski Grzegorz
Kapusta Mateusz
Grupa 4 Sekcja 1
Data odbycia dwiczenia:
20.04.2009
Wprowadzenie
Aproksymacja to proces określania rozwiązao przybliżonych na podstawie rozwiązao znanych, które są bliskie
rozwiązaniom dokładnym w ściśle sprecyzowanym sensie. Przeważnie aproksymuje się funkcje skomplikowane
funkcjami prostszymi. W zależności od celu aproksymacji wybieramy różne metody, w których różnie można
definiowad jakośd przybliżenia, wprowadzając różne miary odległości między funkcjami (aproksymowaną i
aproksymującą).
Dla danej funkcji
oraz aproksymującej ją funkcji
gdzie
można wprowadzid miary odległości
między obiema funkcjami określające metody aproksymacji:
Miara jednostajna
Miara średniokwadratowa (z wagą
Miara punktowa – gdy funkcja aproksymowana dana jest w dyskretnych punktach
Stosując aproksymację średniokwadratową funkcję
należy aproksymowad funkcją
Przebieg ćwiczenia
Zadanie 1.
Dla
zadanej funkcji aproksymowanej
funkcji ważącej
przedziału aproksymacji
funkcji aproksymującej w postaci wielomianu
należało zaprogramowad algorytm wyznaczający współczynniki funkcji aproksymującej wykorzystując
aproksymację średniokwadratową. Dodatkowo wykreślono wielomiany aproksymujące funkcję
.
Zgodnie z wielomianami Legendre’a przyjęto:
Następnie wyznaczono kolejne wielomiany stopni
według wzoru na wielomiany Legendre’a:
Na podstawie powyższego wzoru otrzymujemy wyrażenia na kolejne
:
Wyznaczono następnie wartości współczynników oraz według wzoru:
c
0
=1.028123101·10
-13
=0
c
1
=0.9035060368=0.9035
c
2
=9.659973074·10
-13
=0
c
3
=-0.06304606782=-0.063
c
4
=1.250552562·10
-11
=0
c
5
=0.001
Po podstawieniu współczynników w odpowiednie miejsca odpowiednich wielomianów:
Otrzymano wielomiany kolejnych rzędów oraz ich dokładności (błędy):
Wielomian q
i
(x)
Błąd
Do wyznaczenia poszczególnych wielkości:
oraz uzyskania wykresów, wykorzystywanych w trakcie aproksymacji średniokwadratowej skorzystano ze środowiska
Derive 6.0™ oraz środowiska Mathematica™. Nie wykreślono wielomianów stopnia
oraz
, ponieważ nie
różniły się niczym od wielomianów stopnia odpowiednio
.
Zadanie 2.
Dla zadanych wartości funkcji aproksymowanej zaprogramowad algorytm obliczający aproksymację punktową
metodą wielomianów ortogonalnych.
Otrzymano punkty do algorytmu
X
-2
-1 0 1 2
Y -4 -1 -2 0 -1
Następnie wyznaczono wielomiany ortogonalne:
Poniżej przedstawiono przebiegi wielomianów aproksymujących
Algorytm działania metody
//********** aproksymacja punktowa *********************************************
//******************** wybór wartości m i n ************************************
const int n=5;
const int m=1;
float tab[5][2],S[2*m+1],T[m+1],B[m+1][m+1],C[m+1][m+1];
float A[m+1][m+1],sum,y[m+1],wynik[m+1];
int i,j,k;
fstream plik;
//otwarcie pliku do zapisu
void utworz(){
//tworzenie macierzy B,C dla metody choleskiego
for(i=0;i<=m;i++)
for(j=0;j<=m;j++){
B[i][j]=0;
C[i][j]=0;
}
for(i=0;i<=m;i++){
B[i][0]=A[i][0];
C[0][i]=A[0][i]/B[0][0];
}
for(i=1;i<=m;i++)
for(j=1;j<=m;j++){
if(j<=i){
sum=0;
for(k=0;k<=j-1;k++)
sum+=B[i][k]*C[k][j];
B[i][j]=A[i][j]-sum;
}
if(j>=i){
sum=0;
for(k=0;k<=i-1;k++)
sum+=B[i][k]*C[k][j];
C[i][j]=(A[i][j]-sum)/B[i][i];
}
}
}
void oblicz(){
//obliczenie Xi metodą choleskiego
for(i=0;i<=m;i++){
if(i==0)
y[0]=T[0]/B[0][0];
else{
sum=0;
for(k=0;k<i;k++)
sum+=B[i][k]*y[k];
y[i]=(T[i]-sum)/B[i][i];
}
}
for( i=m;i>=0;i--){
if(i==m)
wynik[i]=y[i];
else{
sum=0;
for(k=i+1;k<=m;k++)
sum+=C[i][k]*wynik[k];
wynik[i]=y[i]-sum;
}
}
}
int main(){
//deklaracja punktów
tab[0][0]=-2;
tab[1][0]=-1;
tab[2][0]=0;
tab[3][0]=1;
tab[4][0]=2;
tab[0][1]=-4;
tab[1][1]=-1;
tab[2][1]=-2;
tab[3][1]=0;
tab[4][1]=-1;
for(i=0;i<=2*m;i++)
for(j=0;j<n;j++)
S[i]+=pow(tab[j][0],i);
for(i=0;i<=m;i++)
for(j=0;j<n;j++)
T[i]+=pow(tab[j][0],i)*tab[j][1];
for(i=0;i<=m;i++)
for(j=0;j<=m;j++)
A[i][j]=S[i+j];
utworz();
oblicz();
cout<<"Q"<<m<<"(x) = ";
plik.open("wynik.txt",ios::out);
for( i=0;i<=m;i++){
cout<<wynik[m-i]<<"x^"<<m-i;
plik<<wynik[m-i]<<"x^"<<m-i;
if(wynik[m-i-1] >= 0){
cout<<"+";
plik<<"+";
}
}
Wnioski
1. Analiza wykresów pozwala na wniosek: im wyższy stopieo wielomianu aproksymującego tym wielomian jest
bliższy zadanej funkcji na konkretnym przedziale.
2. Dla aproksymacji średniokwadratowej wykresy już przy 5 stopniu wielomianu są bardzo bliskie rzeczywistej
funkcji
.
3. Dla aproksymacji punktowej widad na podstawie analizy powyższego wykresu, iż każdy kolejny stopieo
wielomianu daje wykres przechodzący przez jeden punkt więcej w stosunku do poprzedniego wielomianu
niższego rzędu poczynając od dwóch punktów dla wielomianu w postaci funkcji liniowej. Konsekwencją tego
jest fakt, iż dla czwartego stopnia wielomian aproksymujący staje się wielomianem interpolacyjnym, a
punkty węzłami interpolacji, zatem aby uzyskad jednoznaczne rozwiązanie, wielomian przechodzący przez
zadane punktów musi byd stopnia
.
4. Metoda aproksymacji funkcji daje wyniki bardzo dokładne, a jednocześnie znacznie upraszcza postad funkcji,
co pozwala łatwo określid wartośd funkcji dla dowolnego argumentu.