GNU Octave/Aproksymacja wielomianowa

Z testwiki
Wersja z dnia 15:54, 12 kwi 2008 autorstwa imported>Lethern (skopiowane ze str głównej GNU Octave)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania

Aproksymacja wielomianowa w przestrzeni Hilberta

Rozpatrzmy przestrzeń Hilberta funkcji całkowalnych z drugą potęgą L2(0,1), z iloczynem skalarnym <f,g>=01fg. Dana jest fL2(0,1). Znaleźć wielomian 𝒲=i=0Nαixi stopnia N>1 najlepiej przybliżający f, czyli taki, który minimalizuje normę f𝒲L2.

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

G(1,x,x2,...,xN)α=f,

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

fi=01f(x)xidx

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

Gi,j=<xi,xj>=01xi+j=1i+j+1

Algorytm ten można wykonać w środowisku Octave następująco. Zdefiniujmy funkcję charakterystyczną χ[0,1/2]:

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

Do obliczenia wektora f potrzebujemy funkcji fxn:

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:

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) α=G1f:

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


Szablon:Nawigacja