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

fprintf ('test5 \n') ;
fprintf ('probleme du central telephonique ; cas convexe \n') ;

xa = -1 ; ya = -1 ; xb = 1 ; yb = -1 ;  xc = 1 ; yc = 1 ;
xd = -1 ; yd = 1 ;   xe = -1.3 ; 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('08a-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.453574325685468 ; 
yn = -0.176713861602633 ; 
xn = -0.607531617109685 ; 
yn = -0.275796974408503 ; 
xn = -0.623744888408760 ; 
yn = -0.288492786051397 ;  ro = .1 ;  
xn = -0.625744834186276 ; 
yn = -0.290098962942584 ; 


xn = 0  ; yn = 0  ;  ro = .03  
x0 = xn ; y0 = yn ; 
plot ( x0 , y0 , '*m;;') 
x = x0 ; y = y0 ; 

niter = 50 ; 
cout = zeros (1,niter) ;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        gradient a pas fixe 
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 , '*m;;' , [x xn] , [y yn] , 'm;;') 
x=xn ; y = yn ; 
end ;

plot ( xn , yn , 'om;;' ) 
title ('gradient a pas fixe pour le probleme du central telephonique avec cinq sommets') ;
print('08b-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:3 ; 
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('08c-gradient-pas-fixe-central-telephonique', '-djpg','-S891,630'); end 

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

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

pause (1) end ;

hold off ;
xmin = -.5 ; xmax = niter +.5 ; 
ymin = 6.65 ; ymax = 7.1 ; 


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

