[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse capítulo descreve rotinas para executar integração numérica (quadratura) de uma função em uma dimensão. Exitem rotinas para integração adaptativa e não adaptativa de funções genéricas, com rotinas especializadas para casos específicos. essas rotinas especializadas incluem integração sobre intervalos infinitos e semi-infinitos, integrais singulares, incluindo singularidades logaritmicas, cálculos dos valores principais de Cauchy e integrais oscilatórias. A biblioteca reimplementa os algoritmos usados em QUADPACK, um pacote de integração numérica escrito por Piessens, de Doncker-Kapenga, Ueberhuber e Kahaner. Código Fortran para QUADPACK está disponível na Netlib. Também incluídos estão rotinas de integração não adaptativas, de Gauss-Legendre de ordem fixa com coeficientes de alta precisão por Pavel Holoborodko.
As funções descritas nesse capítulo são declaradas no arquivo de cabeçalho ‘gsl_integration.h’.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Cada algoritmo calcula uma aproximação para uma integral definida da
forma,
|
|
|
Note que isso é um ou um ou outro restrito, não simultâneo. Para calcular com um erro absoluto especificado, ajuste epsrel para zero. Para calcular com um erro relativo especificado, ajuste epsabs para zero. As rotinas irão falhar na convergência se o erro associado for muito pequeno, mas sempre retorna a melhor aproximação obtida acima daquele estágio.
Os algoritmos em QUADPACK usam uma convenção de nome baseada nas seguintes letras,
Q
- rotina de quadraturaN
- integrador não adaptativoA
- integrador adaptativoG
- integrando genérico (definido pelo usuário)W
- função peso com integrandoS
- singularidades podem ser mais prontamente integradasP
- pontos de dificuldade especial podem ser fornecidosI
- intervalo infinito de integraçãoO
- função de peso oscilatório, cos ou sinF
- integral de FourierC
- valor principal de Cauchy
Os algoritmos são construídos sobre pares de regras de quadratura, uma regra de alta ordem e uma regra de baixa ordem. Uma regra de alta ordem é usada para calcular a melhor aproximação para uma integral sobre um pequeno intervalo. A diferença entre os resultados de uma regra de alta ordem e a correspondente regra de baixa ordem fornece uma estimativa do erro na aproximação.
17.1.1 Integrandos sem Funções Ponderadas | ||
17.1.2 Integrandos com funções ponderadas | ||
17.1.3 Integrandos com funções ponderadas singulares |
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Os algoritmos para funções gerais (sem uma função peso) são baseados nas regras de Gauss-Kronrod.
Uma regra de Gauss-Kronrod inicia-se com uma regra de quadratura de Gauss clássica de ordem m. Essa regra de quadratura de Gauss clássica é extendida com pontos adicionais entre cada uma das abscissas para fornecer uma regra de alta ordem de Kronrod de ordem 2m+1. A regra de Kronrod é eficiente pelo fato de reutilizar avaliações de funções existentes a partir da regra de Gauss.
A regra de Kronrod de alta ordem é usada como a melhor aproximação para a integral, e a diferença entre as duas regras é usada como uma estimativa do erro na aproximação.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Para integrandos com funções peso os algoritmos usam regras de quadratura de Clenshaw-Curtis.
Uma regra de Clenshaw-Curtis inicia com uma aproximação de polinômio de Chebyshev de n-ésima ordem para o integrando. Esse polinômio pode ser integrado exatamente para fornecer uma aproximação para a integral da função original. A expansão de Chebyshev pode ser extendida para ordens mais altas para melhorar a aproximação e fornecer uma estimativa de erro.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
A presença de singularidades (ou outro comportamento) no integrando pode fazer com que a convergência seja lenta na aproximação de Chebyshev. As regras modificadas de Clenshaw-Curtis usadas em QUADPACK separam muitas funções de peso comuns que causam convergência lenta.
Essas funções de peso são integradas analiticamente contra os polinômios de Chebyshev para pré-calcular momentos de Chebyshev modificados. Combinando os momentos como a aproximação de Chebyshev para a função fornece a integral desejada. O uso de integração analítica para a parte singular da função permite cancelamentos exatos e melhora substancialmente o comportamento geral da convergência da integração.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O algoritmo QNG é um procedimento não adaptativo que usa abscissas fixas de Gauss-Kronrod-Patterson para fazer amostras do integrando em um máximo de 87 pontos. É fornecido para integração rápida de de funções simples.
Essa função aplica regras de integração de Gauss-Kronrod em 10-pontos, 21-pontos, 43-pontos e 87-pontos em sucessão até que uma estimativa da integral de f sobre (a,b) seja encontrada dentro dos limites desejados de erro absoluto e erro relativo, epsabs e epsrel. A função retorna a aproximação final, result, uma estimativa de erro absoluto, abserr e o número de avalizações de função usadas, neval. As regras de Gauss-Kronrod são designadas em um tal caminho que cada regra usa todos os resultados de seus predecessores, com o objetivo de minimizar o número total de avalizações de função.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O algoritmo QAG é um procedimento simples de quadratura adaptativa. A
região de integração é dividida em subintervalos, e a cada iteração
o subintervalo com maior estimativa de erro é bissectado. Isso
reduz o erro médio rapidamente, uma vez que os subintervalos tornam-se
concentrados em volta do local de dificuldades no integrando. Esses
subintervalos são gerenciados por uma estrutura gsl_integration_workspace
,
a qual manipula a memória para a amplitudes de subintervalos, resultados e estimativas
de erro.
Essa função aloca um espaço de trabalho suficiente para manter n intervalos de precisão dupla, seu resultado de integração e estimativas de erro. Um espaço de trabalho pode ser usado multiplas vezes uma vez que toda a reinicialização necessária é executada automaticamente pelas rotinas de integração.
Essa função libera a memória assocada ao espaço de trabalho w.
Essa função aplica uma regra de integração adaptativa até que uma estimativa da integral de f no intervalo (a,b) seja encontrada dentro dos limites desejados de erro absoluto e erro relativo, epsabs e epsrel. A função retorna a aproximação final, result, e uma estimativa do erro absoluto, abserr. A regra de integração é determinada pelo valor de key, a qual deve ser escolhida a partir dos seguintes nomes simbólicos,
GSL_INTEG_GAUSS15 (key = 1) GSL_INTEG_GAUSS21 (key = 2) GSL_INTEG_GAUSS31 (key = 3) GSL_INTEG_GAUSS41 (key = 4) GSL_INTEG_GAUSS51 (key = 5) GSL_INTEG_GAUSS61 (key = 6)
correspondendo a 15, 21, 31, 41, 51 e 61 pontos para regras de integração de Gauss-Kronrod. As regras de mais alta ordem fornecem melhor precisão para funções bem comportadas, enquanto regras de ordem mais baixa economizam tempo quando a função contém dificuldades localizadas, tais como descontinuidades.
A cada iteração a estratégia de integração adaptativa bisecciona o intervalo com o maior erro estimado. Os subintervalos e seus resultados são armazenados na memória fornecida por workspace. O número máximo def subintervalos é fornecido por limit, o qual pode não exceder o tamanho alocado do espaço de trabalho.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
A presença de uma singularidade integrável na região de integração faz com que uma rotina adaptativa para concentrar novos subintervalos em torno da singularidade. Como o subintervalo decresce em tamanho as sucessivas aproximações da integral convergem para um limite. Essa aproximação de um limite pode ser acelerada usando um procedimento de extrapolação. O algoritmo QAGS combina a bissecção adaptativa ao algoritmo épsilon de Wynn para aumentar a velocidade da integração de muitos tipos de singularidades integráveis.
Essa função aplica a regra de integração de 21 pontos de Gauss-Kronrod adaptativamente até que uma estimativa da integral de f no intervalo (a,b) seja encontrada dentro do erro absoluto desejado e dentro dos limites de erro relativo, epsabs e epsrel. Os resultados são extrapolados usando o algoritmo épsilon, o qual acelera a convergência da integral na presença de descontinuidades e de singularidades integráveis. A função retorna a aproximação final a partir da extrapolação, result, e uma estimativa de erro absoluto, abserr. Os subintervalos e seus resultados são armazenados na memória fornecida através de workspace. O número máximo de subintervalos é fornecido através de limit, o qual não pode exceder o tamanho alocado do espaço de trabalho.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função aplica o algoritmo adaptativo de integração QAGS levando em consideração localizações de pontos singulares fornecidas pelo usuário. O vetor estático pts de comprimento npts deve conter os pontos extremos dos intervalos de integração definidos pela região de integração e pelas localizações da singularidades. Por exemplo, para integrar sobre a região (a,b) com pontos de parada em x_1, x_2, x_3 (onde a < x_1 < x_2 < x_3 < b) o seguinte vetor estático pts deve ser usado
pts[0] = a pts[1] = x_1 pts[2] = x_2 pts[3] = x_3 pts[4] = b
com npts = 5.
Se você conhece as localizações dos pontos singulares na região de
integração então essa rotina irá ser mais rápida que QAGS
.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função calcula a integral da função f no
intervalo infinito (-\infty,+\infty). A integral é mapeada sobre
o intervalo semi-aberto (0,1] usando a transformação x = (1-t)/t,
|
Essa função calcula a integral da função f sobre o
intervalo semi-infinito (a,+\infty). A integral é mapeada no
intervalo semi-aberto (0,1] usando a transformação x = a + (1-t)/t,
|
Essa função calcula a integral da função f sobre o
intervalo semi-infinito (-\infty,b). A integral é mapeada no
intervalo semi-aberto (0,1] usando a transformação x = b - (1-t)/t,
|
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função calcula o valor principal de Cauchy da integral de
f no intervalo (a,b), com uma singularidade em c,
|
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O algoritmo QAWS é pensado para integrandos com singularidades algébricas logaritmicas nos extremos de uma região de integração. Com o objetivo de trabalhar eficientemente o algoritmo requer uma tabela pré calculada de momentos de Chebyshev.
Essa função aloca espaço para uma estrutura gsl_integration_qaws_table
descrevendo uma função singular de peso
W(x) com os parâmetros (\alpha, \beta, \mu, \nu),
|
|
A função retorna um apontador para a tabela mais recentemente
alocada gsl_integration_qaws_table
se erros não forem encontrados, e 0 em
caso de erro.
Essa função modifica os parâmetros (\alpha, \beta, \mu, \nu) de
uma já existente gsl_integration_qaws_table
struct t.
Essa função libera toda a memória associada a
gsl_integration_qaws_table
struct t.
Essa função calcula a integral da função f(x) sobre o
intervalo (a,b) com função de peso singular
(x-a)^\alpha (b-x)^\beta \log^\mu (x-a) \log^\nu (b-x). Os parâmetros
da função peso (\alpha, \beta, \mu, \nu) são recebidos a partir da
tabela t. A integral é,
|
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O algoritmo QAWO foi pensado para integrandos com um fator oscilatório, \sin(\omega x) ou \cos(\omega x). Com o objetivo de trabalhar eficientemente o algoritmo requer uma tabela de momentos de Chebyshev a qual deve ser pré-calculada com chamadas às funções abaixo.
Essa função aloca espaço para uma estrutura
gsl_integration_qawo_table
e seu espaço de trabalho associado descrevendo uma função de peso seno ou cosseno W(x) com os parâmetros (\omega, L),
|
GSL_INTEG_COSINE GSL_INTEG_SINE
A gsl_integration_qawo_table
é uma tabela de coeficientes
trigonométricos requerida no processo de integração. O parâmetro n
determina o número de níveis de coeficientes que são calculados. Cada
nível corresponde a uma bissecção do intervalo L, de forma que
n níveis são suficientes para subintervalos abaixo do comprimento
L/2^n. A rotina de integração gsl_integration_qawo
retorna o erro GSL_ETABLE
se o número de níveis for
insuficiente para a precisão requisitada.
Essa função modifica os parâmetros omega, L e sine do espaço de trabalho existente t.
Essa função permite que o parâmetro de comprimento L do espaço de trabalho t seja modificado.
Essa função libera toda a memória associada ao espaço de trabalho t.
Essa função usa um algorítimo adaptativo para calcular a integral de
f no intervalo (a,b) com a função de peso
\sin(\omega x) ou \cos(\omega x) definida
pela tabela wf,
|
Aqueles subtintervalos com “grande” largura d onde d\omega > 4 são calculados usando uma regra de integração de 25 pontos de Clenshaw-Curtis, a qual controla o comportamento oscilatório. Subintervalos com uma “pequena” largura onde d\omega < 4 são calculados usando uma regra de integração de 15 pontos de Gauss-Kronrod.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função tenta calcular uma integral de Fourier da função
f sobre o intervalo semi-infinito [a,+\infty).
|
O parâmetro \omega e a escolha de \sin ou de \cos é
feita a partir da tabela wf (o comprimento L pode tomar qualquer valor,
uma vez que é sobrescrito por essa função assumindo um valor apropriado para a
integração de Fourier). A integral é calculada usando o algoritmo de QAWO
sobre cada um dos subintervalos,
|
Essa função funciona uma tolerância absoluta geral de
abserr. A seguinte estratégia é usada: sobre cada intervalo
C_k o algoritmo tenta encontrar a tolerância
|
Se a integração de um subintervalo levar a dificuldades então a
precisão requerida para o subintervalo subsequente é relaxada,
|
Os subintervalos e seus resultados são armazenados na memoria fornecida por workspace. O número máximo de subintervalos é fornecido por limit, o qual não pode exceder o tamanho alocado do espaço de trabalho. A integração sobre cada subintervalo usa a memória fornecida por cycle_workspace como espaço de trabalho para o algoritmo QAWO.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
CQUAD é uma nova rotina de quadratura duplamente adaptativa de
propósito geral a qual pode tratar a maioria dos tipos de singularidades,
valores de função não numéricos tais como Inf
ou NaN
,
bem como algumas integrais divergentes. Geralmente requerem mais
avaliações de função que as rotinas de integração em
QUADPACK, ainda falha menos e na maioria das vezes por integrandos difíceis.
O algoritmo básico usa um esquema duplamente adaptativo no qual regras de quadratura de Clenshaw-Curtis de incremento do grau são usadas para calcular a interal em cada intervalo. O módulo L_2 da diferença entre os polinômios interpolatórios básicos de duas regras sucessivas é usado como um erro estimado. O intervalo é subdividido se a diferença entre duas regras sucessivas for muito grande ou uma regra de grau máximo tiver sido alcançada.
Essa função aloca um espaço de trabalho suficiente para manter os dados para n intervalos. O número n não é o número máximo de intervalos que irão ser avaliados. Se o espaço de trabalho estiver cheio, intervalos com memnor erro estimado irão ser descartados. Um mínimo de três intervalos é requerido e para a maioria das funções, um espaço de trabalho de tamanho 100 é suficiente.
Essa função libera a memória assocada ao espaço de trabalho w.
Essa função calcula a integral de f no intervalo (a,b) dentro dos limites desejados de erro absoluto e de erro relativo, epsabs e epsrel usando o algoritmo CQUAD. A função retorna a aproximação final, result, uma estimativa do erro absoluto, abserr, e o número de avaliações de função requeridas, nevals.
O algorítimo CQUAD divide a região de integração em subintervalos, e em cada iteração, o subintervalo com o maior erro estimado é processado. O algoritmo usa regras de quadratura de Clenshaw-Curits de graus 4, 8, 16 e 32 sobre 5, 9, 17 e 33 nodos respectivamente. Cada intervalo é inicializado com a regra de menor grau. Quando um intervalo é processado, o maior grau seguinte é avaliado e um erro estimado é calculado baseado no módulo L_2 da diferença entre os polinômios básicos de interpolação de ambas as regras de menor grau e de maior grau seguinte. Se o maior grau disponível tiver sido alcançada, ou os polinômios de interpolação diferirem significativamente, o intervalo é bisectado.
Os subintervalos e seus resultados são armazenados na memória
fornecida por workspace. Se o erro estimado ou o número de
avaliações de função não forem necessários, os apontadores abserr e nevals
podem ser ajustados para NULL
.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
As rotinas de integração de ordem fixa de Gauss-Legendre são fornecidas para integrações rápidas de funções bem comportadas com ordem polinomial conhecida. Os n pontos da regra de Gauss-Legendre são exatos para polinômios de ordem 2*n-1 ou menor. Por exemplo, essas regras são úteis na integração de funções base para formar matrizes densas para o método de Galerkin. Diferentemente de outras rotinas de integração numérica dentro da biblioteca, essas rotinas não aceitam erros absolutos ou relativos associados.
Essa função determina a abscissa de Gauss-Legendre e pesos necessários para um esquema de integração de ordem fixa com n pontos. Se possível, coeficientes de alta precisão pré-calculados são usados. Se pesos pré-calculados não estiverem disponíveis, coeficientes de baixa precisão são calculados imediatamente.
Essa função aplica a regra de integração de Gauss-Legendre contida na tabela t e retorna o resultado.
Para i em [0, …, t->n - 1], essa função obtém o i-ésimo ponto de Gauss-Legendre xi e peso wi no intervalo [a,b]. Os pontos e pesos são ordenados por valor crescente de ponto. Uma função f pode ser integrada no intervalo [a,b] somando wi * f(xi) sobre i.
Essa função libera a memória associada à tabela t.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Adicionalmente a códigos de erros padronizados para argumentos inválidos as funções retornam os seguintes valores,
GSL_EMAXITER
o número máximo de subdivisões foi extrapolado.
GSL_EROUND
não posso alcançar a tolerância devido a erro de arredondamento, ou erro de arredondamento foi detectado na tabela de extrapolação.
GSL_ESING
uma singularidade não integrável ou outro mau comportamento do integrado foi encontrado no intervalo de integração.
GSL_EDIVERGE
a intergral é divergente, ou de convergência extremamente lenta para ser integrada numericamente.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O integrador QAGS
irá tratar uma larga classe de integrais
definidas. Por exemplo, considere a seguinte integral, a qual tem uma
singularidade logarítmica algébrica na orígem,
|
1e-7
.
#include <stdio.h> #include <math.h> #include <gsl/gsl_integration.h> double f (double x, void * params) { double alpha = *(double *) params; double f = log(alpha*x) / sqrt(x); return f; } int main (void) { gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000); double result, error; double expected = -4.0; double alpha = 1.0; gsl_function F; F.function = &f; F.params = α gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000, w, &result, &error); printf ("result = % .18f\n", result); printf ("exact result = % .18f\n", expected); printf ("estimated error = % .18f\n", error); printf ("actual error = % .18f\n", result - expected); printf ("intervals = %d\n", w->size); gsl_integration_workspace_free (w); return 0; }
Os resultados abaixo mostram que a precisão desejada é encontrada após 8 subdivisões.
$ ./a.outresult = -3.999999999999973799 exact result = -4.000000000000000000 estimated error = 0.000000000000246025 actual error = 0.000000000000026201 intervals = 8
De fato, o procedimento de extrapolação usado por QAGS
produz uma
precisão de quase o dobro de dígitos. O erro estimado retornado pelo
procedimento de extrapolação é maior que o erro atual, fornecendo uma
margem de segurança de uma ordem de magnitude.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Os seguinte livro é a referência definitiva para QUADPACK, e foi escrito pelos autores originais. Fornece descrições dos algoritmos, listagem de programas, programas de teste e exemplos. Também inclui dicas úteis sobre integração numérica e muitas referências sobre a literatura de integração numérica usada em desenvolvimento QUADPACK.
O algoritmo de integração CQUAD é descrito no seguinte artigo:
[ << ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse documento foi gerado em 23 de Julho de 2013 usando texi2html 5.0.