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

fprintf ('test6 \n') ;
fprintf ('probleme du central telephonique avec 5 points \n') ;
fprintf ('cas delicat avec 5 points ou la fonction n est pas differentiable \n') ;
clear ; format long


xa = -1 ; ya = -1 ; xb = 1 ; yb = -1 ;  xc = 1 ; yc = 1 ;
xd = -1 ; yd = 1 ;   xe = 0 ; ye = -.5 ;  
np = 5 ; 
noeud = zeros (2,np+1) ; 
noeud (1,1) = xa ;  noeud (2,1) = ya ; 
noeud (1,2) = xb ;  noeud (2,2) = yb ; 
noeud (1,3) = xc ;  noeud (2,3) = yc ; 
noeud (1,4) = xd ;  noeud (2,4) = yd ; 
noeud (1,5) = xe ;  noeud (2,5) = ye ; 
noeud (1,np+1) = xa ;  noeud (2,np+1) = ya ; 
xmin = 1000 ; ymin = xmin ; xmax = -xmin ; ymax = xmax ; 
for j = 1 : np ; 
xmin = min ( xmin , noeud(1:1,j:j)) ; 
ymin = min ( ymin , noeud(2:2,j:j)) ; 
xmax = max ( xmax , noeud(1:1,j:j)) ; 
ymax = max ( ymax , noeud(2:2,j:j)) ; 
end ; deltax = xmax - xmin ;  deltay = ymax - ymin ; 
xmin = xmin - .1*deltax ;  xmax = xmax + .1*deltax ; 
ymin = ymin - .1*deltay ;  ymax = ymax + .1*deltay ; 
hold off 
plot ( noeud(1:1,:)  ,  noeud(2:2,:)  , '*b;;' ,... 
       noeud(1:1,:)  ,  noeud(2:2,:)  , 'k;;' )
axis ( [ xmin xmax ymin ymax ]  , 'square' ) ;
title ('probleme du central telephonique avec cinq sommets') ;
print('09a-central-telephonique-5-sommets', '-djpg','-S891,630');
pause (1) 
 
hold on ; 
% n=arc(xa,ya,xb,yb) ; 
% n=arc(xb,yb,xc,yc) ; 
% n=arc(xc,yc,xa,ya) ;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        pb de minimisation 
xn = 1 ; yn = .5 ;  ro = .005 ; 
xn = 0.0876772622038967 ; 
yn = -0.220025693915497 ;  ro = .003 ; 
xn = 0.00130157769747496 ; 
yn = -0.442564356018160 ;  ro = .001 ;
xn = 0 ; yn = -0.487500860346205 ;  ro = .0005 ;
xn = 1 ; yn = .5 ;
ro = .005 
 
x0 = xn ; y0 = yn ; 

plot ( x0 , y0 , '*r;;') 
x = x0 ; y = y0 ; 

niter = 295 ; 
cout = zeros (1,niter) ; 
for k = 1:niter ; 
gx = 0 ; gy = 0 ; cout(1,k:k) = 0 ; 
for j = 1:np  ; 
apx = x - noeud(1:1,j:j)  ; 
apy = y - noeud(2:2,j:j) ; ap = sqrt(apx**2+apy**2) ; 
gx = gx + apx / ap ; gy = gy + apy / ap ;  
cout(1,k:k) = cout(1,k:k) + ap ; 
end 
xn = x - ro*gx ; yn = y - ro*gy ; 
plot ( xn , yn , '*r;;' , [x xn] , [y yn] , 'r;;') 
x=xn ; y = yn ; 
end ;

plot ( xn , yn , 'om;;' ) 
title ('gradient a pas fixe pour le probleme du central telephonique avec cinq sommets') ;
print('09b-central-telephonique-5-sommets', '-djpg','-S891,630');
pause (1) 

fprintf ('position qui minimise la somme des distances aux trois sommets \n') ;
xn , yn 

%%%%%%%%%%
fprintf ('zooms autour de la solution \n') ;
scale = .1 ; 
for k = 1:2 ; 
xmin = xn - scale ; ymin = yn - scale ;  
xmax = xn + scale ; ymax = yn + scale ;  
axis ( [ xmin xmax ymin ymax ]  , 'square' ) ;
scale = scale/10  ;

if k==1 ;
title ('zoom 1 autour de la solution optimale') ;
print('09c-gradient-pas-fixe-central-telephonique', '-djpg','-S891,630'); end 

if k==2 ;
title ('zoom 2 autour de la solution optimale') ;
print('09d-gradient-pas-fixe-central-telephonique', '-djpg','-S891,630'); end 

pause (1) end ;

fprintf ('l algorithme rebondit \n') ;
fprintf ('le gradient n existe pas pour la position optimale ! \n') ;

hold off ;
xmin = -.5 ; xmax = niter + .5  ; 
ymin = 5.65 ; ymax = 8.1 ; 


plot ( cout(1,:) , '*;;')
axis ( [ xmin xmax ymin ymax ]  ) ;
title ('fonction cout avec les iterations de l algorithme') ;
print('09e-cout-du-gradient-pas-fixe-central-telephonique', '-djpg','-S891,630'); 
