2013-12-11 34 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。 –