Numerické metody Interpolace a aproximace dat. Interpolace dat křivkou (funkcí) - křivka (graf funkce) prochází daty (body) přesně. Aproximace dat křivkou (funkcí) - křivka (graf funkce) prochází daty (body) přibližně. - - -2 2 4 6-2 2 4 6 Figure : Náhrada f(x) = sin(x) na (, 6) polynomem čtvrtého stupně. Nejčastěji se za křivky (funkce) používají polynomy nebo lineární kombinace goniometrických funkcí sin(kx) a cos(kx).
Interpolace Příklad. Proložte body [, 7], [2, ] a [3, ] polynomem 2. stupně. [... řešení na tabuli... soustava lineárních rovnic...] Výsledek: polynom p(x) = 4x 2 4x + 7 3 2 2 2 3 4 plot([,2,3],[7,,], r., MarkerSize,2); p = polyfit([,2,3],[7,,],2) % koef. pol. x = linspace(,4,); % vektor x pro kresleni y = polyval(p,x); % hodnoty polynomu v x plot(x,y); 2
K čemu potřebujeme interpolaci polynomem? Příklad. Nahraďte funkci f(x) = cos(πx) na intervalu (, 2 ) polynomem 3. stupně. Zvolíme bodů na intervalu (, 2 ) vypočítáme v nich funkční hodnoty funkce f(x) získané body v rovině proložíme (jako v předchozím příkladě) polynomem (tentokrát stupně 3). Výsledek: p(x) = +.88x.9423x 2 + 3.37x 3. 2.. -. - -. -2 -... plot([,/6,/3,/2],[,sqrt(3)/2,/2,],... r., MarkerSize,2); p = polyfit([,/6,/3,/2],[,sqrt(3)/2,/2,],3) x = linspace(-.8,.8,); y = polyval(p,x); plot(x,y, b ); plot(x,cos(pi*x), r-- ); grid on axis([-.8,.8,-2,2]); Nyní, potřebujeme-li přibližnou hodnotu cos(.3π), stačí spočítat p(.3) = +.88.3.9423.3 2 + 3.37.3 3. 3
Nebo: Příklad. Nahraďte funkci f(x) = e x2 (Gaussovo rozdělení) na intervalu (, ) polynomem 6., 2. a 8. stupně,. -. -. -. -. N = 7; %7, 3 nebo 9 a = ; % interval (-a,a) x = linspace(-a,a,n); % data y = exp(-x.ˆ2); % data plot(x,y, r., MarkerSize,2); p = polyfit(x,y,n-) x = linspace(-a,a,); y = polyval(p,x); plot(x,y, b ); plot(x,exp(-x.ˆ2), r-- ); grid on axis([-a,a,-.,.2]); -. - Oscilace na krajích intervalu! Interpolace polynomem vysokých stupňů je nevhodná. 4
Aproximace - křivka nepochází daty přesně ale jen přibližně. Příklad. Proložte body [, 3], [, 4] a [2, 4] polynomem. stupně. (Lineární regrese.) [... řešení na tabuli... soustava lineárních rovnic...] Výsledek: p(x) = 9 6 + 2x 3.667 +. x. 4 3 2-2 3 plot([,,2],[3,4,4], r., MarkerSize,2); p = polyfit([,,2],[3,4,4],) x = linspace(-,3,); y = polyval(p,x); plot(x,y); axis([-,3,,]); Je vidět, že funkce p(x) neprochází zadanými body přesně, ale přesto dobře vystihuje jejich chování (průběh).
Příklad. Proložte body [x, y ], [x 2, y 2 ],..., [x N, y N ] polynomem. stupně a polynomem 2. stupně. Lineární regrese; polynomická regrese; metoda nejmenších čtverců. [... řešení na tabuli... soustava lineárních rovnic...] 2 2 - -4-2 2 4 2 2 - -4-2 2 4 % 3 bodu na ose x: x = linspace(-4,4,3); % data s nahodnym sumem: y = x.ˆ2+3*x-+randn(,3); plot(x,y, r., MarkerSize,2); p = polyfit(x,y,2) % nebo 2 x = linspace(-4,4,); y = polyval(p,x); plot(x,y); axis([-4,4,-6,28]) 6
Dosud pouze aproximace pomocí polynomů. Nyní lineární kombinace goniometrických funkcí sin(kx) a cos(kx) a, k =, 2,..., N. - důležité pro fyzikální aplikace - odstranění šumu u zvukových signálů, MRI - elektromagnetické vlnění (radary), atd. Příklad. Aproximujte zadaná data [x, y ], [x 2, y 2 ],..., [x N, y N ] lineární kombinací funkcí sin(x), sin(2x), sin(3x), sin(4x),, cos(x), cos(2x), cos(3x), cos(4x), 3 2 - -2-3 2 3 4 6 7
Příklad. (Opak.) Aproximujte zadaná data [x, y ], [x 2, y 2 ],..., [x N, y N ] lineární kombinací funkcí sin(x), sin(2x), sin(3x), sin(4x),, cos(x), cos(2x), cos(3x), cos(4x). Jak se to spočítá: V bodech x, x 2,..., x N se vyhodnotí všechny funkce sin(x), sin(2x), sin(3x), sin(4x),, cos(x), cos(2x), cos(3x) a cos(4x). Získaných 9 vektorů hodnot se jako sloupce sestaví do matice, kterou označíme Y. Potom sestrojíme matici A = Y T Y a vektor b = Y T y, kde y je sloupcový vektor dat (y, y 2,..., y N ) T. Potom vyřešíme soustavu rovnic Au = b. Získaný vektor u = (u,..., u N ) T obsahuje koeficienty takové, že hledaná funkce je p(x) = u sin(x)+u 2 sin(2x)+...+u 4 sin(4x)+u +u 6 cos(x)+...+u 9 cos(4x). 8
Diskrétní Fourierova transformace. Funkce fft a ifft v Matlabu. 3 2 - -2-3 2 3 4 6 % 9 bodu na ose x: x = linspace(,2*pi,9); x(end) = []; % data s nahodnym sumem: y = 2*sin(3.2*x)+*cos(.9*x+)+randn(,9)/2; plot(x,y, r., MarkerSize,); plot(x,y, r ); % diskretni Fourierova transformace: z = fft(y); % vynulovani vysokych frekvenci: z(6:end-4) = ; % inverzni diskretni Fourierova transformace: y = ifft(z); plot(x,y); 9
Příklad. Odstraňte šum v zadaném akustickém signálu. Šum obvykle odpovídá vysokým frekvencím v datech. - 2 3 4 6-2 3 4 6-2 3 4 6 % N bodu na ose x: N = 2; x = linspace(,2*pi,n+); x(end) = []; % data s nahodnym sumem: y = cos(x)+2*sin(9*x)+.*cos(*x+)+... randn(,n)*.6; % plot(x,y, r., MarkerSize,); plot(x,y, r ); % diskretni Fourierova transformace: z = fft(y); % vynulovani vysokych frekvenci: M = round(n/); z(m+:end-m+) = ; % inverzni diskretni Fourierova transformace: y = ifft(z); plot(x,y, b ); axis([,2*pi,-,]);
Příklad. Aproximujte (náhodná) data v prostoru. N = [,;,;,;,;,2;2,]; % exponenty x a y Nmax = size(n,); % pocet polynomu M = 2; % pocet dat data = rand(m,3); % data v (,)x(,) Y = zeros(m,nmax); for k = :M % vyhodnoceni vsech pol. ve vsech bodech for j = :Nmax Y(k,j) = F(data(k,),data(k,2),N(j,),N(j,2)); end;.8 end;.6 A = Y *Y; B = Y *data(:,3);.4 u = A\B; % reseni (koeficienty) // Zde kresleni....2 function z = F(x,y,n,n2) z = xˆn*yˆn2; -.2 -.4.8.6.4.2.
... dokončení: // Kresleni: x = linspace(,,2); y = linspace(,,2); [X,Y] = meshgrid(x,y); for k = :2 % vypocet pro kresleni for j = :2 pom = for n = :Nmax pom = pom + u(n)*f(x(k,j),y(k,j),n(n,),n(n,2)); end; Z(k,j) = pom; end; end; plot3(data(:,),data(:,2),data(:,3), kˆ ); surf(x,y,z); grid on; -