Nesse capítulo vamos estudar como usar o computador para encontrar uma aproximação para o coeficiente angular da reta tangente à \(f\) no ponto \(x_0\), denominada \(f'(x_0)\). Para isso vamos supor que sabemos avaliar \(f\) em uma vizinhança de \(x_0\), ou pelo menos uma aproximação para isso.
Já estudamos em cálculo, ou estudaremos em breve, que a derivada de uma função \(f\) em \(x_0\), representada por \(f'(x_0)\), é o coeficiente angular da reta tangente à \(f\) em \(x_0\). As retas em azul, escuro e claro, indicam a reta tangente à função \(f\) nos pontos \(x_0\) e \(x_1\). Já as retas em vermelho e laranja são secantes que cortam a função \(f\) nos pontos \((x_0,f(x_0))\) e \((x_0 + h,f(x_0 + h))\) (reta em vermelho) e \((x_1,f(x_1))\) e \((x_1 + h,f(x_1 + h))\) (reta em laranja). Como conhecemos dois pontos de uma reta secante, é possível calcular o seu coeficiente angular, que é a tangente do ângulo entre a reta secante e o eixo horizontal. Lembrando, a tangente de um ângulo é a razão entre o cateto oposto e o cateto adjacente. Então, \[
a_0 = \dfrac{f(x_0+h) - f(x_0)}{h}
\qquad \text{ e } \qquad
a_1 = \dfrac{f(x_1+h) - f(x_1)}{h}
\] Se escolhemos \(h\) bem pequeno, \(x_0 \approx x_0+h\) e \(x_1 \approx x_1 + h\), e as retas secantes serão bem próximas das retas tamngentes. Podemos então afirmar que: \[
f'(x_0) \approx \frac{f(x_0 + h) - f(x_0)}{h}
\qquad \text{ e } \qquad
f'(x_1) \approx \frac{f(x_1 + h) - f(x_1)}{h}.
\] O que estamos fazendo nesse caso é aproximando o coeficiente angular da reta tangente à \(f\) no ponto \(x_0\) (retas em azul escuro e claro) pelo coeficiente angular das retas secantes (retas em vermelho e laranja). Veja que quanto menor o valor de \(h\) mais próxima está uma reta da outra, logo mais próximo está o coeficiente angular da reta secante do coeficiente angular da reta tangente. E por isso podemos escrever a equação abaixo, que vale pra \(x=x_0\), \(x=x_1\) ou qualquer outro \(x\) no domínio de \(f\): \[f'(x) = \lim_{h \to 0}\frac{f(x + h) - f(x)}{h}.\]
Vamos seguir somente com o exemplo da reta tangente à \(f\) no ponto \(x_0\). Uma outra alternativa para calcular uma aproximação para \(f'(x_0)\) é usar a reta secante que passa pelos pontos \((x_0-h,f(x_0-h))\) e \((x_0+h,f(x_0 + h))\), reta em verde na figura abaixo. Nesse caso o coeficeinte angular da reta secante, que é a tangente do ângulo dessa reta com o eixo horizontal, pode ser escrito por: \[
a = \frac{f(x_0 + h) - f(x_0 - h)}{2h}.
\] Da mesma forma que no método anterior, quanto menor o valor de \(h\) mais perto a reta secante (verde) está da reta tangente (azul) e por isso o coeficiente angular da reta tangente à \(f\) no ponto \(x_0\) também ser escrita pelo limite: \[f'(x_0) = \lim_{h \to 0}\frac{f(x_0 + h) - f(x_0 - h)}{2h}.\] Se escolhemos \(h\) bem pequeno podemos afirmar que: \[
f'(x_0) \approx \frac{f(x_0 + h) - f(x_0 - h)}{2h}.
\]
Não serão apresentadas as contas, mas é possível mostrar que o Segundo Método converge mais rápido, isto é, para valores de \(h\) pequenos ele retornar aproximações mais precisas do que o Primeiro Método. Apesar disso, o primeiro método também converge. Mas pela maior eficiência do segundo, vamos apresentar o pseudocódigo somente para ele.
Para aproximar \(f'(x_0)\) vamos começar com um \(h>0\). A partir desse valor de \(h\) calculamos uma primeira aproximação. Depois diminuímos o valor de \(h\), por exemplo dividindo ele por 2, e calculamos uma nova aproximação. Veja que as aproximações para \(f'(x_0)\) são dadas pela expressão: \[ f'(x_0) \approx \frac{f(x_0 + h) - f(x_0 - h)}{2h}. \] Realizamos esse procedimento diversas vezes até que a diferença entre duas aproximações consecutivas seja bem pequena, ou melhor, seja menor que o valor de \(\delta\) determinado pelo usuário. Vale destacar que esse método funciona se \(x_0\) está dentro de um intervalo aberto contindo no domínio de \(f\).
Entrada: x0
, f
e delta
.
Saída: uma aproximação para \(f'(\)x0
\()\).
Nome: DerivadaNumérica
1. Se x0 não pertence à um intervalo aberto do domínio de f, pare e retorna uma mensagem de erro.
2. Defina h = 1.
3. Se (x0 + h) ou (x0 - h) não pertencem ao domínio de f, faz h = h/2 essa linha 3.
4. Calcule d1 = (f(x0 + h) - f(x0 - h))/(2h).
5. Atualize o valor de h: h = h/2.
6. Calcule d2 = (f(x0 + h) - f(x0 - h))/(2h).
7. Se |d1 - d2| < delta, retorna d2.
8. Caso contrário, faça d1 = d2 e volte para a linha 5.
Dica: Talvez fique mais simples se o algoritmo for implementado usando o repeat
.
Veja agora uma possibilidade de realizar o algoritmo de forma recursiva. Nesse caso vai ser bem mais simples se \(h\) também for passado como entrada.
Entrada: x0
, f
, delta
e h=1
.
Saída: uma aproximação para \(f'(\)x0
\()\).
Nome: DerivadaNuméricaRec
1. Se x0 não pertence à um intervalo aberto do domínio de f, pare e retorna uma mensagem de erro.
2. Se (x0 + h) ou (x0 - h) não pertencem ao domínio de f, retorna DerivadaNuméricaRec(x0,f,delta,h/2).
3. Calcule d1 = (f(x0 + h) - f(x0 - h))/(2h).
4. Atualize o valor de h: h = h/2.
5. Calcule d2 = (f(x0 + h) - f(x0 - h))/(2h).
6. Se |d1 - d2| < delta, retorna d2.
7. Caso contrário, retorna DerivadaNuméricaRec(x0,f,delta,h).