Прежде всего, я бы хотел уточнить, что это задание для школы, поэтому я не ищу решения.Я просто хочу, чтобы меня подтолкнули в правильном направлении.
Теперь о проблеме.
У нас есть код для нахождения корня многочлена с помощью деления пополам:
function [root, niter, rlist] = bisection2( func, xint, tol )
% BISECTION2: Bisection algorithm for solving a nonlinear equation
% (non-recursive).
%
% Sample usage:
% [root, niter, rlist] = bisection2( func, xint, tol )
%
% Input:
% func - function to be solved
% xint - interval [xleft,xright] bracketing the root
% tol - convergence tolerance (OPTIONAL, defaults to 1e-6)
%
% Output:
% root - final estimate of the root
% niter - number of iterations needed
% rlist - list of midpoint values obtained in each iteration.
% First, do some error checking on parameters.
if nargin < 2
fprintf( 1, 'BISECTION2: must be called with at least two arguments' );
error( 'Usage: [root, niter, rlist] = bisection( func, xint, [tol])' );
end
if length(xint) ~= 2, error( 'Parameter ''xint'' must be a vector of length 2.' ), end
if nargin < 3, tol = 1e-6; end
% fcnchk(...) allows a string function to be sent as a parameter, and
% coverts it to the correct type to allow evaluation by feval().
func = fcnchk( func );
done = 0;
rlist = [xint(1); xint(2)];
niter = 0;
while ~done
% The next line is a more accurate way of computing
% xmid = (x(1) + x(2)) / 2 that avoids cancellation error.
xmid = xint(1) + (xint(2) - xint(1)) / 2;
fmid = feval(func,xmid);
if fmid * feval(func,xint(1)) < 0
xint(2) = xmid;
else
xint(1) = xmid;
end
rlist = [rlist; xmid];
niter = niter + 1;
if abs(xint(2)-xint(1)) < 2*tol || abs(fmid) < tol
done = 1;
end
end
root = xmid;
%END bisection2.
Мы должны использовать этот код для нахождения n-го нуля функции Бесселя первого рода (J0 (x)).Довольно просто вставить диапазон, а затем найти искомый корень.Тем не менее, мы должны построить график зависимости Xn от n, и для этого нам понадобится вычислить большое количество корней по отношению к n.Поэтому для этого я написал следующий код:
bound = 1000;
x = linspace(0, bound, 1000);
for i=0:bound
for j=1:bound
y = bisection2(@(x) besselj(0,x), [i,j], 1e-6)
end
end
Я верил, что это сработает, но предоставляемые им корни не в порядке и продолжают повторяться.Проблема, которую я считаю, заключается в моем диапазоне, когда я называю бисекцию2.Я знаю, что [i, j] - не лучший способ сделать это, и я надеялся, что кто-то может направить меня в правильном направлении, как решить эту проблему.
Спасибо.