Loading web-font TeX/Math/Italic

sábado, 14 de outubro de 2017

Extrapolação de Richardson: melhorado a estimativa de uma derivada numérica

f(x) = e^{x/2}\cos(2\pi x)
Existem basicamente três formas de melhorar a estimativa da derivada numérica de uma função: diminuir o valor do passo h, aumentar o número de pontos no cálculo da derivada ou usar a Extrapolação e Richardson. O primeira forma é (quase) trivial, basta reduzir arbitrariamente o valor do passo h, mas um passo muito pequeno aumenta o erro total (ver aqui). O segundo método é ilustrado a seguir (derivada centrada):
f'(x) = \frac{f(x+h) - f(x-h)}{2h} + O(h^2)

f'(x) = \frac{-f(x+2h) +8 f(x+h)-8f(x-h)+f(x-2h)}{12h} + O(h^4)

Já a Extrapolação de Richardson faz duas estimativas da derivada, uma (D_1) com passo h e outra (D_2) com o passo reduzido h/2, com essas duas estimativas, a nova estimativa mais acurada é dada por:
D = \frac{4D_2 - D_1}{3}

Vejamos um exemplo. Vamos considerar a função f(x) = e^{x/2}\cos(2\pi x)
e calcular sua derivada em x_0 = 1/4. Os resultados, para um passo h = 0,1, são:
D1,                 D2,                 D,                 Derivada teórica:
 -6.6688068,  -7.0054312,    -7.1176393,  -7.1197817

Esse passo, mesmo sendo relativamente grande, gerou um resultado satisfatório com um erro relativo de cerca de 0,03\%. O código Scilab é:

//////////////
function f =  fb(x)
    f = exp(x/2).*cos(2*%pi*x);
endfunction

//////////////
function f =  fbd(x)
    f = x.*exp(x/2).*cos(2*%pi*x)/2 - exp(x/2)*sin(2*%pi*x)*2*%pi;
endfunction

x = 1/4;
h = 0.1;
d1 = (fb(x+h)-fb(x-h))/(2*h);
h2 = h/2;
d2 = (fb(x+h2)-fb(x-h2))/(2*h2);
d = (4*d2-d1)/3
disp([d1, d2, d, fbd(1/4)]);

Nenhum comentário:

Postar um comentário