function [lambda,x,count,lastp0,resnorm] = newton(A,initlambda,trace) % Aufruf [lambda,x,count,lastp0,resnorm] = newton(A,initlambda,trace) % initlambda ist der Startwert % bei trace=1 werden alle N\"aherungswerte f\"ur lambda und p_0 % protokolliert % count ist die Anzahl der Newtonschritte % lastp0 ist der letzte Wert des charakteristischen Polynoms % bis auf einen Faktor ungleich null, siehe \"U10 % lambda ist der berechnete Eigenwert, x der Eigenvektor und % resnorm die 2-Norm von $(A- \lambda I)x/||x||$ } siz=size(A); if siz(1) ~= siz(2) error('newton hyman: matrix must be square'); end n=siz(1); n1=n+1; count=0; p=zeros(n1,1); lambda=initlambda; [p,dp]=hyman(A,lambda); cont=1; if trace==1 disp(['iter lambda charpol']); end while cont count=count+1; % compute correction damped newton method succ=0; sig=2; if trace==1 disp([num2str(count,'%4d'),' ',num2str(lambda,'%23.16e'),' ',num2str(p(1),'%23.16e')]); end if abs(dp(1)) <=eps*abs(p(1)) disp(['newton hyman : small derivative , stop ']); break; end while succ==0 sig=sig/2; nextlambda=lambda-sig*p(1)/dp(1); if nextlambda==lambda break; end [nextp,nextdp]=hyman(A,nextlambda); if abs(nextp(1)) <= (1-0.01*sig)*abs(p(1)) succ=1; oldlambda=lambda; lambda=nextlambda; end end if succ==0 break; end if abs(oldlambda-lambda)<= eps*(abs(lambda)+eps) cont=0; end p=nextp; dp=nextdp; end lastp0=p(1); x=p(2:n1); resnorm=norm(A*x-lambda*x);