Моя работа включает вычисление функции бессела высокого порядка при большом значении переменной. В MATLAB это было сделано без проблем. Однако, чтобы увеличить масштаб проблемы, я настроился на написание кода C ++ с использованием MPI. Конечно, шаг для генерации бесселевой функции выполняется путем вызова некоторых библиотек. Чтобы конкретизировать проблему, позвольте мне рассмотреть эту очень специфическую ошибку.
Предположим, что в Matlab я хочу вычислить $ J_46341 (86840.0) $ и
Matlab дает мне: besselj (46341,86840) = 0,001309896212292
Тем не менее, простой тестовый пример для вызова
gsl_sf_bessel_Jn_e возвращает «ОШИБКА: NaN»
и я проверил в заказе 46340, что и matlab, и gsl возвращают один и тот же ответ 0.00292895 в пределах допустимой точности. Еще один шаг в GSL приводит к ошибке NaN, в то время как Matlab по-прежнему сохраняет хороший точный числовой ответ.
Я пытался использовать рекуррентные отношения для генерации значений более высокого порядка, начиная с не очень малого порядка, скажем, с порядка 20000 и выше, однако это только задерживает ошибку NaN без полного решения проблемы.
Переключив свое внимание на другие доступные библиотеки программного обеспечения, я попробовал NAG, но к моему полному разочарованию,
nag_bessel_j_alpha (s18ekc) имеет ограничение abs (nl)<= 101
, другими словами, он может вычислять только до порядка 101, и это явно не в моих интересах изучения.
Итак, мой вопрос довольно прост:
Существует ли более надежный библиотечный подход для получения высокого порядка Бесселя?
значение функции для больших х?
Асимптотически, функция бесселя приближается к 0, я, конечно, могу установить эти значения на ноль, если хвост приближается к пределу недостаточного потока. Однако проблема NaN, по-видимому, возникает между сильно колеблющейся кривой и асимптотически затухающим хвостом.
Задача решена. Спасибо за работу сообщества, и это действительно поразило меня своими знаниями и вкладом !!!
Пожалуйста, смотрите здесь,
как вызвать фортрановые процедуры из C ++?
MATLAB, R, Python и JuliaLang / openspecfun основаны на оригинальном исходном коде Fortran доктора Дональда Э. Амоса (национальная лаборатория Сандии), цитируемая статья:
D. E. Amos, "A subroutine package for Bessel functions of a complex
argument and nonnegative order", Sandia National Laboratory Report,
SAND85-1018, May, 1985.
D. E. Amos, "A portable package for Bessel functions of a complex
argument and nonnegative order", Trans. Math. Software, 1986.
Теперь известный как алгоритм Амоса 644, собранный ACM.
http://dl.acm.org/citation.cfm?id=212078
http://dl.acm.org/citation.cfm?id=1268783
http://dl.acm.org/citation.cfm?id=98299
Тем не менее, исходные коды, размещенные на netlib, не свободны от ошибок и, вероятно, не обновлены,
http://netlib.sandia.gov/master/index.html
http://netlib.sandia.gov/amos/
В то время как версия, принятая openspecfun, работает надежно,
https://github.com/JuliaLang/openspecfun
Других решений пока нет …