GNU Octave/Aproksymacja wielomianowa

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