% mininewton04.m   
% fd, 30 juin 2026
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
clear , format long
   
printf("mininewton04 ; annulation du gradient avec un alggorihme de Newton \n"); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ff  = inline(".5*yy**2 - .5*xx**2  - .5*yy*xx**2 + xx**3/3. + .25*(xx**4 + yy**4)") ; 
dxf = inline("-xx -xx*yy + xx**2 + xx**3") ; 
dyf = inline("yy - .5*xx**2 + yy**3") ; 
   
printf("\n"); 

printf("on cherche les zeros de la fonction \n")
printf("   fff = (x**2 + x − y - 1 ,  -.5* x**2 + y + y**3 )"); 


xmin = -3;  xmax = 3. ; dx= .1 ; 
xxx = xmin:dx:xmax ;
nxxx = length(xxx)
yyy = xmin:dx:xmax ;
zzz = zeros(nxxx,nxxx) ;  
nvaleurs = 40 ; 

for i=1:nxxx
for j=1:nxxx
	zzz(i,j) = ff(xxx(i),yyy(j)) ; end ; end;
contour(xxx,yyy,zzz,nvaleurs) 
title ('isovaleurs de la fonction non quadratique') ;
pause (2) 

hold on ;

print('04a-resolution-newton', '-djpg','-S891,630'); 
	
hold on 

niter = 50
xx = -3. ; yy = .5 ;
xiter = zeros(niter+1,1) ; 
yiter = zeros(niter+1,1) ; 

rho = .06

for j=1:niter
xiter(j) = xx ;
yiter(j) = yy ;

valeur = ff(xx,yy) ; 
gx = dxf(xx,yy) ; gy = dyf(xx,yy) ;

xx = xx - rho*gx ;
yy = yy - rho*gy ;

end

xfinalg = xx
yfinalg = yy 
xiter(niter+1) = xx ;	yiter(niter+1) = yy ;    


title ('algorithme de gradient pour une fonction non quadratique') ;
plot (xiter, yiter, '*r;;' , xiter, yiter, 'r;;' ) 
axis ( [ xmin,xmax, xmin,xmax ])  
print('04b-resolution-newton', '-djpg','-S891,630'); 
pause (.5) ; hold on


omega = .8
nitnewt = 15	       


xiterN = zeros(nitnewt+1,1) ; 
yiterN = zeros(nitnewt+1,1) ; 

	       
xx = -3. ; yy = .5 ;
uu = fff(xx,yy) ;
  
for j=1:nitnewt
xiterN(j) = xx ;
yiterN(j) = yy ;

	
JJuu = dfff(xx,yy) ;
duu = -JJuu\uu ;
xx = xx + omega*duu(1,1) ;
yy = yy + omega*duu(2,1) ;
uu = fff(xx,yy) ;

end
xiterN(nitnewt+1) = xx ;
yiterN(nitnewt+1) = yy ;

xfinalN = xx
yfinalN = yy

uu = uu 
  
title ('algorithme de Newton pour le gradient de la fonction') ;
plot (xiterN, yiterN, '*b;Newton;' , xiterN, yiterN, 'b;;' ) 
axis ( [ xmin,-1, 0,2 ])  
print('04c-resolution-newton', '-djpg','-S891,630'); 

pause (2) ; hold off 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



contour(xxx,yyy,zzz,nvaleurs) 
title ('isovaleurs de la fonction non quadratique') ;
axis ( [ xmin,xmax, xmin,xmax ])  
pause (.5) 

hold on ;
xx = 3. ; yy = 0. ;
xiter = zeros(niter+1,1) ; 
yiter = zeros(niter+1,1) ; 

rho = .06

for j=1:niter
xiter(j) = xx ;
yiter(j) = yy ;

valeur = ff(xx,yy) ; 
gx = dxf(xx,yy) ; gy = dyf(xx,yy) ;

xx = xx - rho*gx ;
yy = yy - rho*gy ;

end

xfinalg = xx
yfinalg = yy 
xiter(niter+1) = xx ;	yiter(niter+1) = yy ;    


title ('algorithme de gradient et de Newton pour une fonction non quadratique') ;
plot (xiter, yiter, '*r;;' , xiter, yiter, 'r;;' ) 
axis ( [ xmin,xmax, xmin,xmax ])  
pause (.5) ; hold on

xx = 3. ; yy = 0. ;
uu = fff(xx,yy) ;
  
for j=1:nitnewt
xiterN(j) = xx ;
yiterN(j) = yy ;

	
JJuu = dfff(xx,yy) ;
duu = -JJuu\uu ;
xx = xx + omega*duu(1,1) ;
yy = yy + omega*duu(2,1) ;
uu = fff(xx,yy) ;

end
xiterN(nitnewt+1) = xx ;
yiterN(nitnewt+1) = yy ;

xfinalN = xx
yfinalN = yy

uu = uu 
  
title ('algorithme de Newton pour le gradient de la fonction') ;
plot (xiterN, yiterN, '*b;Newton;' , xiterN, yiterN, 'b;;' ) 
axis ( [ 0,2,-1, 1 ])  

print('04d-resolution-newton', '-djpg','-S891,630'); 

hold off 
