MATLAB: Norm of step in fsolve

complex rootsfsolvenorm of step

Hi,
I have yet another fsolve question. Norm of step in fsolve seems to be able to show me false roots (which i have far too many). Is it possible to adjust the code so that it will continue to keep searching for roots until norm of step is<eps. I have tried to explain the problem more in detail below;
myfun = @det_sine_strip_Epol; % function
format long
r=3.5
options=optimset('Display','iter','MaxIter',3000,'MaxFunEvals',3000, 'TolFun', 1.0e-16, 'TolX',1.0e-16);
fsolve(myfun,r,options)
returns this;
which is correct as
myfun(3.819451575438322 - 0.002164123209083i)= 1.784467423482892e-15 + 2.718518249093796e-16i
now if i change initial guess to 3.3, i have this;
which is not correct as
myfun(3.782640978692568 + 7.326316917663921i)=-6.194760250156455e-09 - 3.142629031397849e-09i
Thanks a lot.

Best Answer

So I have found that my own root finder with improvement based on Newton-Raphson method with numerical approximations to the derivative works way better. Here is the code;
%


% Newton-Raphson method with numerical approximations to the derivative.
%
function [x0,flag] = newton_root(myfun,x0)
maxit = 15;
tol = 1.0e-15;
err = 100;
icount = 0;
xold =x0;
%--- search rooth from x0-range to x0+range---
check=x0;
range=0.2;
while (err > tol && icount <= maxit)
icount = icount + 1;
flag=0;
f = myfun(xold);
h = min(0.0001*xold,0.0001);
fp = myfun(xold+h);
fn = myfun(xold-h);
df = (fp - fn)/(2*h);
xnew = xold - f/df;
if ((check-range-xnew)*(xnew-check-range) < 0.0)
% fprintf(1,'Sorry. You jumped out of interval');
% fprintf(1,'The final value of x was %e \n', x0);
flag=1;
break
end
err = abs((xnew-xold)/xnew);
%fprintf(1,'icount = %i xold = %e f = %e df = %e xnew = %e err = %e \n',icount, xold, f, df, xnew, err);
%fprintf(1,'%i %e %e %e %e %e \n',icount, xold, f, df, xnew, err);
xold = xnew;
end
%
x0 = xnew;
if (icount >= maxit)
% you ran out of iterations
% fprintf(1,'Sorry. You did not converge in %i iterations.\n',maxit);
% fprintf(1,'The final value of x was %e \n', x0);
flag=2;
end
Related Question