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

De Física Computacional
Ir para navegação Ir para pesquisar
Tekkito (discussão | contribs)
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...'
 
Sebas (discussão | contribs)
 
(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 13h13min de 7 de outubro de 2015

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

f(x)=limΔx0f(x+Δx)f(x)Δx (Eq. 1)

Numericamente é impossível tomarmos o limite Δx0; temos necessariamente que trabalhar com um valor de Δx 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 Δx, definimos a derivada numérica (a direita) como:

Δf+Δx=Δf(x)Δx=f(x+Δx)f(x)Δx (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 Δx, o valor estimado numericamente é mais próximo ao valor real. No entanto, numericamente não podemos tomar Δx tão pequeno quanto se queira, porque há um limite de precisão numérica. Assim, na região do Δx 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 f(x)=x2, f(0,1)=0,01 e f(0,1001)=0,01002001. Note que, usando a precisão de nosso computador, f(x)=f(x+Δx) no caso em que x=0,01 e Δx=0,001. Com isso, o resultado da derivada numérica seria f(0,1)=0, o que sabemos não ser verdade, já que podemos calcular essa derivada analiticamente. Isso coloca um limite inferior para o incremento Δx, 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 :f(x)

f(x+Δx)=f(x)+f(x)Δx+12f(x)(Δx)2+16f(x)(Δx)3+... (Eq. 3)

manipulando os termos acima, temos:

f(x+Δx)f(x)Δx=f+12fΔx+...,

e assim

f=f(x+Δx)f(x)ΔxQuocientedeNewton12fΔx+....

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 Δx. Podemos dizer que o erro ao usar a quociente de Newton para calcular a derivada é proporcional à Δx. Assim, vemos que o erro cresce linearmente com Δx 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 Δx 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 x (e também centrado no x como veremos depois). Em cálculo as três devem coincidir para existir a derivada em x. 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 é |x|, continua e com derivada em todo x0. 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 é:

f(x)f(x+Δx)f(xΔx)2Δx (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 f(x) em torno de Δx ( feito na Eq(3)) e em torno de Δx:

f(xΔx)=f(x)+f(x)(Δx)+12f(x)(Δx)216f(x)(Δx)3+...

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

f(x)=f(x+Δx)f(xΔx)2Δx26f(x)(Δx)2+...

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 (Δx)2. Para |Δx|<1, 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

erro=|f'an(x)f'num(x)||f'an(x)|,

onde f'an(x) e f'num(x) são as derivada analítica e numérica de f(x), 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 f(x) dada por

f(x)=sin(x2)ex/3x2+4.

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

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

Figura 1 - Derivada à direita

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

Figura 2 - Derivada à direita (zoom)

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

Figura 3 - Derivada centrada

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

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 Δx 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 Δx utilizado. O valor exato da derivada é f(3)=4.08963. Diminuindo o valor do incremento, vemos que em volta de Δx=0.01 a derivada começa a convergir, piorando a partir de Δx=106. 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 Δx=8x105 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