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

fprintf ('doublesol01 \n') ;
fprintf ('algorithme de Newton pour l annulation du gradient \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('02a-minimisation-non-convexe', '-djpg','-S891,630');
pause (1) 


%
x0 = -3 ; y0 = 0.5 ; ro = .5 ; 
x = x0 ; y = y0 ; 
plot ( x , y , '*r;;' ) ; 
for j=1:12 ;
if j>6 ; ro=1 ; end 

ff = [x**2 + x - y - 1 ; -.5*x**2 + y + y**3 ] ;
df = [ 2*x + 1 , -1 ; -x , 1 + 3*y**2 ] ;
h = -df \ ff ; 
xn = x + ro*h(1) ; yn=y + ro*h(2) ; 
plot ( xn , yn , '*r;;' ) ; 
plot ( [ x xn] , [y yn] , 'r;;' ) ; 
x=xn ; y=yn ;
end ;

fprintf ('\n premier point de minimum \n') , x , y 
  fprintf ('gradient au point de minimum \n') , gx=ff(1), gy=ff(2)  
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 

x0 = 3 ; y0 = -1 ; ro = .5 ; 
x = x0 ; y = y0 ; 
plot ( x , y , '-*r;;' ) ; 
for j=1:12 ;
if j>6 ; ro=1 ; end 

ff = [x**2 + x - y - 1 ; -.5*x**2 + y + y**3 ] ;
df = [ 2*x + 1 , -1 ; -x , 1 + 3*y**2 ] ;
h = -df \ ff ; 
xn = x + ro*h(1) ; yn=y + ro*h(2) ; 
plot ( xn , yn , '*r;;' ) ; 
plot ( [ x xn] , [y yn] , 'r;;' ) ; 
x=xn ; y=yn ;
end ;

fprintf ('\n second point de minimum \n') , x , y 
  fprintf ('gradient au point de minimum \n') , gx=ff(1), gy=ff(2)  
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 ('ce minimum est donc local \n')


title ('deux familles d iterations de Newton sous-relaxe') ;
print('02b-Newton-avec-relaxation', '-djpg','-S891,630');



