Télécharger gcmma_00.dgibi

Retour à la liste

Numérotation des lignes :

  1. * fichier : mma_00.dgibi
  2. ************************************************************************
  3. ************************************************************************
  4.  
  5. ************************************************************************
  6. * Test de l'opérateur MMA : Méthode des Asymptotes Mobiles *
  7. * Globalement Convergente *
  8. * Application à une fonction à 1 variable et sans contraintes *
  9. * *
  10. * Le problème s'écrit : *
  11. * Minimiser : f0(x) = (x-50)² + 25 *
  12. * sur x *
  13. * avec : 1 <= x <= 100 *
  14. * *
  15. * La solution (évidente) est : x = 50 *
  16. ************************************************************************
  17.  
  18. * Options
  19. OPTI 'ECHO' 0 ;
  20. itrac = FAUX ;
  21.  
  22. * Procédure pour calculer f0 ainsi que la derivée partielle df0/dx
  23. DEBP FONC a*'LISTREEL' ;
  24. x = EXTR a 1 ;
  25. f = ((x - 50.) ** 2) + 25. ;
  26. df = 2. * (a - 50.) ;
  27. g = PROG 0. ;
  28. dgda = TABL ;
  29. dgda . 1 = PROG 0. ;
  30. FINP f df g dgda ;
  31.  
  32. * Solution de référence
  33. x1ref = 50. ;
  34. xref = PROG x1ref ;
  35. f0ref df0dxref fval0 dfdxref = FONC xref ;
  36. MESS 'Solution de reference' ;
  37. MESS ' x1 f0' ;
  38. MESS (CHAI 'FORMAT' '(F10.5)' x1ref /7 f0ref >3) ;
  39.  
  40. * Choix d'un point initial pour les inconnues
  41. x0 = PROG 1. ;
  42.  
  43. * Calcul de f0(x0), df0dx(x0), fval(x0), dfdx(x0)
  44. f0 df0dx fval dfdx = FONC x0 ;
  45.  
  46. * Initialisation de la table pour la MMA
  47. t = TABL ;
  48. t . 'X' = x0 ;
  49. t . 'XMIN' = 1. ;
  50. t . 'XMAX' = 100. ;
  51. t . 'F0VAL' = f0 ;
  52. t . 'DF0DX' = df0dx ;
  53. t . 'FVAL' = fval ;
  54. t . 'DFDX' = dfdx ;
  55. t . 'C' = PROG 1.E7 ;
  56. t . 'GC' = VRAI ;
  57.  
  58. * Itérations de la MMA
  59. x01 = EXTR x0 1 ;
  60. lx1 = PROG x01 ;
  61. lit = PROG 0. ;
  62. lf0 = PROG f0 ;
  63. f1 = EXTR fval 1 ;
  64. li = PROG (MAXI 0. f1) ;
  65. MESS 'Optimisation par GC-MMA' ;
  66. MESS 'It sIt x1 f0 kktnorm' ;
  67. MESS (CHAI 'FORMAT' '(F10.5)' 0 0 /6 x01 >1 f0 >3) ;
  68. * Boucle d'optimisation
  69. REPE loop 20 ;
  70. * Appel à MMA
  71. lit = lit ET &loop ;
  72. * Boucle des sous itérations de la GCMMA
  73. REPE sloop 15 ;
  74. MMA t ;
  75. * Si le sous problème est conservatif
  76. * mise à jour des valeurs des fonctions et arret des sous itérations
  77. SI (t . 'CONSERV') ;
  78. xmma = t . 'X' ;
  79. f0 df0dx fval dfdx = FONC xmma ;
  80. t . 'F0VAL' = f0 ;
  81. t . 'DF0DX' = df0dx ;
  82. t . 'FVAL' = fval ;
  83. t . 'DFDX' = dfdx ;
  84. QUIT sloop ;
  85. * Sinon, mise à jour des valeurs des fonctions (pas besoin des gradients)
  86. * dans WTABLE et nouvelle sous itération
  87. SINON ;
  88. xmma = t . 'WTABLE' . 'X' ;
  89. f0 df0dx fval dfdx = FONC xmma ;
  90. t . 'WTABLE' . 'F0VALNEW' = f0 ;
  91. t . 'WTABLE' . 'FVALNEW' = fval ;
  92. FINSI ;
  93. FIN sloop ;
  94. * Calcul du résidu pour les conditions KKT
  95. res kkt2 kktinf = KKT_MMA t ;
  96. * Bilan de l'itération
  97. sit = t . 'WTABLE' . 'ITER' ;
  98. x1 = EXTR xmma 1 ;
  99. lx1 = lx1 ET x1 ;
  100. lf0 = lf0 ET f0 ;
  101. f1 = EXTR fval 1 ;
  102. li = li ET (MAXI 0. f1) ;
  103. MESS (CHAI 'FORMAT' '(F10.5)' &loop sit /6 x1 >1 f0 >3 kkt2 >2) ;
  104. FIN loop ;
  105. nit = (DIME lf0) - 1 ;
  106.  
  107. * Vérification du résultat
  108. errmax = MAXI 'ABS' ((xmma - xref) / xref) ;
  109. MESS 'Erreur relative max (sur x)' ;
  110. MESS errmax ;
  111.  
  112. * Évolutions temporelles de f, de l'infaisabilité et des variables
  113. * en fonction des itérations d'optimisation
  114. SI itrac ;
  115. labs = PROG (t . 'XMIN') 'PAS' 1. (t . 'XMAX') ;
  116. lord = ((labs - 50.) ** 2) + 25. ;
  117. evf0 = EVOL 'MANU' 'x' labs 'F0' lord ;
  118. path = EVOL 'ROUG' 'MANU' 'STYL' 'POIN' 'MARQ' 'ROND' 'x' lx1 'F0' lf0 ;
  119. DESS (evf0 ET path) 'TITR' 'Fonction objectif F0 et chemin au cours de l''optimisation' ;
  120. lit = PROG 0. 'PAS' 1. nit ;
  121. evf0 = EVOL 'ROUG' 'MANU' 'Iteration' lit 'F0' lf0 ;
  122. evfr = EVOL 'ROUG' 'MANU' 'Iteration' (PROG 0. nit) 'F0' (PROG f0ref f0ref) ;
  123. tl = TABL ;
  124. tl . 2 = 'TIRR' ;
  125. tl . 'TITRE' = TABL ;
  126. tl . 'TITRE' . 1 = 'F0 calculee' ;
  127. tl . 'TITRE' . 2 = 'F0 ref.' ;
  128. DESS (evf0 ET evfr) 'TITR' 'Fonction objectif F0(x) VS Iterations' 'LEGE' tl ;
  129. evi = EVOL 'VERT' 'MANU' 'Iteration' lit 'Inf' li ;
  130. tl . 'TITRE' . 1 = 'Infaisabilite' ;
  131. DESS evi 'TITR' 'Infaisabilite VS Iterations' 'LEGE' tl ;
  132. evx1 = EVOL 'ROUG' 'MANU' 'Iteration' lit 'x' lx1 ;
  133. evx1r = EVOL 'ROUG' 'MANU' 'Iteration' (PROG 0. nit) 'x' (PROG x1ref x1ref) ;
  134. tl . 'TITRE' . 1 = 'x1 calcule' ;
  135. tl . 'TITRE' . 2 = 'x1 ref.' ;
  136. DESS (evx1 ET evx1r) 'TITR' 'Valeurs x VS Iterations' 'LEGE' tl ;
  137. FINSI ;
  138.  
  139. * Sortie en erreur si l'écart aux valeurs de références est trop important
  140. SI (errmax > 1.E-6) ;
  141. ERRE 'Erreur dans le calcul d''optimisation' ;
  142. SINON ;
  143. MESS 'Cas test passe avec succes !' ;
  144. FINSI ;
  145.  
  146.  
  147. FIN ;
  148.  
  149.  
  150.  
  151.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales