Derivada Numérica: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
(Criou página com ''''A derivada numérica''' permite estimar a derivada de uma função matemática usando os valores da função. O método numérico se baseia na própria definição de derivad...')
 
 
(11 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
'''A derivada numérica''' permite estimar a derivada de uma função matemática usando os valores da função.
A derivada de uma função <math>f(x)</math> é definida como um processo de limite, o qual é matematicamente descrito por:


O método numérico se baseia na própria definição de derivada: o limite do quociente incremental da função quando o incremento tende a zero.
{| style="width: 75%"
Matematicamente é mais claro:
|-
|<math>f'(x)=\lim_{\Delta x\to 0}{f(x+\Delta x)-f(x)\over \Delta x}</math> || (Eq. 1)
|}


:<math>f'(x)=\lim_{h\to 0}{f(x+h)-f(x)\over h}</math>
Numericamente é impossível tomarmos o limite  <math>\Delta x\to 0</math>; temos necessariamente que trabalhar com um valor de  <math>\Delta x</math> ''finito''. Portanto, a todo cálculo numérico de uma derivada será associado um ''erro numérico''. Abaixo veremos dois métodos numéricos para calcular derivadas e estimaremos os erros associados a tais métodos.


Se nessa expressão não tomamos o limite podemos obter uma estimativa numérica da derivada que dependerá do valor do incremento <math>h</math>:
== Derivada à direita ==


:<math>f'(x) \approx {f(x+h)-f(x)\over h}</math>
Este método se baseia na definição formal de derivada. Para um dado valor de incremento <math>\Delta x</math>, definimos a derivada numérica (a direita) como:


A expressão a direita é chamada de quociente diferencial de Newton.
{| style="width: 75%"
|-
|<math>\frac{\Delta f^+}{\Delta x} = \frac{\Delta f(x)}{\Delta x} = {f(x+\Delta x)-f(x)\over \Delta x}</math> || (Eq. 2)
|}


Ao usá-la para calcular a derivada numericamente devemos ser cientes de que não é um cálculo exato.  
A expressão a direita é chamada de quociente diferencial de Newton. Existem duas fontes de erro nessa expressão, o erro de '''arredondamento''' e o erro de '''truncamento'''. O primeiro é um erro associado à precisão numérica dos computadores, que é  finita (o número de casas dos números).
Existem duas fontes de erro nessa expressão, o erro de '''truncamento''' e o erro de '''arredondamento'''.
Comparando a expressão (2) com a (1), notamos que, quanto menor o valor de <math>\Delta x</math>, o valor estimado numericamente é mais próximo ao valor real. No entanto, numericamente não podemos tomar <math>\Delta x</math> tão pequeno quanto se queira, porque há um limite de precisão numérica. Assim,  na região do <math>\Delta x</math> pequeno há o tipo de erro chamado de '''erro de arredondamento'''.
Para estimar o erro de truncamento recorremos a Formula de Taylor:


:<math>f(x+h) = f(x) + f'(x)h + \frac{1}{2}f''(x)h^2 + \frac{1}{6}f'''(x)h^3 + ...</math>
Por exemplo, se o nosso computador hipotético processar uma operação matemática com 4 casas decimais, temos que, para a função <math>f(x) = x^2 </math>,  <math> f(0,1) = 0,01</math> e <math> f(0,1001) = 0,01002001</math>. Note que, usando a precisão de nosso computador, <math>f(x) = f(x+\Delta x)</math> no caso em que <math>x = 0,01</math> e <math>\Delta x = 0,001</math>. Com isso, o resultado da derivada numérica seria <math>f\, '(0,1) = 0</math>, o que sabemos não ser verdade, já que podemos calcular essa derivada analiticamente. Isso coloca um limite inferior para o incremento <math>\Delta x</math>, e assim para a precisão da estimativa numérica da derivada.


Por tanto:
O segundo tipo de erro  podemos dizer que é "intrínseco" ao método numérico. Para estimá-lo, faremos uso da expansão em série de Taylor da função :<math>f'(x)</math>


:<math>{f(x+h)-f(x)\over h} = f' + \frac{1}{2}f''h + ...</math>
{| style="width: 75%"
|-
|<math>f(x+\Delta x) = f(x) + f'(x)\Delta x + \frac{1}{2}f''(x)(\Delta x)^2 + \frac{1}{6}f'''(x)(\Delta x)^3 + ...</math> || (Eq. 3)
|}


Se o <math>h</math> for pequeno podemos dizer que o erro ao usar a quociente de Newton para calcular a derivada é proporcional a
manipulando os termos acima, temos:
<math>h</math>. De maneira geral o erro cresce linearmente com <math>h</math>. Por tanto devemos usar valores pequenos do incremento.
No entanto ao fazer a conta numérica temos precisão finita (o numero de casas dos números). Não é possível levar a expressão ao limite teórico
<math>h \rightarrow 0</math>. Então pelo outro extremo aparece o segundo tipo de erro, o de arredondamento.
Quando <math>h</math> é muito pequeno, ao fazer a diferença ente os dois valores da função,
podemos ter esse erro que vai ser relativamente maior quanto menor for <math>h</math>, piorando a estimativa da derivada.
Isso coloca um limite inferior para o incremento <math>h</math> e assim para a precisão da estimativa numérica da derivada.<br>
Resumindo, por um lado temos o '''erro de truncamento''' e pelo outro o de '''arredondamento''', a valor ótimo será uma solução de compromisso entre os dois tipos de erro.
 
Outro cálculo numérico da derivada pode ser feito baseado na declividade de '''dois''' pontos próximos, um antes e outro depois do ponto onde queremos avaliar a derivada: (''x-h'',''f(x-h)'') e (''x+h'',''f(x+h)'').<br>
A declividade da linha definida por esses dois pontos é;
:<math>{f(x+h)-f(x-h)\over 2h}</math>


que é chamada de '''derivada centrada'''.<br>
:<math>{f(x+\Delta x)-f(x)\over \Delta x} = f' + \frac{1}{2}f''\Delta x + ... \, ,</math>
O erro desta estimativa é menor que na estimativa para frente (ou para atrás).


Existem formas de contornar o problema do valor ótimo de incremento podendo ir a valores menores dele e sim melhorar a estimativa da derivada numérica.
e assim
 
:<math>f' = \underbrace{{f(x+\Delta x)-f(x)\over \Delta x}}_{Quociente\; de\; Newton} - \frac{1}{2}f''\Delta x + ... \, .</math>
 
Comparando a expressão acima com o método de de derivada à direita , Eq. 2,  notamos que a diferença existe a partir do termo <math>\Delta x</math>. Podemos dizer que o erro ao usar a quociente de Newton para calcular a derivada é proporcional à <math>\Delta x</math>. Assim, vemos que o erro cresce ''linearmente'' com <math>\Delta x</math> e portanto devemos usar valores pequenos do incremento.
 
Resumindo, por um lado temos o '''erro de truncamento''' e pelo outro o de '''arredondamento''', onde o valor ótimo será uma solução de compromisso entre os dois tipos de erro. Vemos então que deve haver um ''intervalo de valores'' dentro do qual o  <math>\Delta x</math> deve variar para que a derivada numérica seja a mais próxima do valor real possível. Nas figuras 5 e 6 mostramos um exemplo.
 
== Derivada à esquerda ==
A derivada numérica pode também ser calculada com um incremento a esquerda do <math>x</math> (e também centrado no <math>x</math> como veremos depois).
Em cálculo as três devem coincidir para existir a derivada em <math>x</math>. Existem funções que podem ser contínuas em um ponto,
porém ter derivada diferente a esquerda e direita, por tanto nesses casos a derivada no ponto não está definida.
O exemplo mais simples é <math>|x|</math>, continua e com derivada em todo <math>x \neq 0</math>. Nesse ponto as derivadas a esquerda e direita são diferentes.
 
== Derivada Centrada ==
 
Outro cálculo numérico da derivada pode ser feito baseado na declividade de '''dois''' pontos próximos, um antes e outro depois do ponto onde queremos avaliar a derivada.
 
A declividade da linha definida por esses dois pontos é:
 
{| style="width: 75%"
|-
|<math>f'(x)\approx {f(x+\Delta x)-f(x-\Delta x)\over 2\Delta x}</math> || (Eq. 4)
|}
 
que é chamada de '''derivada centrada'''.
 
Podemos mostrar que o erro intrínseco a este método é menor do que o erro associado ao método anterior.  Para  estimar o erro de truncamento, expandimos <math>f(x) </math> em torno de <math>\Delta x</math> ( feito na Eq(3)) e em torno de  <math> -\Delta x</math>:
 
:<math>f(x-\Delta x) = f(x) + f'(x)(-\Delta x) + \frac{1}{2}f''(x)(-\Delta x)^2 - {1\over 6}f'''(x)(\Delta x)^3 + ...</math>
 
Somando <math>f(x+\Delta x) </math>  dada pela Eq.(3) e os termos de <math>f(x-\Delta x) </math>  da expressao acima, notamos que os termos lineares em <math> -\Delta x</math>  se cancelam. Isolando <math> f'(x)</math>, temos:
 
:<math>f'(x) = \underbrace{{f(x+\Delta x)-f(x-\Delta x)\over 2\Delta x}}  -{2\over 6}f'''(x)(\Delta x)^2 + ...</math>
 
Comparando a expressão acima com a definição do método de derivada centrada, Eq. 4, notamos que  o erro de truncamento  é da ordem de <math>(\Delta x)^2</math>. Para <math>|\Delta x| < 1 </math>, vemos que o erro de truncamento associado ao método de derivada centrada é menor do que o erro para a derivada à direita.
 
== Medida numérica do Erro associado a cada método ==
 
Para ter uma estimativa do erro associado a utilização da derivada numérica, podemos comparar valores utilizando uma função que tem sua derivada conhecida analiticamente. Assim, o erro é dado por
 
:<math> erro = {|f'_{an}(x) - f'_{num}(x)| \over |f'_{an}(x)|}, </math>
onde <math>f'_{an}(x)</math> e <math>f'_{num}(x)</math> são as derivada analítica e numérica de <math> f(x) </math>, respectivamente.
 
Note que, multiplicando o erro por 100, temos a porcentagem de erro que acompanha a derivada numérica.


== Programa ==
== Programa ==
Implementar a derivada numérica em [[FORTRAN]] é apenas uma linha de código:
Implementar a derivada numérica em [[FORTRAN]] é apenas uma linha de código:


  ...
  ...
  Df = (f(x+h) - f(x))/h
  Df = (f(x+h) - f(x))/h
  ...
  ...


Onde f(x) deve ser definida num bloco FUNCTION F(x) ... END FUNCTION F.<br>
Onde f(x) deve ser definida num bloco FUNCTION F(x) ... END FUNCTION F.
 
O resto depende de onde e para que queremos calcular a derivada.
O resto depende de onde e para que queremos calcular a derivada.


== Exemplos ==
== Exemplo ==
Com a função f(x) abaixo, a modo de exemplo, a questão do compromisso entre o erro de truncamento
 
e o erro de arredondamento deve-se esclarecer.<br />
Como demonstração, usaremos a função <math>f(x)</math> dada por
A função é:
 
:<math>f(x) = \frac{\sin(x^2) e^{x/3}}{\sqrt{x^2+4}}.</math>
 
Os gráficos abaixo ilustram os métodos de derivada à direita (figuras 1 e 2) e derivada centrada (figuras 3 e 4), ambos com <math>x=0,6</math> e <math>\Delta x = 0,4</math>.
 
Primeiramente, a figura 1 mostra a derivada à direita, onde a curva em vermelho representa <math>f(x)</math> e a curva em azul representa a derivada de <math>f(x)</math>.
 
[[Imagem:derivada3.png|thumb|300px|left|Figura 1 - Derivada à direita]]
 
A figura 2 mostra um zoom no ponto <math>x</math> com a curva da derivada calculada pelo método descrito acima. Em azul a derivada calculada numericamente, só que agora com um deslocamento em <math>y</math> para passar pelo ponto <math>(f(x),x)</math>.


<math>f(x) = \frac{\sin(x^2) e^{x/3}}{\sqrt{x^2+4}}</math>
[[Imagem:derivada4.png|thumb|300px|Figura 2 - Derivada à direita (zoom)]]


Com o método descrito acima vamos avaliar numericamente (para frente) a derivada num ponto qualquer,
O exemplo do método de derivada centrada está representado na figura 3. Em vermelho a curva <math>f(x)</math> e em azul a sua derivada.
digamos x=3. A continuação figuras mostrando o resultado para vários valores de <math>\Delta X</math>
decrescentes num fator 2 partindo de 2. Ou seja <math>\Delta X = </math>{2, 1, 1/2, 1/4, ...}


[[Imagem:der.png|500px]][[Imagem:der_zoom.png|500px|derivada x dx]]
[[Imagem:derivada1.png|thumb|300px|left|Figura 3 - Derivada centrada]]


A esquerda a derivada em x=3 numérica em função do <math>\Delta x</math> utilizado.  
A figura 4 mostra um zoom com a curva da derivada centrada em <math>x</math>.
O valor exato da derivada em é <math>f'(3)=-4.08963</math><br />
 
Vemos que em volta de <math>\Delta x = 0.01</math> começa a convergir,  
[[Imagem:derivada2.png|thumb|300px|Figura 4 - Derivada centrada (zoom)]]
piorando a partir de <math>\Delta x = 10^{-6}</math>.<br />
 
Na figura a direita vemos ampliada a região de convergência, onde o valor de  
Além da ilustração dos métodos de derivação numérica, as figuras 5 e 6 mostram o gráfico do valor retornado pelo método da derivação à direita em função do incremento <math>\Delta x</math> utilizado.
<math>\Delta x = 8x10^{-5}</math> parece ser o ótimo.<br />
 
'''NOTA:''' os programa FORTRAN usado para o calculo da derivada esta em Real (ou Real*4, ou
[[Imagem:der.png|thumb|300px|left|Figura 5 - Erros de truncamento e precisão]]
seja ponto flutuante em representação de 32 bits).<br />
 
Como seria em dupla precisão (Real*8)?
[[Imagem:der_zoom.png|thumb|300px|Figura 6 - Erros de truncamento e precisão (zoom)]]
 
Na figura 5, a derivada numérica em x=3 em função do <math>\Delta x</math> utilizado. O valor exato da derivada é <math>f'(3)=-4.08963</math>. Diminuindo o valor do incremento, vemos que em volta de <math>\Delta x = 0.01</math> a derivada começa a convergir, piorando a partir de <math>\Delta x = 10^{-6}</math>. Para valores muito pequenos temos o erro de arredondamento e para valores muito alto temos o erro de truncamento.
 
Na figura 6 vemos ampliada a região de convergência, onde o valor de <math>\Delta x = 8x10^{-5}</math> parece ser o ótimo.
 
'''NOTA:''' os programa FORTRAN usado para o calculo da derivada esta em Real (ou Real*4, ou seja ponto flutuante em representação de 32 bits). Como seria em dupla precisão (Real*8)?


== Links Externos==
== Links Externos==
*[http://www.sitmo.com/eqcat/12 Numerical Differentiation] Quant Equation Archive, sitmo
*[http://www.sitmo.com/eqcat/12 Numerical Differentiation] Quant Equation Archive, sitmo
* http://mathworld.wolfram.com/NumericalDifferentiation.html
* http://mathworld.wolfram.com/NumericalDifferentiation.html
* http://math.fullerton.edu/mathews/n2003/NumericalDiffMod.html
* http://math.fullerton.edu/mathews/n2003/NumericalDiffMod.html

Edição atual tal como às 10h13min de 7 de outubro de 2015

A derivada de uma função é definida como um processo de limite, o qual é matematicamente descrito por:

(Eq. 1)

Numericamente é impossível tomarmos o limite ; temos necessariamente que trabalhar com um valor de finito. Portanto, a todo cálculo numérico de uma derivada será associado um erro numérico. Abaixo veremos dois métodos numéricos para calcular derivadas e estimaremos os erros associados a tais métodos.

Derivada à direita

Este método se baseia na definição formal de derivada. Para um dado valor de incremento , definimos a derivada numérica (a direita) como:

(Eq. 2)

A expressão a direita é chamada de quociente diferencial de Newton. Existem duas fontes de erro nessa expressão, o erro de arredondamento e o erro de truncamento. O primeiro é um erro associado à precisão numérica dos computadores, que é finita (o número de casas dos números). Comparando a expressão (2) com a (1), notamos que, quanto menor o valor de , o valor estimado numericamente é mais próximo ao valor real. No entanto, numericamente não podemos tomar tão pequeno quanto se queira, porque há um limite de precisão numérica. Assim, na região do pequeno há o tipo de erro chamado de erro de arredondamento.

Por exemplo, se o nosso computador hipotético processar uma operação matemática com 4 casas decimais, temos que, para a função , e . Note que, usando a precisão de nosso computador, no caso em que e . Com isso, o resultado da derivada numérica seria , o que sabemos não ser verdade, já que podemos calcular essa derivada analiticamente. Isso coloca um limite inferior para o incremento , e assim para a precisão da estimativa numérica da derivada.

O segundo tipo de erro podemos dizer que é "intrínseco" ao método numérico. Para estimá-lo, faremos uso da expansão em série de Taylor da função :

(Eq. 3)

manipulando os termos acima, temos:

e assim

Comparando a expressão acima com o método de de derivada à direita , Eq. 2, notamos que a diferença existe a partir do termo . Podemos dizer que o erro ao usar a quociente de Newton para calcular a derivada é proporcional à . Assim, vemos que o erro cresce linearmente com e portanto devemos usar valores pequenos do incremento.

Resumindo, por um lado temos o erro de truncamento e pelo outro o de arredondamento, onde o valor ótimo será uma solução de compromisso entre os dois tipos de erro. Vemos então que deve haver um intervalo de valores dentro do qual o deve variar para que a derivada numérica seja a mais próxima do valor real possível. Nas figuras 5 e 6 mostramos um exemplo.

Derivada à esquerda

A derivada numérica pode também ser calculada com um incremento a esquerda do (e também centrado no como veremos depois). Em cálculo as três devem coincidir para existir a derivada em . Existem funções que podem ser contínuas em um ponto, porém ter derivada diferente a esquerda e direita, por tanto nesses casos a derivada no ponto não está definida. O exemplo mais simples é , continua e com derivada em todo . Nesse ponto as derivadas a esquerda e direita são diferentes.

Derivada Centrada

Outro cálculo numérico da derivada pode ser feito baseado na declividade de dois pontos próximos, um antes e outro depois do ponto onde queremos avaliar a derivada.

A declividade da linha definida por esses dois pontos é:

(Eq. 4)

que é chamada de derivada centrada.

Podemos mostrar que o erro intrínseco a este método é menor do que o erro associado ao método anterior. Para estimar o erro de truncamento, expandimos em torno de ( feito na Eq(3)) e em torno de :

Somando dada pela Eq.(3) e os termos de da expressao acima, notamos que os termos lineares em se cancelam. Isolando , temos:

Comparando a expressão acima com a definição do método de derivada centrada, Eq. 4, notamos que o erro de truncamento é da ordem de . Para , vemos que o erro de truncamento associado ao método de derivada centrada é menor do que o erro para a derivada à direita.

Medida numérica do Erro associado a cada método

Para ter uma estimativa do erro associado a utilização da derivada numérica, podemos comparar valores utilizando uma função que tem sua derivada conhecida analiticamente. Assim, o erro é dado por

onde e são as derivada analítica e numérica de , respectivamente.

Note que, multiplicando o erro por 100, temos a porcentagem de erro que acompanha a derivada numérica.

Programa

Implementar a derivada numérica em FORTRAN é apenas uma linha de código:

...
Df = (f(x+h) - f(x))/h
...

Onde f(x) deve ser definida num bloco FUNCTION F(x) ... END FUNCTION F.

O resto depende de onde e para que queremos calcular a derivada.

Exemplo

Como demonstração, usaremos a função dada por

Os gráficos abaixo ilustram os métodos de derivada à direita (figuras 1 e 2) e derivada centrada (figuras 3 e 4), ambos com e .

Primeiramente, a figura 1 mostra a derivada à direita, onde a curva em vermelho representa e a curva em azul representa a derivada de .

Figura 1 - Derivada à direita

A figura 2 mostra um zoom no ponto com a curva da derivada calculada pelo método descrito acima. Em azul a derivada calculada numericamente, só que agora com um deslocamento em para passar pelo ponto .

Figura 2 - Derivada à direita (zoom)

O exemplo do método de derivada centrada está representado na figura 3. Em vermelho a curva e em azul a sua derivada.

Figura 3 - Derivada centrada

A figura 4 mostra um zoom com a curva da derivada centrada em .

Figura 4 - Derivada centrada (zoom)

Além da ilustração dos métodos de derivação numérica, as figuras 5 e 6 mostram o gráfico do valor retornado pelo método da derivação à direita em função do incremento utilizado.

Figura 5 - Erros de truncamento e precisão
Figura 6 - Erros de truncamento e precisão (zoom)

Na figura 5, a derivada numérica em x=3 em função do utilizado. O valor exato da derivada é . Diminuindo o valor do incremento, vemos que em volta de a derivada começa a convergir, piorando a partir de . Para valores muito pequenos temos o erro de arredondamento e para valores muito alto temos o erro de truncamento.

Na figura 6 vemos ampliada a região de convergência, onde o valor de parece ser o ótimo.

NOTA: os programa FORTRAN usado para o calculo da derivada esta em Real (ou Real*4, ou seja ponto flutuante em representação de 32 bits). Como seria em dupla precisão (Real*8)?

Links Externos