%metodo del gradiente
clear all
close all
clc

A=[4 1; 1 1];
b=sum(A,2);

Nmax=100;
tol=sqrt(eps)*(1+norm(b));
[x,e,k]=MetodoDelGrad(A,b,Nmax,tol);
k=linspace(1,k,k);

plot(log10(e),'r')
hold on
plot(k,log10(e(k)),'*b')
legend('Comportamento dell''errore', 'corrisponn iterazione-errore')
xlabel('Numero di iterazioni','fontname','Helvetica','fontsize',11)
ylabel('Errore','fontsize',11);

function [x,e,k] = MetodoDelGrad(A,b,Nmax,tol)

%metodo di iterazione del gradiente coniugato
n=length(b);
x0=zeros(n,1);
r=A*x0 -b;
e(1)=norm(r);
a=r'*r/(r'*A*r);
k=1;

while k<Nmax && e(k)> tol
    x=x0 -a*r;
    k=k+1;
    r=A*x-b;
    e(k)=norm(r);
    a=r'*r/(r'*A*r);
    x0=x;
end

end