나는 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의 besselk(x,y,1)
에 대한 동등한 진술을 찾고 싶습니다. 어떻게 처리 할 수 있습니까?C++에서 "Matlab besselk (x, y, 1)"와 정확히 같은 것은 무엇입니까?
2
A
답변
1
내가 원하는 것을 수행하는 Boost에는 아무것도 표시되지 않습니다 (하위 수준 기능을 사용하여 직접 구현할 수도 있음). 당신이 알았 으면, scaled Bessel 함수는 단순히 exp(z)
을 곱하여 계산되지 않습니다. GSL에는이 기능이 통합되어 있습니다 (예 : gsl_sf_bessel_Knu_scaled
). '완전 동등 물'의 경우 the paper 및 code by Amos을 볼 수 있습니다 (예 : CBESK). Matlab과 Octave 모두이 구현을 사용하는 것처럼 보입니다. 그러나 코드는 Fortran으로 작성 되었기 때문에이 코드를 번역하거나 래퍼를 넣어야합니다 (this project이이를 수행 한 것처럼 보입니다. 유용 할 수 있습니다 - 다른 언어도 있습니다).
또한 Matlab의 코더 및 codegen
을 사용하여 출력 할 수도 있습니다.
첫 번째 매개 변수가 음수 인 경우를 제외하고'gsl_sf_bessel_Knu_scaled'가 올바르게 작동합니다. 첫 번째 매개 변수가 음수이면 다음과 같은 오류가 발생합니다.'gsl : bessel_Knu.c : 42 : ERROR : 도메인 오류 기본 GSL 오류 처리기가 호출되었습니다. 중단됨 (코어 덤프 됨). 또한이 줄을'gsl_set_error_handler_off();'에러 처리를 위해 넣었지만, 이번에는'gsl_sf_bessel_Knu_scaled'의 출력이'nan'입니다. 어떻게 처리 할 수 있습니까? – taha
첫 번째 매개 변수가 음수이면 결과가'gsl_sf_bessel_Knu_scaled (abs (firstparam), y)'와 동일 함을 발견했습니다. 그래서 작동합니다. 고마워요! – taha