2014-07-07 35 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中,我沒有看到任何需要的東西(儘管您可能可以使用低級函數自己實現它)。正如您發現的那樣,縮放貝塞爾函數不是簡單地乘以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

相關問題