background image

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 

background image

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: 

background image

 

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 

 

 

 

 

 

 

 

 

 

 

 

 

background image

 

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 

-2

  -1  0  1  2 

Y  -4  -1  -2  0  -1 

Następnie wyznaczono wielomiany ortogonalne: 

 

 

 

 

 

 

 

 

Poniżej przedstawiono przebiegi wielomianów aproksymujących 

 

background image

 

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]; 
              }     
           } 

 

background image

 
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.