2013-12-11 33 views
0

我有一個問題涉及到的順序爲0,我寫我自己的球貝塞爾函數球貝塞爾函數:Matlab的定製球貝塞爾函數的NaN在0

function js = sphbesselj(nu,x) 
js = sqrt(pi ./(2* x)) .* besselj(nu + 0.5, x); 
end 

這似乎與Mathematicas內置一個爲我所有的測試,以同意案例。問題出在nux =0。 Mathematica正確返回1,但是我的MATLAB scrip返回NaN。我怎麼能糾正我的代碼,這樣,如果我在一個陣列喂說x = 0:1:5我得到了1我的第一個值,而不是

>> sphbesselj(0,x) 
ans = 
    NaN 0.8415 0.4546 0.0470 -0.1892 -0.1918 

是我的自定義函數去了解它的最好方法?

感謝

+2

除以零總會給你帶來問題。爲什麼不抓住x = 0的情況,並相應地修改 – mathematician1975

回答

3

事實上,浮動的x接近0點值也返回Nan。你實際上有三種可能擔心的情況。 x =±∞也導致NaN。下面是處理這些矢量化功能:

function js = sphbesselj(nu,x) 
    if isscalar(nu) && isscalar(x) 
     js = 0; 
    elseif isscalar(nu) 
     js = zeros(size(x)); 
     nu = js+nu; 
    else 
     js = zeros(size(nu)); 
     x = js+x; 
    end 
    x0 = (abs(x) < realmin); 
    x0nult0 = (x0 & nu < 0); 
    x0nueq0 = (x0 & nu == 0); 
    js(x0nult0) = Inf;   % Re(Nu) < 0, X == 0 
    js(x0nueq0) = 1;   % Re(Nu) == 0, X == 0 
    i = ~x0nult0 & ~x0nueq0 & ~(x0 & nu > 0) & (abs(x) < realmax); 
    js(i) = sign(x(i)).*sqrt(pi./(2*x(i))).*besselj(nu(i)+0.5,x(i)); 
end 

在開發這樣的功能是http://functions.wolfram.com一個有用的資源。 spherical Bessel function of the first kind上的頁面有很多有用的關係。

+0

嗨,謝謝,這個功能非常聰明,我從中學到了一些新的技巧。不過,我現在遇到了一個新問題。當x是任何負數時,該函數返回1。我不知道如何編輯它以再次允許負值。謝謝! –

+0

@SteveHatcher:你是對的。我更新了代碼。這個問題通過'x0 =(abs(x) horchler

+0

非常感謝這麼多 - 完美的作品!是的,Mathematica確實似乎更多地假設情況更簡單。我仍然感到驚訝MATLAB沒有在功能上建立球形Bessel。 –