我遇到的问题涉及0阶球面贝塞尔函数。我编写了自己的球形贝塞尔函数:
function js = sphbesselj(nu,x)
js = sqrt(pi ./(2* x)) .* besselj(nu + 0.5, x);
end
这似乎与Mathematicas在我的所有测试用例中内置了一个。问题出在nu
或x =0
。 Mathematica正确返回1,但我的MATLAB脚本返回NaN。我怎么能纠正我的代码,所以如果我输入一个说x = 0:1:5
的数组,我得到的是第一个值,而不是
>> sphbesselj(0,x)
ans =
NaN 0.8415 0.4546 0.0470 -0.1892 -0.1918
我的自定义功能是最好的解决方法吗?
由于
答案 0 :(得分: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上的页面有许多有用的关系。