Estoy tratando con una integral complicada que exhibe NaNs a ciertos valores cercanos a cero y en este momento estoy tratando con ellos de manera bastante cruda usando una declaración ISNAN que establece el integrando a cero cuando esto ocurre. He intentado esto con la biblioteca NMS en FORTRAN (la rutina q1da - q1dax no es diferente) y con la biblioteca GSL en C (usando la rutina QAGS).
Miré en CQUAD (parte de la biblioteca GSL para C) que está específicamente diseñado para manejar NaNs e INF en el integrando, pero hay muy poca información útil en la referencia y no hay programas de ejemplo en línea que pueda encontrar. ¿Alguien conoce alguna otra rutina de integración numérica para C o FORTRAN que pueda hacer el trabajo?
quadrature
Josh
fuente
fuente
Respuestas:
Soy el autor de
CQUAD
la GSL. La interfaz es casi idéntica a la deQAGS
, por lo que si ha utilizado la última, no debería ser difícil probar la primera. Sólo recuerda no convertir susNaN
s yInf
s a ceros en el integrando - el código se ocupará de éstos en sí.La rutina también está disponible en Octave as
quadcc
, y en Matlab aquí .¿Podría dar un ejemplo de los integrandos con los que está tratando?
Actualizar
Aquí hay un ejemplo de uso
CQUAD
para integrar una función con una singularidad en uno de los puntos finales:lo que he realizado con
gcc -g -Wall cquad_test.c -lgsl -lcblas
. La salida esTenga en cuenta que no hay nada especial aquí, ni para decir
CQUAD
dónde está la singularidad, ni ningún tratamiento especial dentro del propio integrando. Solo dejo que devuelvaNaN
s, y el integrador se encarga de ellos automáticamente.Tenga en cuenta también que hay un error en la última versión 1.15 de GSL que puede afectar el tratamiento de las singularidades. Se ha solucionado, pero no ha llegado a la distribución oficial. Utilicé la fuente más reciente, descargada con
bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.fuente
También puede consultar las fórmulas de cuadratura doble exponencial. Realizan un cambio (implícito) de variables, asegurándose de que "facilitan" las singularidades de los límites. Una implementación muy agradable (Fortran77 y C) se puede encontrar en el sitio web de Ooura .
fuente