Я имею дело с хитрым интегралом, который демонстрирует NaN при определенных значениях, близких к нулю, и в настоящий момент я имею дело с ними довольно грубо, используя выражение ISNAN, которое устанавливает подынтегральное выражение в ноль, когда это происходит. Я пробовал это с библиотекой NMS в FORTRAN (процедура q1da - q1dax не отличается) и с библиотекой GSL в C (используя процедуру QAGS).
Я посмотрел на CQUAD (часть библиотеки GSL для C), которая специально разработана для обработки NaN и INF в подынтегральном выражении, но в справочнике очень мало полезной информации и нет примеров программ в Интернете, которые я мог бы найти. Кто-нибудь знает какие-либо другие процедуры числовой интеграции для C или FORTRAN, которые могли бы сделать эту работу?
источник
Ответы:
Я автор
CQUAD
в GSL. Интерфейс почти идентичен интерфейсуQAGS
, поэтому, если вы использовали последний, вам не составит труда попробовать первый. Только помните, что не нужно преобразовывать вашиNaN
s иInf
s в нули в подынтегральном выражении - код сам справится с ними.Процедура также доступна в Octave as
quadcc
и Matlab здесь .Не могли бы вы привести пример с интегратами, с которыми вы имеете дело?
Обновить
Вот пример использования
CQUAD
для интеграции функции с особенностью в одной из конечных точек:который я собрал
gcc -g -Wall cquad_test.c -lgsl -lcblas
. ВыходОбратите внимание, что здесь нет ничего особенного, ни для того, чтобы сказать,
CQUAD
где находится особенность, ни для какой-либо особой обработки внутри самой подынтегральной функции. Я просто позволю ему вернутьNaN
s, и интегратор позаботится о них автоматически.Также обратите внимание, что в последней версии GSL 1.15 есть ошибка, которая может повлиять на обработку сингулярностей. Это было исправлено, но не дошло до официального распространения. Я использовал самый последний источник, скачанный с
bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.источник
Вы также можете проверить квадратурные формулы с двумя экспонентами. Они делают (неявное) изменение переменных, удостоверяясь, что они «ослабляют» граничные особенности. Очень хорошая (Fortran77 и C) реализация может быть найдена на веб-сайте Ooura .
источник