вычисление функции Бесселя высокого порядка с большими переменными

Моя работа включает вычисление функции бессела высокого порядка при большом значении переменной. В 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, по-видимому, возникает между сильно колеблющейся кривой и асимптотически затухающим хвостом.

1

Решение

Задача решена. Спасибо за работу сообщества, и это действительно поразило меня своими знаниями и вкладом !!!

Пожалуйста, смотрите здесь,
как вызвать фортрановые процедуры из C ++?

https://mathoverflow.net/questions/225121/computation-of-high-order-bessel-function-at-large-variable-value

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
1

Другие решения

Других решений пока нет …