

function [x,r,it]=power17(A,tol=1e-12,x0=randn(columns(A),1))
%metoda potegowa dla macierzy symetrycznej
%x(k+1)=Ax(k)/||A*x(k)||_2
%warunek stopu kolejne ilorazy Rayleigha roznia sie o mniej niz zadana tolerancja TOL
%INPUT 
%A diagonalizowalna (symetryczna)
%tol - tolerancja - domyslnie 10^(-12)
%x0 - domyslnie losowy
%OUTPUT
%x - wektor wlasny dla w.w. (przyblizenie) 
%r - wartosci wlasnej (przyblizenie)
%Przyklad: 
%l1=20;M=10;[Q,R]=qr(randn(M+1,M+1)); A=Q*diag([l1,1:M])*Q';[x,r,it]=power17(A)
%[r-l1,norm(x-Q(:,1)),norm(x+Q(:,1))] %blad przyblizenia wartoci i wektora wlasnego 


x=x0/norm(x0);
Ax=A*x;
it=0;
r=x'*Ax;
x=Ax/norm(Ax);;
it++;
Ax=A*x;
rp=r;
r=x'*Ax;
x=Ax/norm(Ax);;
Reer=abs(r-rp);
 while(Reer>tol)
 it++;
 Ax=A*x;
 rp=r;
 r=x'*Ax;
 x=Ax/norm(Ax);
 Reer=abs(r-rp);
 end

end
