模拟圆盘或圆形的波浪

  • 本文关键字:模拟 function matlab
  • 更新时间 :
  • 英文 :


当我在选择波浪模拟的圆盘视图或圆形视图选项时运行此代码时,遇到了一个错误。随附代码和错误。我认为这部分代码中存在一些问题,通常在fzero函数中。任何帮助都会很棒。

代码:

function z = bjzeros(n,k)
% BJZEROS  Zeros of the Bessel function.
% z = bjzeros(n,k) is the first k zeros of besselj(n,x)
% delta must be chosen so that the linear search can take
% steps as large as possible 
delta = .99*pi;
Jsubn = inline('besselj(n,x)''x','n');
a = n+1;
fa = besselj(n,a);
z = zeros(1,k);
j = 0;
while j < k
b = a + delta;
fb = besselj(n,b);
if sign(fb) ~= sign(fa)
j = j+1;
z(j) = fzerotx(Jsubn,[a b],n);
end
a = b;
fa = fb;
end

错误:

未定义类型为"inline"的输入参数的函数"fzerotx"。

waves>中的错误;bjzeros(292线(

z(j) = fzerotx(Jsubn,[a b],n);

waves(第137行(错误

mu = [bjzeros(0,2) bjzeros(1,2)];

函数声明和语法

不能声明fzerotx()函数。您可以按照下面的文件结构在同一目录中创建所需的M-文件/函数。另一个小错误可能是由于缺少逗号引起的,我通过更改行来消除错误:

Jsubn = inline('besselj(n,x)''x','n');

Jsubn = inline('besselj(n,x)','x','n');

文件1:主文件/函数调用→[min.m]

mu = [bjzeros(0,2) bjzeros(1,2)];

文件2:bjzeros()函数→[bjzeros.m]

function z = bjzeros(n,k)
% BJZEROS  Zeros of the Bessel function.
% z = bjzeros(n,k) is the first k zeros of besselj(n,x)
% delta must be chosen so that the linear search can take
% steps as large as possible 
delta = .99*pi;
Jsubn = inline('besselj(n,x)','x','n');
a = n+1;
fa = besselj(n,a);
z = zeros(1,k);
j = 0;
while j < k
b = a + delta;
fb = besselj(n,b);
if sign(fb) ~= sign(fa)
j = j+1;
z(j) = fzerotx(Jsubn,[a b],n);
end
a = b;
fa = fb;
end
end

文件3:fzerotx()函数→[fzerotx.m]

函数参考:MATLAB:FZERO 的教科书版本

function b = fzerotx(F,ab,varargin)
%FZEROTX  Textbook version of FZERO.
%   x = fzerotx(F,[a,b]) tries to find a zero of F(x) between a and b.
%   F(a) and F(b) must have opposite signs.  fzerotx returns one 
%   end point of a small subinterval of [a,b] where F changes sign.
%   Arguments beyond the first two, fzerotx(F,[a,b],p1,p2,...),
%   are passed on, F(x,p1,p2,..).
%
%   Examples:
%      fzerotx(@sin,[1,4])
%      F = @(x) sin(x); fzerotx(F,[1,4])
%   Copyright 2014 Cleve Moler
%   Copyright 2014 The MathWorks, Inc.
% Initialize.
a = ab(1);
b = ab(2);
fa = F(a,varargin{:});
fb = F(b,varargin{:});
if sign(fa) == sign(fb)
error('Function must change sign on the interval')
end
c = a;
fc = fa;
d = b - c;
e = d;
% Main loop, exit from middle of the loop
while fb ~= 0
% The three current points, a, b, and c, satisfy:
%    f(x) changes sign between a and b.
%    abs(f(b)) <= abs(f(a)).
%    c = previous b, so c might = a.
% The next point is chosen from
%    Bisection point, (a+b)/2.
%    Secant point determined by b and c.
%    Inverse quadratic interpolation point determined
%    by a, b, and c if they are distinct.
if sign(fa) == sign(fb)
a = c;  fa = fc;
d = b - c;  e = d;
end
if abs(fa) < abs(fb)
c = b;    b = a;    a = c;
fc = fb;  fb = fa;  fa = fc;
end

% Convergence test and possible exit
m = 0.5*(a - b);
tol = 2.0*eps*max(abs(b),1.0);
if (abs(m) <= tol) | (fb == 0.0)
break
end

% Choose bisection or interpolation
if (abs(e) < tol) | (abs(fc) <= abs(fb))
% Bisection
d = m;
e = m;
else
% Interpolation
s = fb/fc;
if (a == c)
% Linear interpolation (secant)
p = 2.0*m*s;
q = 1.0 - s;
else
% Inverse quadratic interpolation
q = fc/fa;
r = fb/fa;
p = s*(2.0*m*q*(q - r) - (b - c)*(r - 1.0));
q = (q - 1.0)*(r - 1.0)*(s - 1.0);
end;
if p > 0, q = -q; else p = -p; end;
% Is interpolated point acceptable
if (2.0*p < 3.0*m*q - abs(tol*q)) & (p < abs(0.5*e*q))
e = d;
d = p/q;
else
d = m;
e = m;
end;
end

% Next point
c = b;
fc = fb;
if abs(d) > tol
b = b + d;
else
b = b - sign(b-a)*tol;
end
fb = F(b,varargin{:});
end

使用MATLAB R2019b运行

相关内容

  • 没有找到相关文章

最新更新