Estou lidando com uma integral complicada que exibe NaNs em certos valores próximos de zero e, no momento, estou lidando com eles de maneira bastante grosseira, usando uma instrução ISNAN que define o integrando como zero quando isso ocorre. Eu tentei isso com a biblioteca NMS em FORTRAN (a rotina q1da - q1dax não é diferente) e com a biblioteca GSL em C (usando a rotina QAGS).
Eu olhei para o CQUAD (parte da biblioteca GSL para C), que é projetado especificamente para lidar com NaNs e INF no integrando, mas há muito pouca informação útil na referência e nenhum exemplo de programas online que eu poderia encontrar. Alguém conhece outra rotina de integração numérica para C ou FORTRAN que possa fazer o trabalho?
quadrature
Josh
fonte
fonte
Respostas:
Eu sou o autor da
CQUAD
GSL. A interface é quase idêntica à deQAGS
, portanto, se você usou o último, não deve ser difícil tentar o primeiro. Lembre-se de não converter seNaN
eInf
z em zeros no integrando - o código lidará com eles.A rotina também está disponível no Octave as
quadcc
e no Matlab aqui .Você poderia fornecer um exemplo dos integrandos com os quais está lidando?
Atualizar
Aqui está um exemplo de uso
CQUAD
para integrar uma função com uma singularidade em um dos pontos de extremidade:com o qual eu compilei
gcc -g -Wall cquad_test.c -lgsl -lcblas
. A saída éObserve que não há nada de especial aqui, nem para dizer
CQUAD
onde está a singularidade ou qualquer tratamento especial dentro do próprio integrando. Apenas deixo que retorneNaN
s, e o integrador cuida deles automaticamente.Observe também que há um erro na versão 1.15 da GSL mais recente que pode afetar o tratamento de singularidades. Foi corrigido, mas não chegou à distribuição oficial. Eu usei a fonte mais recente, baixada com
bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.fonte
Você também pode verificar as fórmulas de quadratura com dupla exponencial. Eles fazem uma alteração (implícita) de variáveis, certificando-se de que "facilitam" as singularidades dos limites. Uma implementação muito boa (Fortran77 e C) pode ser encontrada no site da Ooura .
fonte