0001 function [ x,k ] = Newton_Raphson( f,initial,tol,max )
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 if tol<=0;
0014 error('tolerance must be positive');
0015 elseif max<=0;
0016 error('maximum number of iterations must be positive');
0017 elseif isa(f,'sym');
0018 df = diff(f);
0019 f = matlabFunction(f);
0020 df = matlabFunction(df);
0021 elseif isa(f,'double');
0022 [n,m]=size(f);
0023 if n~=1 && m~=1;
0024 error(['input must be a symbolic function or vector holding ',...
0025 'polynomial coefficients']);
0026 else
0027 v=poly2sym(f);
0028
0029 df = diff(v);
0030 f=matlabFunction(v);
0031
0032 df = matlabFunction(df);
0033 end
0034 else
0035 error(['input must be a symbolic function or vector holding ',...
0036 'polynomial coefficients']);
0037 end
0038
0039
0040 x=zeros(max,1);
0041 x(1)=initial;
0042 fx=feval(f,x(1));
0043 divx=feval(df,x(1));
0044 k=2;
0045 l=0;
0046 d0=0;
0047
0048 while abs(fx)>tol && k<=max
0049
0050 x(k)=x(k-1)-fx/divx;
0051
0052 test=find(x(1:k-1)==x(k));
0053 if isempty(test)==0;
0054
0055
0056 disp('algorithm fell into infinite loop');
0057 x=x(1:k); return;
0058 end
0059
0060 d1=abs(x(k)-x(k-1));
0061 if d1>d0;
0062 l=l+1;
0063 if l>20;
0064 disp('distance between succesive iterates is increasing');
0065 x=x(1:k); return;
0066 end
0067 else
0068 l=0;
0069 end
0070 d0=d1;
0071
0072 fx=feval(f,x(k));
0073 divx=feval(df,x(k));
0074
0075 if abs(divx)<1e-12;
0076 disp('denominator vanishes');
0077 x=x(1:k); return;
0078 end
0079
0080 k=k+1;
0081 end
0082
0083 if k==max+1;
0084 disp('maximum number of iterations reached');
0085 end
0086 x=x(k-1);
0087
0088 end