2015-12-02 103 views
1

我的工作涉及計算大變量值下的高階貝塞爾函數。在MATLAB中,這樣做沒有問題。然而,爲了擴大這個問題,我調整了使用MPI編寫C++代碼。當然,通過調用一些庫來完成生成bessel函數的步驟。爲了把問題具體化,讓我考慮這個非常具體的錯誤。具有大變量的高階貝塞爾函數計算

在MATLAB中,假設我希望計算$ J_46341(86840.0)$,並

matlab gives me: besselj(46341,86840)=0.001309896212292

但是,一個簡單的測試例子調用

gsl_sf_bessel_Jn_e returns "ERROR: NaN"

,我在訂單46340已經檢查, matlab和gsl在可接受的精度範圍內返回相同的答案0.00292895。 GSL的另一個步驟導致NaN錯誤,而matlab仍然保留一個準確的數字答案。

我嘗試使用遞歸關係來生成更高階的值,從一個不是很小的順序,比如從20000開始,然而,這隻會延遲NaN錯誤而不能完全解決問題。

交換我的注意力轉移到其他可用的軟件庫在那裏,我試過NAG,但令我徹底失望,

nag_bessel_j_alpha (s18ekc) has constraint of abs(nl)<=101

,換句話說,它只能計算出高達101秩序,這顯然是不符合我的學習興趣。

所以,我的問題很簡單:

Is there a more reliable library approach to obtain high order bessel function value for large x?

漸近,貝塞爾函數接近0,我一定能夠設置這些值爲零,如果尾巴接近極限下溢。然而,NaN問題似乎在強烈的振盪曲線和漸近衰減的尾部之間發生。

+0

爲什麼不自己計算功能? – marsei

+0

使用bessel函數的遞歸關係不會幫助我進一步。事實上,隨着訂單的增加,與使用GSL庫例程相比,它的分解速度要快得多。 –

+0

@macduf當然你不是指手。 – erip

回答

1

問題解決了。感謝您的社區工作,並且憑藉您的知識和貢獻讓我感到驚喜!

請在這裏看到, how to call fortran routines from C++?

https://mathoverflow.net/questions/225121/computation-of-high-order-bessel-function-at-large-variable-value

MATLAB,R,Python和JuliaLang/openspecfun都建立在由唐納德·E·阿莫斯博士(Sandia國家實驗室)的原始FORTRAN源代碼,引紙:

D. E. Amos, "A subroutine package for Bessel functions of a complex 
argument and nonnegative order", Sandia National Laboratory Report, 
SAND85-1018, May, 1985. 
D. E. Amos, "A portable package for Bessel functions of a complex 
argument and nonnegative order", Trans. Math. Software, 1986. 

現在稱爲Amos算法644由ACM收集。

http://dl.acm.org/citation.cfm?id=212078 
http://dl.acm.org/citation.cfm?id=1268783 
http://dl.acm.org/citation.cfm?id=98299 

然而,託管的netlib的源代碼是不是免費的,可能錯誤沒有及時更新,

http://netlib.sandia.gov/master/index.html 
http://netlib.sandia.gov/amos/ 

雖然通過openspecfun採用的版本可以作爲固體,

https://github.com/JuliaLang/openspecfun