[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

28 Diferenciação Numérica

As funções descritas nesse capítulo calculam derivadas numéricas por diferenças finitas. Um algoritmo adaptativo é usado para encontrar a melhor escolha de diferença finita e para estimar o erro na derivada. Essas funções são declaradas no arquivo de cabeçalho ‘gsl_deriv.h’.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

28.1 Funções

Function: int gsl_deriv_central (const gsl_function * f, double x, double h, double * result, double * abserr)

Essa função calcula a derivada numérica da função f no ponto x usando um algoritmo de diferença central adaptativo com um tamanho de degrau h. A derivada é retornada em result e uma estimativa de seu erro absoluto é retornada em abserr.

O valor inicial h é usado para estimar um tamanho de degrau ótimo, baseado no ajuste proporcional de erro por truncagem e erro por arredondamento no cálculo da derivada. A derivada é calculada usando uma regra de 5 pontos para equitativamente colocar as abscissas em x-h, x-h/2, x, x+h/2, x+h, com um erro estimado tomado da diferença entre os pontos da regra de 5 pontos e os correspondentes 3 pontos na regra de 3 pontos x-h, x, x+h. Note que o valor da função em x não contribui para o cálculo da derivada, de forma que somente 4 pontos são usados atualmente.

Function: int gsl_deriv_forward (const gsl_function * f, double x, double h, double * result, double * abserr)

Essa função calcula a derivada numérica da função f no ponto x usando um algoritmo de diferença pela direita adaptativo com um tamanho de degrau h. A função é avaliada somente nos pontos maiores que x, e nunca no próprio x. A derivada é retornada em result e uma estimativa de seu erro absoluto é retornada em abserr. Essa função deve ser usada se f(x) tiver uma descontinuidade em x, ou for indefinida para valores menores que x.

O valor inicial de h é usado para estimar um tamanho de degrau ótimo, baseado ajuste proporcional de erro por truncagem e erro por arredondamento no cálculo da derivada. A derivada em x é calculada usando uma regra “aberta” de 4 pontos para equitativamente colocar as abscissas em x+h/4, x+h/2, x+3h/4, x+h, com um erro estimado tomado a partir da diferença entre a regra de 4 pontos e a correspondente regra de 2 pontos x+h/2, x+h.

Function: int gsl_deriv_backward (const gsl_function * f, double x, double h, double * result, double * abserr)

Essa função calcula a derivada numérica da função f no ponto x usando um algoritmo de diferença pela esquerda adaptativo com um tamanho de degrau h. A função é avaliada somente em pontos menores que x, e nunca no próprio x. A derivada é retornada em result e uma estimativa de seu erro absoluto é retornada em abserr. Essa função deve ser usada se f(x) tiver uma descontinuidade em x, ou for indefinida para valores maiores que x.

Essa função é equivalente a chamar gsl_deriv_forward (deriva pela direita) com um tamanho de degrau negativo.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

28.2 Exemplos

O seguinte código estima a derivada da função f(x) = x^{3/2} em x=2 e em x=0. A função f(x) é indefinida para x<0 de forma que a derivada em x=0 é calculada usando gsl_deriv_forward.

#include <stdio.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_deriv.h>

double f (double x, void * params)
{
  return pow (x, 1.5);
}

int
main (void)
{
  gsl_function F;
  double result, abserr;

  F.function = &f;
  F.params = 0;

  printf ("f(x) = x^(3/2)\n");

  gsl_deriv_central (&F, 2.0, 1e-8, &result, &abserr);
  printf ("x = 2.0\n");
  printf ("f'(x) = %.10f +/- %.10f\n", result, abserr);
  printf ("exact = %.10f\n\n", 1.5 * sqrt(2.0));

  gsl_deriv_forward (&F, 0.0, 1e-8, &result, &abserr);
  printf ("x = 0.0\n");
  printf ("f'(x) = %.10f +/- %.10f\n", result, abserr);
  printf ("exact = %.10f\n", 0.0);

  return 0;
}

Aqui está a saída do programa,

$ ./a.out
f(x) = x^(3/2)
x = 2.0
f'(x) = 2.1213203120 +/- 0.0000004064
exact = 2.1213203436

x = 0.0
f'(x) = 0.0000000160 +/- 0.0000000339
exact = 0.0000000000

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

28.3 Referências e Leituras Adicionais

Os algoritmos usados por essas funções são descritos nas seguintes fontes:


[ << ] [ >> ]           [Topo] [Conteúdo] [Índice] [ ? ]

Esse documento foi gerado em 23 de Julho de 2013 usando texi2html 5.0.