% opti5.m
% fd, 14  janvier 2006, 03 mars 2025.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% xlabel (' opti5. Optimisation a deux variables sans contrainte ; \
%%% methode de Newton en fin d algorithme   ') ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear ; format long

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

x0 = -.9 ; y0 = 1.2 ;

niter = 20 
rho = 1 ; x = x0 ; y = y0 ; 


xplot = zeros(niter+1,1) ;  yplot = zeros(niter+1,1) ;
xplot(1,1) = x0 ; yplot(1,1) = 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 ; 


hold off 
plot (xplot(1:1,1) , yplot(1:1,1) ,'ob;initialisation;') ; hold on
plot ( xplot(:,1) , yplot(:,1) ,'*-k;20 iterations de gradient a pas optimal;' ) ; 
title ('minimisation de la fonction de Rosenbrock ; gradient a pas optimal') ;
plot  (1 , 1 ,'*r;minimum de la fonction de Rosenbrock;') ; 
axis ( [ -1.2 ,     1.2  , -.15   , 1.31 ]) ; 
print('05a-rosenbrock-gradient-a-pas-optimal', '-djpg','-S891,630'); hold off 
pause (.7) ; 

niternew = 5  
xplotnew = zeros(niternew+1,1) ;  yplotnew = zeros(niternew+1,1) ;
xplotnew(1,1) = x ; yplotnew(1,1) = y ;


for j=1:niternew ; 
xx(1:1,1)=x ; yy(1:1,1)=y ; 
d2f=zeros(2,2) ; bb=zeros(2,1) ; 
toto=rosen(x,y); ff=toto(1:1,1) ; bb(1:1,1) = toto(2:2,1) ; bb(2:2,1)=toto(3:3,1) ; 
d2f(1:1,1:1) =  toto(4:4,1) ;
d2f(1:1,2:2) =  toto(5:5,1) ;
d2f(2:2,1:1) =  toto(5:5,1) ;
d2f(2:2,2:2) =  toto(6:6,1) ;
d2f ;  bb ; 
cc= d2f \ bb  ;  d2f*cc - bb ; 
x1=x-cc(1:1,1) ;     y1=y-cc(2:2,1)  ; 
xplotnew(j+1,1) = x1 ; yplotnew(j+1,1) = y1 ;

err = sqrt( (x1-x)**2 + (y1-y)**2 ) 
x=x1 ; y=y1 ; end ;

plot ( xplot(:,1) , yplot(:,1) ,'*-k;20 iterations de gradient a pas optimal;' ) ; hold on 
plot ( xplotnew(:,1) , yplotnew(:,1) ,'*-m;5 iterations de Newton;' ) ; 
title ('minimisation de la fonction de Rosenbrock ; Newton en fin d algorithme') ;
plot  (1 , 1 ,'*r;minimum de la fonction de Rosenbrock;') ; 
axis ( [ .5 , 1.21 , .4 , 1.21 ]) ;
print('05b-rosenbrock-gradient-a-pas-optimal-et-newton', '-djpg','-S891,630') ; 
axis ( [ .5 , 1.21 , .4 , 1.21 ]) ; pause (.7) ;

axis ( [ .95 ,     1.05  , .9   , 1.1 ]) ; 
print('05c-rosenbrock-gradient-a-pas-optimal-et-newton', '-djpg','-S891,630') ;
axis ( [ .95 ,     1.05  , .9   , 1.1 ]) ;   pause (.7) ;

axis ( [ .995 ,     1.005  , .99   , 1.01 ]) ;
print('05d-rosenbrock-gradient-a-pas-optimal-et-newton', '-djpg','-S891,630') ; 
axis ( [ .995 ,     1.005  , .99   , 1.01 ]) ; pause (.7) ;
 
axis ( [ .9995 ,    1.0005 ,    .999  ,    1.001 ]) ;
print('05e-rosenbrock-gradient-a-pas-optimal-et-newton', '-djpg','-S891,630') ;
axis ( [ .9995 ,    1.0005 ,    .999  ,    1.001 ]) ; pause (.7) ;

axis ( [ .99995 ,   1.00005 ,   .9999  ,   1.0001 ]) ; 
print('05f-rosenbrock-gradient-a-pas-optimal-et-newton', '-djpg','-S891,630') ; 
axis ( [ .99995 ,   1.00005 ,   .9999  ,   1.0001 ]) ;  pause (.7) ; 

hold off 
plot (xplot(1:1,1) , yplot(1:1,1) ,'ob;initialisation;') ; hold on
plot ( xplot(:,1) , yplot(:,1) ,'*-k;20 iterations de gradient a pas optimal;' ) ;
plot ( xplotnew(:,1) , yplotnew(:,1) ,'*-m;5 iterations de Newton;' ) ; 
title ('minimisation de la fonction de Rosenbrock ; Newton en fin d algorithme') ;
plot  (1 , 1 ,'*r;minimum de la fonction de Rosenbrock;') ; 
axis ( [ -1.2 ,     1.2  , -.15   , 1.31 ]) ; 
print('05g-rosenbrock-gradient-a-pas-optimal', '-djpg','-S891,630'); 
axis ( [ -1.2 ,     1.2  , -.15   , 1.31 ]) ; hold off 


