Télécharger moca_mma.procedur

Retour à la liste

Numérotation des lignes :

  1. * MOCA_MMA PROCEDUR FD218221 26/04/29 21:15:02 12530
  2. DEBP MOCA_MMA ;
  3.  
  4. * Description :
  5. * -------------
  6. * Ajustement des parametres d'une fonction pour coller au mieux a
  7. * une serie de points
  8. * Methode des moindres carres ponderee, sous contraintes,
  9. * basee sur la Methode des Asymptotes Mobiles (MMA)
  10. *
  11. * Notations :
  12. * -----------
  13. * x = [x1,x2,...,xn] vecteur des parametres (les inconnues du probleme)
  14. * n dimension de x
  15. * xmin xmax vecteurs des bornes sur les parametres
  16. * P = [P1,P2,...,Pm] vecteur des points connus
  17. * H = [H1,H2,...,Hm] vecteur des valeurs connues
  18. * w = [w1,w2,...,wm] vecteur des ponderations associees aux points P
  19. * m dimension de P, H et w
  20. * h(Pi,x) fonction a ajuster (decrite par la procedure "nomproc")
  21. * gj(x) j=1,...,r ensemble de fonctions contraintes sur les parametres
  22. * r nombre de relations gj imposees (optionnelles)
  23. *
  24. * Objectif :
  25. * ----------
  26. * m
  27. * ----
  28. * 1 \
  29. * Minimiser : S(x) = --- / wi * [h(Pi,x) - Hi]^2
  30. * sur x 2 ----
  31. * i = 1
  32. *
  33. * tel que : gj(x) < 0 j = 1,...,r
  34. * xmin < xi < xmax
  35.  
  36.  
  37.  
  38. ************************************************************************
  39. * A C Q U I S I T I O N D E S P A R A M E T R E S *
  40. * D' E N T R E E *
  41. ************************************************************************
  42.  
  43. * Lecture des arguments obligatoires par couple ( 'MOT_CLEF' , ARG1 )
  44. nargobl = 4 ;
  45. REPE b1 nargobl ;
  46. * Lecture du mot clef
  47. ARGU mot1*'MOT' ;
  48. * Variables de depart : x0
  49. SI (EGA mot1 'X0') ;
  50. ARGU x0*'LISTREEL' ;
  51. FINSI ;
  52. * Points connus (Pi,Hi) : lp,lh
  53. SI (EGA mot1 'ABSC') ;
  54. ARGU lp*'LISTREEL' ;
  55. FINSI ;
  56. SI (EGA mot1 'ORDO') ;
  57. ARGU lh*'LISTREEL' ;
  58. FINSI ;
  59. * Procedure decrivant la fonction h(lp,x) a caler
  60. SI (EGA mot1 'PROC') ;
  61. ARGU mot2*'MOT' ;
  62. nomproc = MOT (TEXT (CHAI mot2)) ;
  63. FINSI ;
  64. FIN b1 ;
  65.  
  66. * Dimension des donnees
  67. n = DIME x0 ;
  68. m = DIME lp ;
  69.  
  70. * Quelques verifications
  71. SI (NEG (DIME lh) m) ;
  72. ERRE 'Les listes ''ABSC'' et ''ORDO'' n''ont pas la meme dimension' ;
  73. FINSI ;
  74.  
  75. * Valeurs par defaut des arguments optionnels
  76. xmin = PROG n*0. ;
  77. xmax = PROG n*1000. ;
  78. lw = PROG m*1. ;
  79. icont = FAUX ;
  80. move = 0.1 ;
  81. nitmax = 50 ;
  82. crit1 = 1.E-4 ;
  83. iecho = 0 ;
  84. bvisu = FAUX ;
  85.  
  86. * Lecture des arguments optionnels par couple ( 'MOT_CLEF' , ARG1 )
  87. nargopt = 9 ;
  88. REPE b1 nargopt ;
  89. * Lecture du mot clef
  90. ARGU mot1/'MOT' ;
  91. SI (EGA (TYPE mot1) 'ANNULE') ;
  92. QUIT b1 ;
  93. FINSI ;
  94. * Bornes min/max sur les variables : xmin,xmax
  95. SI (EGA mot1 'XMIN') ;
  96. ARGU xmin*'LISTREEL' ;
  97. FINSI ;
  98. SI (EGA mot1 'XMAX') ;
  99. ARGU xmax*'LISTREEL' ;
  100. FINSI ;
  101. * Ponderations wi : lw
  102. SI (EGA mot1 'POID') ;
  103. ARGU lw*'LISTREEL' ;
  104. FINSI ;
  105. * Procedure decrivant les fonctions contraintes g(x)
  106. SI (EGA mot1 'CONT') ;
  107. ARGU mot2*'MOT' ;
  108. nomcont = MOT (TEXT (CHAI mot2)) ;
  109. icont = VRAI ;
  110. FINSI ;
  111. * Critere de convergence sur le residu kkt : crit1
  112. SI (EGA mot1 'CRIT') ;
  113. ARGU crit1*'FLOTTANT' ;
  114. FINSI ;
  115. * Nombre d'iterations max. pour la MMA : nitmax
  116. SI (EGA mot1 'ITER') ;
  117. ARGU nitmax*'ENTIER' ;
  118. FINSI ;
  119. * Limite d'increment pour MMA : move
  120. SI (EGA mot1 'INCR') ;
  121. ARGU move*'FLOTTANT' ;
  122. FINSI ;
  123. * Niveau d'affichage
  124. SI (EGA mot1 'ECHO') ;
  125. ARGU iecho*'ENTIER' ;
  126. FINSI ;
  127. * Visualisation ?
  128. SI (EGA mot1 'VISU') ;
  129. bvisu = VRAI ;
  130. ARGU l1plot*'LISTREEL' ;
  131. FINSI ;
  132. FIN b1 ;
  133.  
  134. * Quelques verifications
  135. SI (NEG (DIME xmin) n) ;
  136. ERRE 'Les listes ''X0'' et ''XMIN'' n''ont pas la meme dimension' ;
  137. FINSI ;
  138. SI (NEG (DIME xmax) n) ;
  139. ERRE 'Les listes ''X0'' et ''XMAX'' n''ont pas la meme dimension' ;
  140. FINSI ;
  141. SI (NEG (DIME lw) m) ;
  142. ERRE 'Les listes ''ABSC'' et ''POID'' n''ont pas la meme dimension' ;
  143. FINSI ;
  144. SI (move &lt;EG 0.) ;
  145. ERRE 'La limite d''increment ''INCR'' doit etre > 0' ;
  146. FINSI ;
  147. SI (crit1 < 0.) ;
  148. ERRE 'Le critere de convergence doit etre > 0.' ;
  149. FINSI ;
  150. SI (nitmax < 1) ;
  151. ERRE 'Le nombre d''iterations doit etre > 0' ;
  152. FINSI ;
  153. SI ((iecho < 0) OU (iecho > 2)) ;
  154. ERRE 'L''entier ''ECHO'' doit etre compris entre 0 et 2' ;
  155. FINSI ;
  156.  
  157. * Pour la visualisation
  158. SI bvisu ;
  159. evmes = EVOL 'ROUG' 'MANU' 'STYL' 'NOLI' 'MARQ' 'ROND' lp lh ;
  160. FINSI ;
  161.  
  162.  
  163.  
  164. ************************************************************************
  165. * I N I T I A L I S A T I O N D E S D O N N E E S *
  166. * P O U R L' O P E R A T E U R M M A *
  167. ************************************************************************
  168.  
  169. * On applique l'operateur MMA (voir notice) avec le parametrage suivant :
  170. * f0(x) = 0
  171. * fi(x) = h(Pi,x) - Hi pour i dans [1,m]
  172. * f{m+i}(x) = -h(Pi,x) + Hi pour i dans [1,m]
  173. * f{2m+j}(x) = gj pour j dans [1,r]
  174. * a0 = 0
  175. * ai = 0 pour i dans [1,2m+r]
  176. * ci = 0 pour i dans [1,2m]
  177. * c{2m+j} = "grand" pour j dans [1,r]
  178. * di = wi pour i dans [1,2m]
  179. * d{2m+j} = 0 pour j dans [1,r]
  180. * avec
  181. * m : nombre de points connus (Pi,Hi)
  182. * r : nombre de relations supplementaires (gj) sur les parametres x
  183. * q : nombre total de contraintes imposees pour l'operateur MMA
  184.  
  185. * Calcul des valeurs h(Pi,x0) et des dh(Pi,x0)/dx1 ... dh(Pi,x0)/dxn
  186. f0 = 0. ;
  187. df0 = PROG n*0. ;
  188. h0 dh0 = (TEXT nomproc) lp x0 ;
  189. f = (h0 - lh) ET ((-1. * h0) + lh) ;
  190. df = TABL ;
  191. REPE b1 m ;
  192. df . &b1 = EXTR dh0 &b1 ;
  193. FIN b1 ;
  194. REPE b1 m ;
  195. df . (&b1 + m) = -1. * (df . &b1) ;
  196. FIN b1 ;
  197.  
  198. * Calcul des contraintes gj(x0) et des dgj(x0)/dx1 ... dgj(x0)/dxn
  199. r = 0 ;
  200. SI icont ;
  201. g0 dg0 = (TEXT nomcont) x0 ;
  202. r = DIME g0 ;
  203. f = f ET g0 ;
  204. REPE b1 r ;
  205. df . (&b1 + (2 * m)) = EXTR dg0 &b1 ;
  206. FIN b1 ;
  207. FINSI ;
  208. q = (2 * m) + r ;
  209.  
  210. * Calcul de l'ecart quadratique S(x0)
  211. mse0 = 0.5 * (SOMM (lw * ((h0 - lh) ** 2))) ;
  212. * Initialisation de la table pour l'operateur MMA :
  213. t = TABL ;
  214. t . 'X' = x0 ;
  215. t . 'XMIN' = xmin ;
  216. t . 'XMAX' = xmax ;
  217. t . 'F0VAL' = f0 ;
  218. t . 'DF0DX' = df0 ;
  219. t . 'FVAL' = f ;
  220. t . 'DFDX' = df ;
  221. t . 'A0' = 0. ;
  222. t . 'A' = PROG q*0. ;
  223. t . 'C' = PROG (2 * m)*0. ;
  224. t . 'D' = lw ET lw ;
  225. SI icont ;
  226. t . 'C' = (t . 'C') ET (PROG r*1.E5) ;
  227. t . 'D' = (t . 'D') ET (PROG r*0.) ;
  228. FINSI ;
  229. t . 'MOVE' = move ;
  230.  
  231. * Pour l'affichage
  232. SI (iecho > 0) ;
  233. txt0 = CHAI 'It' *5 ;
  234. txt1 = CHAI '0' *5 ;
  235. REPE b1 n ;
  236. txt0 = CHAI txt0 (CHAI 'x' &b1) <11 ;
  237. txt1 = CHAI 'FORMAT' '(F10.5)' txt1 (EXTR x0 &b1) <11 ;
  238. FIN b1 ;
  239. txt0 = CHAI txt0 'mse' <11 'kkt' <11 ;
  240. txt1 = CHAI 'FORMAT' '(F10.5)' txt1 mse0 <11 ;
  241. MESS txt0 ;
  242. MESS txt1 ;
  243. * Historique des valeurs de x selon les iterations
  244. SI (iecho > 1) ;
  245. lmse = PROG mse0 ;
  246. lx = ENUM x0 ;
  247. FINSI ;
  248. FINSI ;
  249. * Pour la visualisation
  250. SI bvisu ;
  251. l2plot = (TEXT nomproc) l1plot x0 'VISU' ;
  252. ev0 = EVOL 'GRIS' 'MANU' l1plot l2plot ;
  253. DESS (evmes ET ev0) 'TITR' (CHAI 'Iteration :' ' ' 0) ;
  254. FINSI ;
  255.  
  256. * Boucle d'optimisation par MMA
  257. REPE loop nitmax ;
  258. * Calcul d'un nouveau jeu de variables xnew par MMA
  259. MMA t ;
  260. xnew = t . 'X' ;
  261. * Mise a jour des valeurs des fonctions
  262. h1 dh1 = (TEXT nomproc) lp xnew ;
  263. f = (h1 - lh) ET ((-1. * h1) + lh) ;
  264. df = TABL ;
  265. REPE b1 m ;
  266. df . &b1 = EXTR dh1 &b1 ;
  267. FIN b1 ;
  268. REPE b1 m ;
  269. df . (&b1 + m) = -1. * (df . &b1) ;
  270. FIN b1 ;
  271. SI icont ;
  272. g1 dg1 = (TEXT nomcont) xnew ;
  273. f = f ET g1 ;
  274. REPE b1 r ;
  275. df . (&b1 + (2 * m)) = EXTR dg1 &b1 ;
  276. FIN b1 ;
  277. FINSI ;
  278. t . 'FVAL' = f ;
  279. t . 'DFDX' = df ;
  280. * Calcul de l'ecart quadratique S(x)
  281. mse1 = 0.5 * (SOMM (lw * ((h1 - lh) ** 2))) ;
  282. * Calcul du residu pour les conditions KKT
  283. res kkt2 kktinf = KKT_MMA t ;
  284. * Pour l'affichage
  285. SI (iecho > 0) ;
  286. txt1 = CHAI &loop *5 ;
  287. REPE b1 n ;
  288. txt1 = CHAI 'FORMAT' '(F10.5)' txt1 (EXTR xnew &b1) <11 ;
  289. FIN b1 ;
  290. txt1 = CHAI 'FORMAT' '(F10.5)' txt1 mse1 <11 kkt2 <11 ;
  291. MESS txt1 ;
  292. FINSI ;
  293. * Historique des valeurs de x selon les iterations
  294. SI (iecho > 1) ;
  295. lmse = lmse ET mse1 ;
  296. lx = lx ET xnew ;
  297. FINSI ;
  298. * Pour la visualisation
  299. SI bvisu ;
  300. l2plot = (TEXT nomproc) l1plot xnew 'VISU' ;
  301. ev1 = EVOL 'GRIS' 'MANU' l1plot l2plot ;
  302. DESS (evmes ET ev1) 'TITR' (CHAI 'Iteration :' ' ' &loop) ;
  303. FINSI ;
  304. * Critere d'arret
  305. SI (kkt2 < crit1) ;
  306. QUIT loop ;
  307. FINSI ;
  308. FIN loop ;
  309.  
  310. * Ecriture des arguments de sortie
  311. RESP xnew ;
  312. SI (iecho > 1) ;
  313. RESP lmse lx ;
  314. FINSI ;
  315.  
  316. FINP ;
  317.  

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