Что является точным эквивалентом «Matlab besselk (x, y, 1)»? в с ++?

я пытался boost::math::cyl_bessel_k(x,y) * exp(y), В большинстве случаев это равно масштабированному Matlab besselk(x,y,1), Но в некоторых случаях (например, x=1, y=2000) когда оба besselk(x,y)=0 а также boost::math::cyl_bessel_k(x,y)=0, Масштабированная версия Matlab besselk(x,y,1) дает мне разные значения варьируется вокруг 10^-3, Но boost::math::cyl_bessel_k(x,y) * exp(y) возвращается -nan, Я хотел бы найти эквивалентное утверждение для Matlab’s besselk(x,y,1), Как я могу справиться с этим?

2

Решение

Я не вижу в Boost ничего такого, что делает то, что вам нужно (хотя вы можете реализовать это самостоятельно, используя функции более низкого уровня). Как вы узнали, масштабированные функции Бесселя вычисляются не просто умножением exp(z), GSL кажется, включили эту функцию, например, gsl_sf_bessel_Knu_scaled. Для «точного эквивалента» вы можете посмотреть на бумага а также код Амоса, например., CBESK. И Matlab, и Octave используют эту реализацию. Тем не менее, код написан на Фортране, поэтому вам нужно будет перевести его или обернуть вокруг него (этот проект кажется, сделал это, так что это может быть полезно — есть и другие).

Вы также можете использовать кодер Matlab и codegen вывести что-то, а также.

1

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector