GNU Octave/Aproksymacja wielomianowa

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania

Aproksymacja wielomianowa w przestrzeni Hilberta[edytuj]

Rozpatrzmy przestrzeń Hilberta funkcji całkowalnych z drugą potęgą , z iloczynem skalarnym . Dana jest . Znaleźć wielomian stopnia najlepiej przybliżający , czyli taki, który minimalizuje normę .

W tym celu należy rozwiązać układ równań:

gdzie jest szukanym wektorem współczyników macierz G jest macierzą Grama, a jest wektorem:

W naszym przypadku macierz Grama G sprowadza się do macierzy Hilberta, gdyż

Algorytm ten można wykonać w środowisku Octave następująco. Zdefiniujmy funkcję charakterystyczną :

function [y]=fcharakt(x)
   y=(x<=0.5);
endfunction;

Do obliczenia wektora potrzebujemy funkcji :

function [y]=f_razy_xn(x)
   global n;
   global fun;
   z=feval(fun,x);
   y=(z).*(x^n);
endfunction;

Dla zadanego stopnia wielomianu N tworzymy macierz Grama:

N=15;
G=hilb(N+1);

Tworzymy wektor :

f=zeros(1,N+1);
global n;
global fun;
fun="fcharakt";
for (n=0:N)
   f(n+1)=quad("f_razy_xn", 0, 1);
endfor;

I wreszcie obliczamy współczynniki (w odwrotnej kolejności) :

alfa=G\f'

Uwaga. Ta metoda nie jest dobra dla dużych N, gdyż macierz Hilberta jest źle uwarunkowana.

Stopień wielomianu: 1
Stopień wielomianu: 3
Stopień wielomianu: 5
Stopień wielomianu: 10
Stopień wielomianu: 20