2014-07-07 7 views
2

나는 boost::math::cyl_bessel_k(x,y) * exp(y)을 시도했다. 대부분의 경우이 값은 Matlab의 눈금이 besselk(x,y,1) 인 것과 같습니다. 그러나 x=1, y=2000과 같이 besselk(x,y)=0boost::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)"와 정확히 같은 것은 무엇입니까?

답변

1

내가 원하는 것을 수행하는 Boost에는 아무것도 표시되지 않습니다 (하위 수준 기능을 사용하여 직접 구현할 수도 있음). 당신이 알았 으면, scaled Bessel 함수는 단순히 exp(z)을 곱하여 계산되지 않습니다. GSL에는이 기능이 통합되어 있습니다 (예 : gsl_sf_bessel_Knu_scaled). '완전 동등 물'의 경우 the papercode by Amos을 볼 수 있습니다 (예 : CBESK). Matlab과 Octave 모두이 구현을 사용하는 것처럼 보입니다. 그러나 코드는 Fortran으로 작성 되었기 때문에이 코드를 번역하거나 래퍼를 넣어야합니다 (this project이이를 수행 한 것처럼 보입니다. 유용 할 수 있습니다 - 다른 언어도 있습니다).

또한 Matlab의 코더 및 codegen을 사용하여 출력 할 수도 있습니다.

+0

첫 번째 매개 변수가 음수 인 경우를 제외하고'gsl_sf_bessel_Knu_scaled'가 올바르게 작동합니다. 첫 번째 매개 변수가 음수이면 다음과 같은 오류가 발생합니다.'gsl : bessel_Knu.c : 42 : ERROR : 도메인 오류 기본 GSL 오류 처리기가 호출되었습니다. 중단됨 (코어 덤프 됨). 또한이 줄을'gsl_set_error_handler_off();'에러 처리를 위해 넣었지만, 이번에는'gsl_sf_bessel_Knu_scaled'의 출력이'nan'입니다. 어떻게 처리 할 수 ​​있습니까? – taha

+0

첫 번째 매개 변수가 음수이면 결과가'gsl_sf_bessel_Knu_scaled (abs (firstparam), y)'와 동일 함을 발견했습니다. 그래서 작동합니다. 고마워요! – taha