% opti4.m
% fd, 14  janvier 2006, 03 mars 2025.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% xlabel (' opti4. Optimisation a deux variables sans contrainte ; \
%%% algorithme du gradient a pas optimal  ') ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear ; format long

'Rosenbrock = (x-1)**2 + 10*(x**2-y)**2' 

x0 = -.9 ; y0 = 1.2 ;

for lll = 1:4
if lll==1 ; niter = 10 ; end 
if lll==2 ; niter = 50 ; end 
if lll==3 ; niter = 100 ; end 
if lll==4 ; niter = 500 ; end 
if lll==5 ; niter = 1000 ; end 


niter 
xplot = zeros(niter+1,1) ;  yplot = zeros(niter+1,1) ;
xplot(1,1) = x0 ; yplot(1,1) = y0 ;



x = x0 ; y = y0 ; 
for j=1:niter ;

ff = rosen(x,y)(1:1,1) ; 
gx = rosen(x,y)(2:2,1) ; 
gy = rosen(x,y)(3:3,1) ;  

%%%%%%%%%%%%%%       calcul de rhomax
  rho=1 ; 
x1=x-rho*gx ;   y1=y-rho*gy ; toto=rosen(x1,y1); ff1=toto(1:1,1) ; ff ; ff1 ; 
for k=1:10 
  rhomax=rho ; 
if (ff1<ff) ;  rho=1.1*rho ; 
x1=x-rho*gx ;   y1=y-rho*gy ; toto=rosen(x1,y1); ff1=toto(1:1,1) ;  ff ;  ff1 ;  end ;  end ; 
rhomax ; 

  
% calcul de rho : optimisation a une variable  
rho=min1d(x,y,gx,gy,rhomax) ; 
x1=x-rho*gx ;   y1=y-rho*gy ;
xplot(j+1,1) = x1 ; yplot(j+1,1) = y1 ;
x = x1 ; y = y1 ; 
end ; 

if lll==1 ; 
hold off 
plot (xplot(1:1,1) , yplot(1:1,1) ,'ob;initialisation;') ; hold on
plot ( xplot(:,1) , yplot(:,1) ,'*-k;10 iterations;' ) 
title ('minimisation de la fonction de Rosenbrock ; gradient a pas optimal') ;
plot  (1 , 1 ,'*b;minimum de la fonction de Rosenbrock;') ; 
axis ( [ -1.2 ,     1.2  , -.15   , 1.31 ]) ; pause (.3) ; 
print('04a-rosenbrock-gradient-a-pas-optimal', '-djpg','-S891,630'); 
hold off ; end

if lll==1 ; 
hold off 
plot (xplot(1:1,1) , yplot(1:1,1) ,'ob;initialisation;') ; hold on
plot ( xplot(:,1) , yplot(:,1) ,'*-k;10 iterations;' ) ; 
title ('minimisation de la fonction de Rosenbrock ; gradient a pas optimal') ;
plot  (1 , 1 ,'*r;minimum de la fonction de Rosenbrock;') ; 
axis ( [ .75     1.06  , .51    , 1.16 ]) ; pause (.3) ; 
print('04b-rosenbrock-gradient-a-pas-optimal', '-djpg','-S891,630'); hold off 
end

if lll==2 ; 
hold off 
plot (xplot(1:1,1) , yplot(1:1,1) ,'ob;initialisation;') ; hold on
plot ( xplot(:,1) , yplot(:,1) ,'*-k;50 iterations;' ) ; 
title ('minimisation de la fonction de Rosenbrock ; gradient a pas optimal') ;
plot  (1 , 1 ,'*r;minimum de la fonction de Rosenbrock;') ; 
axis ( [ .75     1.06  , .51    , 1.16 ]) ; pause (.3) ; 
print('04c-rosenbrock-gradient-a-pas-optimal', '-djpg','-S891,630'); hold off 
end

if lll==3 ; 
hold off 
plot (xplot(1:1,1) , yplot(1:1,1) ,'ob;initialisation;') ; hold on
plot ( xplot(:,1) , yplot(:,1) ,'*-k;100 iterations;' ) ; 
title ('minimisation de la fonction de Rosenbrock ; gradient a pas optimal') ;
plot  (1 , 1 ,'*r;minimum de la fonction de Rosenbrock;') ; 
axis ( [ .75     1.06  , .51    , 1.16 ]) ; pause (.3) ; 
print('04d-rosenbrock-gradient-a-pas-optimal', '-djpg','-S891,630'); hold off 
end


if lll==4 ; 
hold off 
plot (xplot(1:1,1) , yplot(1:1,1) ,'ob;initialisation;') ; hold on
plot ( xplot(:,1) , yplot(:,1) ,'*-k;500 iterations;' ) ; 
title ('minimisation de la fonction de Rosenbrock ; gradient a pas optimal') ;
plot  (1 , 1 ,'*r;minimum de la fonction de Rosenbrock;') ;  
axis ( [ .75     1.06  , .51    , 1.16 ]) ; pause (.3) ; 
print('04e-rosenbrock-gradient-a-pas-optimal', '-djpg','-S891,630'); hold off 
end

if lll==5 ; 
hold off 
plot (xplot(1:1,1) , yplot(1:1,1) ,'ob;initialisation;') ; hold on
plot ( xplot(:,1) , yplot(:,1) ,'*-k;1000 iterations;' ) ; 
title ('minimisation de la fonction de Rosenbrock ; gradient a pas optimal') ;
plot  (1 , 1 ,'*r;minimum de la fonction de Rosenbrock;') ; 
axis ( [ .75     1.06  , .51    , 1.16 ]) ; pause (.3) ; 
print('04f-rosenbrock-gradient-a-pas-optimal', '-djpg','-S891,630'); hold off 
end






end 
