function [x r2]=Givens(A,b)
% Resolución de Ax=b mediante transformaciones de Givens
%
 [m,n]=size(A); x=zeros(n,1);
 for i=1:n                    % Factorización de A
    for k=i+1:m
       if 1+abs(A(k,i))==1, continue, end
       if abs(A(k,i))>=abs(A(i,i))
          t=A(i,i)/A(k,i); s=1/sqrt(1+t*t);
          c=s*t;
       else
          t=A(k,i)/A(i,i); c=1/sqrt(1+t*t);
          s=c*t;
       end
       A(i,i)=c*A(i,i)+s*A(k,i);
       q(i+1:n)=c*A(i,i+1:n)+s*A(k,i+1:n);
       A(k,i+1:n)=-s*A(i,i+1:n)+c*A(k,i+1:n);
       A(i,i+1:n)=q(i+1:n);
       q1=c*b(i)+s*b(k);      % Transformar b
       b(k)=-s*b(i)+c*b(k);
       b(i)=q1;
    end
 end
 for i=n:-1:1                 % Sustitución inversa
    x(i)=(b(i)-A(i,i+1:n)*x(i+1:n))/A(i,i);
 end
 r2=norm(b(n+1:m))^2;         % Residuos al cuadrado
end
