# Diferenciação numérica

Na análise numérica, diferenciação numérica descreve algoritmos para calcular a derivada de uma função matemática ou uma função de valores de sub-rotina usando a função e talvez outros conhecimentos sobre a função.

## Fórmula das Diferenças Finitas

O método mais simples para aproximar a derivada é usar o método de diferenças finitas.
Uma simples estimação de dois pontos é computar a inclinação de uma reta secantes vizinha através dos pontos (x,f(x)) e (x+h,f(x+h)). A inclinação dessa reta é dada por:
    $f'(x)\simeq {f(x+h)-f(x) \over h}.$
Onde h um número suficientemente pequeno que representa uma leve mudança em x, podendo ser tanto positivo quanto negativo. Esta expressão é conhecida como quociente das diferenças de Newton ou fórmula de diferenças finitas (progressivas para h > 0 e regressivas, se h < 0).
A inclinação dessa reta secante difere da inclinação da reta tangente por um valor que é aproximadamente proporcional a h. A inclinação da reta secante tende a inclinação da reta tangente quando h tende a zero. Portanto, a verdadeira derivada de f com relação a x é o limite do valor do quociente das diferenças quando a reta secante se aproxima da reta tangente:
    $f'(x)=\lim _{h\to 0}{f(x+h)-f(x) \over h}.$
Como a imediata substituição de 0 por h resulta numa divisão por zero, calcular a derivada diretamente pode não ser intuitivo.
Analogamente, a inclinação pode ser estimada empregando posições (x - h) e x.
Outra fórmula de dois pontos é computar a inclinação de uma reta secante vizinha através dos pontos (x-h, f(x-h)) e (x+h, f(x+h)). A inclinação dessa reta é:
    $f'(x)\simeq {f(x+h)-f(x-h) \over 2h}.$
Nesse caso, os erros de primeira ordem se cancelam, portanto a inclinação dessa reta secantes difere da inclinação da reta tangente por um valor que é aproximadamente proporcional a $h^{2}$. Assim, para pequenos valor de h, esta é uma forma mais precisa de aproximar a reta tangente do que a estimativa unilateral. Contudo note que apesar da inclinação ser computada em x, o valor da função em x não é envolvido.
A estimação do erro é dada por:
    $R={{-f^{(3)}(c)} \over {6}}h^{2}$,
onde $c$ é algum ponto entre $x-h$ e $x+h$. Este erro não inclui o erro de arredondamento devido aos números serem representados e os cálculos serem executados no limite de precisão.

### Exemplos

* $f'(x)={\frac {f(x+h)-f(x)}{h}}+\xi _{1}(x,h)\,$
* $f'(x)={\frac {f(x+h)-f(x-h)}{2h}}+\xi _{2}(x,h)\,$
Neste caso, as funções $\xi _{1}(x,h)\,$ e $\xi _{2}(x,h)\,$ expressam o chamado erro de truncamento. É imediato da definição de derivada de um função real que:
* $\lim _{h\to 0}\xi _{1}(x,h)=0\quad {\hbox{e}}\quad \lim _{h\to 0}\xi _{2}(x,h)\,$
Contanto que a função $f\,$ seja diferenciável no ponto $x\,$ e, portanto, espera-se que esses métodos produzam boas aproximações quando h é pequeno.
Dado um intervalo [a,b], e uma função f(x) derivável neste intervalo. Seja h um incremento de valor reduzido e diferente de 0, a aproximação da derivada da função f(x) em x = xk é dada por:
$f'(x_{k})={f(x_{k}+h)-f(x_{k}) \over h}$
Um exemplo pego no site UFSJ fará com que tenhamos uma facilidade na compreensão
Ex: calcular a derivada da função f(x) = ln(x) para x=1,8 com h=0,1 e 0,01 e compare com o valor real da derivada:
Valor real: $f'(x)={1 \over x}->f(1,8)=0,555556$
para h = 0,1 $f'(1.8)\approx {ln(1.8+0.1)+ln(1.8) \over 0.1}=0.540672$
para h=0,01 $f'(1.8)\approx {ln(1.8+0.01)+ln(1.8) \over 0.01}=0.554018$
Na medida em que h diminui, o valor da derivada numérica se aproxima do valor real. Porém, por menor que seja h, este método ainda apresentará um erro de arredondamento grande. Uma maneira de reduzir este erro é utilizar vários pontos.
Quanto maior o número de pontos melhor será o resultado. Porém, por praticidade, utiliza-se fórmulas de 3 a 5 pontos

### Erro de truncamento

Para a primeira aproximação, é bastante simples encontrar um cota para o erro $\xi _{1}(x,h)\,$ supondo $f\,$ uma função de classe C$^2$, usando o teorema de Taylor (sem perda de generalidade, supõe-se $h>0\,$):
* $f(x+h)=f(x)+hf'(x)+{\frac {h^{2}}{2}}f''(\zeta ),~~\zeta \in (x,x+h)\,$
logo:
* ${\frac {f(x+h)-f(x)}{h}}=f'(x)+{\frac {h}{2}}f''(\zeta )\,$
e, portanto vale a estimativa:
* $\left|\xi (x,h)\right|\leq {\frac {h}{2}}\max _{x\in [x,x+h]}|f''(x)|\,$

### Considerações práticas usando aritmética de ponto flutuante

Uma importante consideração - na prática - quando a função é aproximada usando aritmética de ponto flutuante é o quão pequeno deve ser o valor de h. Se for escolhido um valor muito pequeno, a subtração vai produzir um grande erro de arredondamento. Na verdade, todas as fórmulas de diferenças finitas são mal condicionadas e devido ao cancelamento catastrófico vai gerar um valor de zero se h é pequeno o suficiente. Porém, se o valor escolhido para h for muito grande, o cálculo da inclinação da reta secante será mais preciso, porém a inclinação da tangente estimada usando a reta secante pode ser pior.
Uma escolha para h que é pequeno o suficiente, sem produzir grandes erros de arredondamento, é: ${\sqrt {\varepsilon }}x$, onde o épsilon de máquina ε é tipicamente da ordem de 2.2×10$^{−16}$. Esse épsilon é para variáveis de dupla precisão (64-bit): tais cálculos para precisão simples são raramente úteis. O valor resultante provavelmente não será um número "arredondado" em binário, portanto é importante perceber que apesar de x ser o número representado na máquina, x + h quase certamente não será. Isso significa que x + h será substituído (via arredondamento e truncamento) pelo número mais próximo que é possível de ser representado na máquina, com a consequência de que um passo aparentemente redondo, como h = 0.1, não será um número redondo em binário (é uma série recorrente, assim como ${\frac {1}{3}}$ em decimal), porém pode ser aproximado por:
Todavia, com computadores, as facilidades de otimização do compilador pode falhar ao atender os detalhes da atual aritmética computacional e, em vez disso, aplicar os axiomas da matemática para deduzir que dx e h são o mesmo. Com C e linguagens similares, a diretiva que xph é uma variável volátil vai prevenir isso.

#### Erro mínimo

Quando estes esquemas numéricos são implementados em algoritmos com precisão finita, existe uma segunda fonte de erro devido ao arredondamento do algoritmo. Para fins de uma análise simplificada, considera-se que todo o erro de arredondamento se concentra na avaliação do valor da função $f\,$ e que sua ordem de grandeza não depende de $h\,$. Denotando-o por $\epsilon$, temos:
* ${\frac {f(x+h)-f(x)+\epsilon }{h}}=f'(x)+{\frac {h}{2}}f''(\zeta )\,$
ou seja:
* ${\frac {f(x+h)-f(x)}{h}}=f'(x)+{\frac {h}{2}}f''(\zeta )-{\frac {\epsilon }{h}}\,$
Neste caso, o erro total é dado por:
* $\left|\xi _{total}(x,h)\right|\leq {\frac {h}{2}}\max _{x\in [x,x+h]}|f''(x)|+{\frac {\epsilon }{h}}\,$
Observe que o termo relativo ao erro de truncamente diminui quando $h\,$ diminui mas o termo relativo ao erro de arredondamento cresce quando $h\,$ diminui. Esta estimativa é mínima quando:
* $h={\sqrt {\frac {2\epsilon }{\max _{x\in [x,x+h]}|f''(x)|}}}\,$
o que implica o seguinte erro mínimo para o esquema:
* ${\sqrt {2\epsilon \max _{x\in [x,x+h]}|f''(x)|}}\,$

### Métodos de maior ordem

Métodos de maior ordem para aproximar a derivada, assim como métodos para o cálculo de maiores derivadas existem.
Abaixo é o método de cinco pontos para a primeira derivada.
    $f'(x)={\frac {-f(x+2h)+8f(x+h)-8f(x-h)+f(x-2h)}{12h}}+{\frac {h^{4}}{30}}f^{(5)}(c)$
onde $c\in [x-2h,x+2h]$.

## Quadratura diferencial

Quadratura diferencial é a aproximação da derivada usando valores ponderados para os valores da função. O nome é uma analogia a quadratura da Integração numérica onde somas ponderadas são usadas em métodos como o Método de Simpson ou a Regra do Trapézio. Existem vários métodos para determinar os coeficientes de peso. Quadratura diferencial é usada para resolver Equações diferenciais parciais.

## Método das variáveis complexas

A clássica aproximação por diferenças finitas para diferenciação numérica é mal condicionada. No entanto, se $f$ é uma função holomorfa, com valor real sobre a linha real, que pode ser avaliada em pontos no plano complexo perto de $x$, assim tem-se métodos estáveis. Por exemplo, a primeira derivada pode ser calculada por uma fórmula com passo complexo:
    $f'(x)\approx \Im (f(x+ih))/h$.
A fórmula acima só é válida para calcular uma derivada de primeira ordem. A generalização dessa para calcular derivadas de qualquer ordem implica números multicomplexos, resultando em derivadas multicomplexas.
No geral, derivadas de qualquer ordem podem ser calculadas usando a fórmula integral de Cauchy:
    $f^{(n)}(a)={n! \over 2\pi i}\oint _{\gamma }{f(z) \over (z-a)^{n+1}}\,\mathrm {d} z$
onde a integração é feita numericamente
Usar variáveis complexas para diferenciação numérica foi iniciado por Lyness e Moler em 1967. Um método baseado na inversão numérica de uma transformada de Laplace complexa foi desenvolvido por Abate e Dubner. Um algoritmo que pode ser usado sem requerer conhecimento sobre o método ou as características da função foi desenvolvido por Fornberg.