//
// algorithme de gradient à pas optimal
// cas n=2 avec trace de contours
//
A=[2,1;1,3];b=[1;2]
//
function y=f(x)
    y=1/2*(A*x)'*x-b'*x
endfunction
x1=linspace(-5,5,100)
x2=linspace(-5,5,100)
z=zeros(100,100)
//
for i=1:100
    for j=1:100
     z(i,j)=f([x1(i);x2(j)])
    end    
end
contour(x1,x2,z,50)
//
function[Utot,nb_iter,residu]=GPObis(A,b,u0,epsilon,max_iter)
nb_iter=0
u=u0
Utot=[u];
residu=norm(A*u-b)    
while (nb_iter<max_iter)&(residu>epsilon)    
 d=A*u-b
 rho= (d'*d)/((A*d)'*d)  
 u=u-rho*(A*u-b)
 Utot=[Utot,u];
 nb_iter=nb_iter+1
 residu=norm(A*u-b)
end   
endfunction 

[Utot,nb_iter,residu]=GPObis(A,b,[-4;0],1E-6,max_iter)
disp('valeur approchee du min (GPO):');disp(Utot(:,$))
disp('nbre d''iterations GPO:');disp(nb_iter)
disp('residu GPO');disp(residu)
plot(Utot(1,:),Utot(2,:))
