Моя работа связана с вычислением функции Бесселя высокого порядка при большом значении переменной. В 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, и это явно не в моих интересах.
Итак, мой вопрос довольно прост:
Есть ли более надежный библиотечный подход для получения значения функции Бесселя высокого порядка для больших x?
Асимптотически функция Бесселя приближается к 0, я могу с уверенностью установить эти значения равными нулю, если хвост приближается к пределу потери значимости. Однако проблема NaN, по-видимому, возникает где-то между сильно осциллирующей кривой и асимптотически затухающим хвостом.