Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 10524 razy

Opis matematyczny aproksymacji metodą najmniejszych kwadratów.

Niechaj istnieje taki zbiór punktów P1, P2, ..., Pm, dla których szukana jest funkcja w postaci wielomianu n-tego stopnia, gdzie nm-1. Punkty P1, P2, ..., Pm można zapisać w następującej postaci:

begin{matrix}P_1.x = x_1 & P_1.y=f(x_1)\ P_2.x = x_2 & P_2.y=f(x_2)\ vdots & vdots\ P_m.x = x_m & P_m.y=f(x_m)end{matrix} [1]

sam zaś wielomian funkcji aproksymującej zadane punkty, będzie wyglądał w następujący sposób:

f_{apr}(x)=a_0cdot x^0+a_1cdot x^1+hdots+a_ncdot x^n [2]

co z kolei można w prostszy sposób zapisać:

f_{apr}(x)=sum_{i=0}^{n}a_icdot x^i [3]

Zaprawdę powiadam wam, że można wyznaczyć współczynniki a0, a1, ..., an wielomianu fapr(x) układając następującą macierz:

begin{bmatrix}w_{0,0} & w_{0,1} & hdots & w_{0, n} & w_{0, n+1}\ w_{1,0} & w_{1,1} & hdots & w_{1, n} & w_{1, n+1} \ vdots & vdots & ddots & vdots & vdots \ w_{n, 0} & w_{n, 1} & dots  & w_{n, n} & w_{n, n+1} 
end{bmatrix} [4]

gdzie współczynniki kolumn od 0 do n przyjmują wartości według następującego wzoru:

w_{i, j}=sum_{k=1}^{m}{x_k}^{i+j} [5]

dla ostatniej kolumny zaś, wartości współczynników obliczyć z wzoru:

w_{i, n+1}=sum_{k=1}^{m}{x_k}^{i}cdot f(x_k) [6]

Po wyliczeniu współczynników macierzy, należy niezwłocznie przejść do jej rozwiązania np. metodą Gaussa lub metodą Gaussa-Jordana.

Przykład rozwiązania

Niechaj podane będą następujące punkty: {1; 6}; {2; 8}; {4; 4}; {6; 2}; {8; 0}; {10; 2}. Wyznaczyć wielomian 2-giego stopnia aproksymujący te punkty.

Nie będzie wielkim rozwiązaniem tajemnicy, gdy stwierdzę, że konieczne jest utworzenie macierzy o rozmiarach n×n+1. Dla świętego spokoju rozpiszę tą macierz poniżej:

begin{bmatrix}w_{0,0} & w_{0,1} & w_{0,2} & w_{0,3}\ w_{1,0} & w_{1,1} & w_{1,2} & w_{1,3}\ w_{2,0} & w_{2,1} & w_{2,2} & w_{2,3}end{bmatrix} [7]

Wyznaczenie współczynników o indeksach kolumn od 0 do 2 (czyli do n):

w_{0,0}=sum_{k=1}^{m}{x_k}^{0+0}=6 [8]
w_{0,1}=sum_{k=1}^{m}{x_k}^{0+1}=1+2+4+6+8+10=31 [9]
w_{0,2}=sum_{k=1}^{m}{x_k}^{0+2}=1^2+2^2+4^2+6^2+8^2+10^2=221 [10]
w_{1,0}=sum_{k=1}^{m}{x_k}^{1+0}=w_{0,1}=31 [11]
w_{1,1}=sum_{k=1}^{m}{x_k}^{1+1}=1^2+2^2+4^2+6^2+8^2+10^2=221 [12]
w_{1,2}=sum_{k=1}^{m}{x_k}^{1+2}=1^3+2^3+4^3+6^3+8^3+10^3=1801 [13]
w_{2,0}=sum_{k=1}^{m}{x_k}^{2+0}=w_{0,2}=221 [14]
w_{2,1}=sum_{k=1}^{m}{x_k}^{2+1}=w_{1,2}=1801 [15]
w_{2,2}=sum_{k=1}^{m}{x_k}^{2+2}=1^4+2^4+4^4+6^4+8^4+10^4=15665 [16]

Współczynniki ostatniej kolumny macierzy:

w_{0,3}=sum_{k=1}^{m}{x_k}^{0}cdot f(x_k)=1cdot 6+1cdot 8 +1cdot 4+1cdot 2+1cdot 0+1cdot 2=22 [17]
w_{1,3}=sum_{k=1}^{m}{x_k}^{1}cdot f(x_k)=1cdot 6+2cdot 8 +4cdot 4+6cdot 2+8cdot 0+10cdot 2=70 [18]
w_{2,3}=sum_{k=1}^{m}{x_k}^{2}cdot f(x_k)=1^2cdot 6+2^2cdot 8 +4^2cdot 4+6^2cdot 2+8^2cdot 0+10^2cdot 2=374 [19]

Najwyższy czas poskładać do kupy macierz:

begin{bmatrix}6 & 31 & 221 & 22\ 31 & 221 & 1801 & 70\ 221 & 1801 & 15665 & 374end{bmatrix} [20]

Nie będę tutaj rozwiązywał tej macierzy, powiem tylko, że jej rozwiązanie daje w wyniku następujące wartości współczynników szukanego wielomianu:

left{ begin{matrix}a_0=9,2196044712\ a_1=-1,7613069647\ a_2=0,0963026655end{matrix}}  right [21]

Funkcja fapr(x)=a0·x0+a1·x1+a2·x2=9,2196044712-1,7613069647·x+0,0963026655·x2 nie należy do najpiękniejszych, ale jak wynika z poniższego wykresu, działa ona bez zarzutu.

wykres aproksymacji
Rys. 1
Wykres aproksymacji punktów metodą najmniejszych kwadratów.

Wykres wygenerowany został w programie wxMaxima za pomocą następującego kodu:

plot2d([9.219604471*x^0-1.761306965*x^1+0.09630266552*x^2,[discrete,[[1, 6],[2, 8],[4, 4],[6, 2],[8, 0],[10, 2]]]],[x,1,10],[style,line,points],[gnuplot_term, "svg size 600,500"], [gnuplot_out_file, "C:\\aproksymacja.svg"],[legend,"fapr(x)=0.09630266552*x^2-1.761306965*x+9.219604471","punkty aproksymowane"]);

I edytowany w programie Inkscape

A na co to komu?

Stosuje się do uzyskania wzoru w postaci prostej funkcji wielomianowej punktów uzyskanych w wyniku przeprowadzanych pomiarów.

Program Aproksymator.exe

Pewnego dnia obudziłem się z przemożną chęcią napisania programu, który po podaniu odpowiednich danych na wejście wypluje mi na powierzchnię ekranu funkcję aproksymującą zadane punkty wielomianem stopnia, który ja podałem. Toteż i zakasałem rękawy i zrobiłem taki właśnie mały programik o dźwięcznej nazwie Aproksymator.exe.

Pragnę nadmienić, że program ten rozwiązanie zapisuje do pliku tekstowego aproksymacja.txt, gdzie w perfidny (żeby nie powiedzieć, że przebiegły) sposób program zapisuje dane wejściowe, funkcję aporoksymującą oraz (jakby tego było mało) kod niezbędny do wygenerowania wykresu punktów i funkcji aproksymującej w programie wxMaxima.

Przykład, rozwiązania wygenerowanego przez mój program rozwiązania dla wcześniej rozwiązywanego zadania z najdzikszą wręcz rozkoszą zamieszczam poniżej:

Oto rozwiązanie aproksymacji wielomianiem 2 stopnia następujących punktów: P1x= 1 P1y= 6 P2x= 2 P2y= 8 P3x= 4 P3y= 4 P4x= 6 P4y= 2 P5x= 8 P5y= 0 P6x= 10 P6y= 2 Funkcja aproksymujaca zadane punkty przyjmuje postac nastepujaca: fapr(x)=9.219604471*x^0-1.761306965*x^1+0.09630266552*x^2 Wykres w WxMaximie: plot2d([9.219604471*x^0-1.761306965*x^1+0.09630266552*x^2,[discrete,[[1, 6],[2, 8],[4, 4],[6, 2],[8, 0],[10, 2]]]],[x,1,10],[style,line,points])

Poniżej krótki filmik pokazujący działanie programu.

Załączniki:

Program Aproksymator do aproksymacji punktów metodą najmniejszych kwadratów
Layout wykonany przez autora strony, wszelkie prawa zastrzeżone. Jakiekolwiek użycie części lub całości grafik znajdujących się na tej stronie bez pisemnej zgody jej autora surowo zabronione.