各位大侠:
由于本人最近需要求bessel函数的零点值,因此在网上找了下,发现有一下程序:
function SolveBessel
% 求解贝塞尔函数的零点
global rootBessel
maxv = 10; % 最大贝塞尔函数阶数-1,表示从0到9阶
maxs = 10; % 所需要计算贝塞尔函数的零点的数目
j = zeros(maxv, maxs); % 贝塞尔函数的根
incr = 4.0;
for v=0:maxv-1
h = v+1.9*v^(1/3)+1;
if (v==0) % 0阶贝塞尔函数的第一个零点
j(v+1,1) = fzero(@(x)besselj(v,x),2);
else % 1阶及以上阶贝塞尔函数的第一个零点
j(v+1,1) = fzero(@(x)besselj(v,x),h);
end
for s=2:maxs % 贝塞尔函数的第2个及后面的零点
j(v+1,s) = fzero(@(x)besselj(v,x),j(v+1,s-1)+incr);
end
end
rootBessel = j
本来以为ok了,可是发现当零点数目变得很大时,就会出现问题,比如对于0阶函数,N=43后,就一直不变了
检查后发现是这时的步长不对,几经修改,还是出现了不少问题
比如:对于0点212.8435,如果运算X = fzero(@(x)besselj(0,x),212.8435+4)
结果是209.7019,比212还小,而在215就有1个零点的,以及运算
X = fzero(@(x)besselj(0,x),212.8435+3)
X =
212.8435
X = fzero(@(x)besselj(0,x),212.8435+2)
X =
219.1267
我真的糊涂了,在212+2左右求值,怎么是219,而在212+3处求却是212.
诸如此类的问题,不知道为什么啊
请高手赐教,谢谢
附:我自己修改的程序,基本想法就是当步长不够时ÿ