Originally Posted by

**nugiboy** Hi guys.

I've recently wrote this Function M-file to find the root of any function using the secant method. I have a problem though, in that whenever i use the file on a function, i get the error

> In secant at 39

Warning: Divide by zero.

> In secant at 39

Warning: Divide by zero

> In secant at 39

Warning: Divide by zero.

Can anyone see why my file is doing this?

Here is the script:

function [x, iter] = secant( f, x0, x1, nmax, tol )

%SECANT Secant method for root finding.

% [X, ITER] = SECANT( F, X0, X1, NMAX, TOL ) finds a zero, X,

% of the function F(X) using the secant method. X0 and X1 are the

% initial values required for the secant method, NMAX is the

% maximum number of iterations allowed, and TOL is the convergence

% criterion. ITER is the number of iterations required.

% Test to make sure nmax and conv are valid.

if nmax < 1

error('nmax must be greater than 0')

end

if tol < eps

error('tol must be greater than or equal to eps')

end

% nmax >=1 and tol >= eps at this point.

%Set initial valies for x, iter and err.

x = x1;

iter = 0;

err = abs(x1-x0);

% The invariant for this loop is "iter is the number of iterations

% completed at the start of the loop".

% At the start of the loop, x0 and x1 are the first two points which will be

% used to extrapolate a secant line to the next value of x. The current

% approximation to the solution (after 0 iterations) is x = x1 and err is an

% upper bound for the error in x.

while err > tol

% Test for maximum number of iterations.

if iter == nmax;

error('convergence not achieved')

end

% Carry out one secant step.

fx1 = f(x1);

fx0 = f(x0);

x = x1 - (fx1*((x1 - x0)/(fx1 - fx0))); % Secant forumula

x1 = x0; % x1 is new value for x0

x = x1; % x is new value for x1

% Increment iter so that the invariant is preserved.

iter = iter + 1;

end

% Here, the while condition is false so err <= tol.

% From the loop invariant, iter is the number of iterations taken.

end