% doublesol03.m
% fd, 06 novembre 2006, 05 mars 2025 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   clear ; format long 

fprintf ('doublesol03 \n') ;
fprintf ('calcul de minima par un gradient a pas fixe \n') ;
fprintf ('J(x,y) = (y**2 - x**2  - y*x**2 )/2 + (x**3/3) + (x**4 + y**4)/4  \n') ;


n=105  ; 
dx = 1./100. ; 
x = zeros(3,3*n) ; y = x ; 
for j = 1:3*n ;
xx = -2.1 + j*dx ; x(1:1,j:j) = xx ;  
y(1:1,j:j) = xx**2 + xx - 1 ;   end ;
hold off 
plot (x(1:1,:), y(1:1,:) ,'k;;') ; hold on ; 
dy = dx/2 ; 
for j = 1:3*n ;
yy = (j-1)*dy ; y(2:2,j:j) = yy ; 
x(2:2,j:j) = sqrt ( 2*yy*(1+yy*yy)) ; 
x(3:3,j:j) = -sqrt ( 2*yy*(1+yy*yy)) ; end 
plot (x(2:2,:), y(2:2,:) ,'b;;') ; 
plot (x(3:3,:), y(2:2,:) ,'b;;') ;
axis ( [ -3.5 , 3.5 , -1.5 , 1.7 ] ) ; %% , 'square' ) ;

title ('les solutions optimales sont aux points d intersection') ;
print('03a-minimisation-non-convexe', '-djpg','-S891,630');
pause (1) 



%
x0 = -3 ; y0 = 0.5 ; ro = .06 ; 
x = x0 ; y = y0 ; 
plot ( x , y , '*r;;' ) ; 
for j=1:50 ; 
ggx = -x -x*y + x**2 +x**3 ; 
ggy = -.5*x**2 +y + y**3 ; 
xn = x - ro*ggx ; yn=y - ro*ggy  ; 
plot ( xn , yn , '*r;;' ) ; 
plot ( [ x xn] , [y yn] , 'r;;' ) ; 
x=xn ; y=yn ;
end ;
pause (1) 

fprintf ('\n premier point de minimum (rouge) \n') , x , y 
  fprintf ('gradient au point de minimum \n') , ggx , ggy  
fprintf ('valeur de la fonction au point de minimum  \n')
 jj= .5*(y**2 - x**2  - y*x**2) + (x**3/3) + (x**4 + y**4)/4 
fprintf ('valeurs propres de la matrice heissienne  \n')
  j2 = [-1+y+2*x+3*x**2 , -x ; -x , 1+3*y**2 ] ; vp1 = eig(j2)(1) ,  vp2 = eig(j2)(2)
fprintf ('la matrice hessienne a bien deux valeurs propres positives  \n \n')



x0 = 3 ; y0 = 0 ; ro = .06 ; 
x = x0 ; y = y0 ; 
plot ( x , y , '*m;;' ) ; 
for j=1:70 ; 
ggx = -x -x*y + x**2 +x**3 ; 
ggy = -.5*x**2 +y + y**3 ; 
xn = x - ro*ggx ; yn=y - ro*ggy  ; 
plot ( xn , yn , '*m;;' ) ; 
plot ( [ x xn] , [y yn] , 'm;;' ) ; 
x=xn ; y=yn ;
end ;

title ('iterations de l algorithme de gradient à pas fixe') ;
print('03b-minimisation-non-convexe', '-djpg','-S891,630');


fprintf ('\n second point de minimum (magenta)\n') , x , y 
  fprintf ('gradient au point de minimum \n') , ggx , ggy  
fprintf ('valeur de la fonction au point de minimum  \n')
 jj= .5*(y**2 - x**2  - y*x**2) + (x**3/3) + (x**4 + y**4)/4 
fprintf ('valeurs propres de la matrice heissienne  \n')
  j2 = [-1+y+2*x+3*x**2 , -x ; -x , 1+3*y**2 ] ; vp1 = eig(j2)(1) ,  vp2 = eig(j2)(2)
fprintf ('la matrice hessienne a bien deux valeurs propres positives  \n')
fprintf ('ce second point de minimum est un minimum relatif \n')









