Чтобы изучить MATLAB, я работаю над программой, которая находит корень нуля, используя метод Secant. Ниже моего кода:
function [zero, x_vector] = secant_method(fx, x1, x2, nmax, tol)
%function that tries to find root of given function using the secant method.
%Mandatory inputs: FX is the function to be evaluated, X1 is first input
%value of the function, X2 is second input value of the function.
%Optional inputs: NMAX is maximum number of iterations (default = 5000), tol
%is maximum tolerance (default = 1e-4).
%Outputs: ZERO is the root of the function within the tolerance or after
%the maximum iterations has been reached, X_VECTOR is a vector of all
%consecutive evaluted inputs of the function.
%code by Steven
if ~exist('tol')
tol = 1e-4;
end
if ~exist('nmax')
nmax = 5000;
end
y_vector = [];
x_vector = [];
x_vector(1)=x1;
x_vector(2)=x2;
diff=tol+1; %this ensures at least one iteration will take place
i=1;
while diff > tol && i < (nmax)
i = i+1;
%Creating new straight line from two previous coordinates, using the conventional
% y=ax+b for paramter notation.
y_vector(i-1) = feval(fx,x_vector(i-1));
y_vector(i) = feval(fx,x_vector(i));
a = (y_vector(i)-y_vector(i-1))/(x_vector(i)-x_vector(i-1));
b = y_vector(i)-a*x_vector(i);
x_vector(i+1) = -b/a;
diff = abs(x_vector(i+1)-x_vector(i));
end
if i == (nmax) && diff > tol
fprintf(['Function stopped without converging to the desired tolerance\n',...
'because the number of maximum iterations was reached.']);
end
zero = x_vector(i+1);
return
Теперь для большинства входов код работает нормально. Как пример
secant_method('sin', 1, 5, 50, 1e-10) = 3.141592653589793
, который достаточно близок к pi
.
Но с некоторыми входными данными я не понимаю, почему код возвращаетчто оно делает. Например,
secant_method('sin', -8, 12, 500, 1e-10) = 2.002170932439574e+30
, но sin(2.002170932439574e+30)= 0.019481942752609
, который не очень близок к 0
.
Любые идеи о том, почему это происходит или где я ошибаюсь, оченьоценили.