贝塞尔 EVP 和 fzero

计算科学 matlab 非线性方程 特殊功能
2021-12-16 01:57:44

我正在尝试解决特征值问题 微分方程是贝塞尔方程。解由第一类贝塞尔函数y(x)=J_\lambda(x)给出。第 2 类贝塞尔函数因其在x=0处的奇异性而被省略。特征值λ必须使用x=1处的边界条件来确定。使用恒等式 J'_\lambda(x)=\frac{1}{2}\left(J_{\lambda-1}\left(x\right)-J_{\lambda+1}\left(x\ right)\right) x=1 处的边界条件可以改写为

x2y+xy+x2y=λ2y,x(0,1),y(0)=0,y(1)=y(1)
y(x)=Jλ(x)x=0λx=1
Jλ(x)=12(Jλ1(x)Jλ+1(x))
x=1
Jλ1(1)2Jλ(1)Jλ+1(1)=0.
现在我想使用 MATLAB/GNU Octave 的 fzero 例程用上面的等式确定λ代码如下。

%% initial guess
xguess=1;
%% function handle
f=@(l) besselj(l-1,1)-2*besselj(l,1)+besselj(l+1,1)
%% set tolerance
opts=optimset('TolX',1e-12);
%% determine zero
xzero=fzero(f,xguess,opts);

如果您绘制函数 f, click here,您会发现大多数零都在<x<0中。

要获得排序序列λk+1<λk,我想仅在负x方向上从“最后一个”零搜索到“下一个”零。有没有办法在 fzero 例程中实现这一点?

预先感谢!

2个回答

正如您在, log|f(λ)|

f(λ)=Jλ1(1)2Jλ(1)Jλ+1(1),

在此处输入图像描述

是非常规则的,并且大约等于(从开始,是一个例外)。λkkk0λ0=1.23219

因此,获得第个特征值()的方法是将根括号并在该区间内使用求解器(它接受括号区间作为初始猜测并保持在该区间内)。kk1[k12,k+12]fzero

请注意,函数的大小增长非常快(类似于),因此一旦函数变得非常大(对于大),使用可能会更好作为一个近似值。(2λ/e)λsinπλkλk=k

这是我现在使用的代码。

kmax=5;
lambda=zeros(kmax,1);
%% function handle
f=@(l) besselj(l-1,1)-2*besselj(l,1)-besselj(l+1,1);
%% set tolerance
opts=optimset('TolX',1e-12);
%% compute first positive eigenvalue
lambda(1)=fzero(f,[0.5,1.5],opts);
%% compute negative eigenvalues
for k=1:(kmax-1)
  [lambda(k+1),~,fl]=fzero(f,[-k-0.5,-k+0.5],opts);
  if not(fl==1)
    error('iteration    did     not     convert.')
  end
end

顺便说一句,我想用它来验证我的有限差分法。