
function [x,r,it]=ipower17(A,a=0,tol=1e-12,x0=randn(columns(A),1))
%metoda potegowa odwrotna dla macierzy  symetrycznej z parametrem 
%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: 
%M=11;[Q,R]=qr(randn(M+1,M+1)); A=Q*diag([l1,1:M])*Q';[x,r,it]=ipower17(A)
%[r-1,norm(x-Q(:,2)),norm(x+Q(:,2))] %blad przyblizenia wartoci i wektora wlasnego 
%M=11;[Q,R]=qr(randn(M+1,M+1)); A=Q*diag([l1,1:M])*Q';[x,r,it]=ipower17(A,7.01)
%[r-7,norm(x-Q(:,8)),norm(x+Q(:,8))] %blad przyblizenia wartoci i wektora wlasnego  




A=A-a*eye(size(A));
x=x0/norm(x0);
Ax=A\x;
it=0;
r=x'*Ax;r=1/r+a;
x=Ax/norm(Ax);;
it++;
Ax=A\x;
rp=r;
r=x'*Ax;r=1/r+a;
x=Ax/norm(Ax);;
Reer=abs(r-rp);
 while(Reer>tol)
 it++;
 Ax=A\x;
 rp=r;
 r=x'*Ax;r=1/r+a;%x'*Ax to iloraz Raylegha dla (A-aI)^{-1}
 x=Ax/norm(Ax);
 Reer=abs(r-rp);
 end

end
