J'ai affaire à une intégrale délicate qui présente des NaN à certaines valeurs proches de zéro et pour le moment je les traite assez grossièrement en utilisant une instruction ISNAN qui met l'intégrande à zéro lorsque cela se produit. J'ai essayé cela avec la bibliothèque NMS de FORTRAN (la routine q1da - q1dax n'est pas différente) et avec la bibliothèque GSL en C (en utilisant la routine QAGS).
J'ai examiné CQUAD (qui fait partie de la bibliothèque GSL pour C) qui est spécifiquement conçu pour gérer les NaN et INF dans l'intégrande, mais il y a très peu d'informations utiles dans la référence et aucun exemple de programme en ligne que j'ai pu trouver. Quelqu'un connaît-il une autre routine d'intégration numérique pour C ou FORTRAN qui pourrait faire le travail?
la source
Réponses:
Je suis l'auteur du
CQUAD
GSL. L'interface est presque identique à celle deQAGS
, donc si vous avez utilisé ce dernier, il ne devrait pas être difficile du tout d'essayer le premier. N'oubliez pas de ne pas convertir vosNaN
s etInf
s en zéros dans l'intégrande - le code les traitera lui-même.La routine est également disponible dans Octave as
quadcc
, et dans Matlab ici .Pourriez-vous fournir un exemple des intégrandes avec lesquelles vous traitez?
Mise à jour
Voici un exemple d'utilisation
CQUAD
pour intégrer une fonction avec une singularité à l'un des points de terminaison:avec lequel j'ai compilé
gcc -g -Wall cquad_test.c -lgsl -lcblas
. La sortie estNotez qu'il n'y a rien de spécial ici, ni pour dire
CQUAD
où se trouve la singularité, ni aucun traitement spécial au sein de l'intégrande elle-même. Je viens de le laisser revenirNaN
, et l'intégrateur s'en charge automatiquement.Notez également qu'il existe un bug dans la dernière version GSL 1.15 qui peut affecter le traitement des singularités. Il a été corrigé, mais n'est pas parvenu à la distribution officielle. J'ai utilisé la source la plus récente, téléchargée avec
bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.la source
Vous pouvez également consulter les formules de quadrature exponentielle double. Ils effectuent un changement (implicite) de variables, en s'assurant qu'ils "relâchent" les singularités des limites. Une très belle implémentation (Fortran77 et C) peut être trouvée sur le site Web d'Ooura .
la source