Télécharger optimise.procedur

Retour à la liste

Numérotation des lignes :

  1. * OPTIMISE PROCEDUR SP204843 26/05/07 21:15:05 12544
  2. 'DEBP' OPTIMISE TAB1*'TABLE' ;
  3.  
  4. *------------------------- Lecture des entrees ------------------------*
  5.  
  6. * Arguments obligatoires
  7. * ----------------------
  8.  
  9. * Nom procedure simulation :
  10. simu1 = mot tab1 . simulation ;
  11.  
  12. * lpini1 : jeu de parametres initiaux :
  13. lpini1 = tab1 . parametres_initiaux ;
  14.  
  15. * labsc1 : valeurs des abscisses :
  16. labsc1 = tab1 . points_de_mesure ;
  17.  
  18. * lsref1 : vecteur objectif :
  19. lsref1 = tab1 . valeurs_objectif ;
  20.  
  21. * Arguments optionnels
  22. * --------------------
  23.  
  24. * Choix methode de optimisation :
  25. si (exis tab1 methode_optimisation) ;
  26. ilevmar1 = ega tab1.methode_optimisation 'LEVENBERG_MARQUARDT' ;
  27. imoca1 = ega tab1.methode_optimisation 'MOINDRE_CARRES' ;
  28. si (non (ilevmar1 ou imoca1)) ;
  29. erre '***** OPTIMISE : methode inconnue' ;
  30. fins ;
  31. sino ;
  32. ilevmar1 = vrai ;
  33. imoca1 = faux ;
  34. fins ;
  35.  
  36. * liste poids :
  37. si (exis tab1 poids) ;
  38. lpoid1 = tab1 . poids ;
  39. sino ;
  40. lpoid1 = prog (dime lsref1) * 1. ;
  41. fins ;
  42.  
  43. * Bornes parametres :
  44. si (exis tab1 bornes_inf) ;
  45. lpmin1 = tab1 . bornes_inf ;
  46. sino ;
  47. lpmin1 = 0.5 * lpini1 ;
  48. fins ;
  49. si (exis tab1 bornes_sup) ;
  50. lpmax1 = tab1 . bornes_sup ;
  51. sino ;
  52. lpmax1 = 1.5 * lpini1 ;
  53. fins ;
  54.  
  55. * crit1 : critere de precision
  56. si (exis tab1 precision) ;
  57. crit1 = tab1 . precision ;
  58. sino ;
  59. crit1 = 1.e-2 ;
  60. fins ;
  61.  
  62. * nmini1 : nombre iterations max. boucle minimisation :
  63. si (exis tab1 niter_max) ;
  64. nmini1 = tab1 . niter_max ;
  65. sino ;
  66. nmini1 = 100 ;
  67. fins ;
  68.  
  69. * lambda : parametre ponderation jacobienne (vs. hessienne) :
  70. ilambda1 = exis tab1 lambda ;
  71. si ilambda1 ;
  72. lambda0 = tab1 . lambda ;
  73. fins ;
  74.  
  75. * Activation dessin evolution criteres :
  76. idess1 = faux ;
  77. si (exis tab1 dessin_evol) ;
  78. idess1 = tab1 . dessin_evol ;
  79. fins ;
  80.  
  81. * Activation affichages calcul :
  82. echoff1 = vrai ;
  83. si (exis tab1 echo_simu) ;
  84. echoff1 = non (tab1 . echo_simu) ;
  85. fins ;
  86. vimpr1 = vale impr ;
  87.  
  88. *-------------------------- Initialisations ---------------------------*
  89.  
  90. * Point dupport rigidite associee a matrice hessienne :
  91. vdim1 = vale dime ;
  92. si (vdim1 neg 3) ; opti dime 3 ; fins ;
  93. prig1 = manu poi1 (0 0 0) ;
  94. si (vdim1 > 0 ) ; opti dime vdim1 ; fins ;
  95.  
  96. * Noms composantes primales / duales :
  97. npar1 = dime lpini1 ;
  98. lprim1 = mots ;
  99. ldual1 = mots ;
  100. repe bpar1 npar1 ;
  101. moti1 = chai 'P' &bpar1 ;
  102. lprim1 = lprim1 et moti1 ;
  103. moti1 = chai 'R' &bpar1 ;
  104. ldual1 = ldual1 et moti1 ;
  105. fin bpar1 ;
  106. *list lprim1 ; list ldual1 ;
  107. opti inco lprim1 ldual1 ;
  108.  
  109. * Table enregistrement listreel ecarts relatifs pour dessin :
  110. nsol1 = dime lsref1 ;
  111. si idess1 ;
  112. tdess1 = tabl ;
  113. repe bsol1 nsol1 ;
  114. tdess1 . &bsol1 = prog ;
  115. fin bsol1 ;
  116. fins ;
  117.  
  118. *------------------------- Affichage initial --------------------------*
  119.  
  120. mess '----------------------- Debut procedure OPTIMISE -----------------------' ;
  121. si ilevmar1 ;
  122. mess ' > Methode minimisation : LEVENBERG-MARQUARDT' ;
  123. fins ;
  124. si imoca1 ;
  125. mess ' > Methode minimisation : MOINDRE CARRES' ;
  126. fins ;
  127.  
  128. *------------------------- boucle minimisation ------------------------*
  129.  
  130. * Initialisations :
  131. lpi1 = lpini1 ;
  132. Rdeno1 = (0.5 * (somm (lsref1 * lsref1 * lpoid1 * lpoid1))) ** 0.5 ;
  133. rcprec1 = (vale prec) ** 0.5 ;
  134. liter1 = prog ;
  135. iconst1 = faux ;
  136. iannul1 = faux ;
  137. iti1 = 0 ;
  138. repe bmini1 (nmini1 + 1) ;
  139.  
  140. * Calcul vecteur solution (appel a la simulation) :
  141. si echoff1 ; opti impr 30 ; fins ;
  142. lsoli1 = simu1 labsc1 lpi1 ;
  143. opti impr vimpr1 ;
  144.  
  145. * Calcul Ecart Relatif a la solution de reference :
  146. lRi1 = (lsoli1 - lsref1) * lpoid1 ;
  147. Fi1 = 0.5 * (somm (lRi1 * lRi1)) ;
  148. Rni1 = (Fi1 ** 0.5) / Rdeno1 ;
  149.  
  150. * Impressions messages critere et param. :
  151. repe bpar1 npar1 ;
  152. motpari1 = chai ' Param. ' &bpar1*14 ;
  153. valpari1 = extr lpi1 &bpar1 ;
  154. si (&bpar1 ega 1) ;
  155. motpar1 = motpari1 ;
  156. mespar1 = chai valpari1*14 ;
  157. sino ;
  158. motpar1 = chai motpar1 motpari1*(&bpar1*14) ;
  159. mespar1 = chai mespar1 valpari1*(&bpar1*14) ;
  160. fins ;
  161. fin bpar1 ;
  162. mlambda1 = lambda1 ;
  163. si (&bmini1 ega 1) ;
  164. si ilevmar1 ;
  165. entete1 = chai ' It'*5 'Critere'*18 'lambda'*31 motpar1 ;
  166. fins ;
  167. si imoca1 ;
  168. entete1 = chai ' It'*5 'Critere'*18 motpar1 ;
  169. fins ;
  170. mess entete1 ;
  171. si ilambda1 ;
  172. mlambda1 = lambda0 ;
  173. sino ;
  174. mlambda1 = mot '-' ;
  175. fins ;
  176. fins ;
  177. si (non iannul1) ;
  178. si ilevmar1 ;
  179. messi1 = chai iti1*5 Rni1*18 mlambda1*31 mespar1 ;
  180. fins ;
  181. si imoca1 ;
  182. messi1 = chai iti1*5 Rni1*18 mespar1 ;
  183. fins ;
  184. mess messi1 ;
  185. si idess1 ; liter1 = liter1 et iti1 ; fins ;
  186. iti1 = iti1 + 1 ;
  187. fins ;
  188.  
  189. * Indicateur d'arret si critere constant d'une iteration sur l'autre :
  190. si (&bmini1 ega 1) ;
  191. Rnmin1 = Rni1 ;
  192. sino ;
  193. iconst1 = (abs (Rni1 - Rnmin1)) '<' (rcprec1 * Rni1) ;
  194. iconst1 = iconst1 et (non iannul1) ;
  195. *list (abs (Rni1- Rnmin1)) ;
  196. *list iconst1 ;
  197. fins ;
  198.  
  199. * Enregistrement resultats dans table :
  200. si ((Rni1 &lt;EG Rnmin1) ou (&bmini1 ega 1) ou iconst1) ;
  201. tab1 . parametres_finaux = lpi1 ;
  202. tab1 . valeurs_solution = (lRi1 / lpoid1) + lsref1 ;
  203. tab1 . valeur_critere = Rni1 ;
  204. fins ;
  205.  
  206. * Critere d'arret de la boucle de minimisation :
  207. si ((Rni1 < crit1) ou iconst1) ;
  208. saut 1 lign ;
  209. mess '------------------------ Fin procedure OPTIMISE ------------------------' ;
  210. saut 1 lign ;
  211. quit bmini1 ;
  212. fins ;
  213.  
  214. * Pilotage de lambda si Levenberg-Marquardt :
  215. si ilevmar1 ;
  216. iannul1 = faux ;
  217. si (&bmini1 ega 1) ; comm initialisation de lambda ;
  218. si ilambda1 ;
  219. lambda1 = lambda0 ;
  220. sino ;
  221. lambda1 = 1. ;
  222. fins ;
  223. sino ;
  224. si (Rni1 > (1.01 * Rnmin1)) ;
  225. lambda1 = 10. * lambda1 ;
  226. lpi1 = lpi1p ;
  227. mess ' annulation iteration : reprise valeurs precedentes' ;
  228. iannul1 = vrai ;
  229. iter bmini1 ;
  230. sino ;
  231. si (Rni1 < (0.99 * Rnmin1)) ;
  232. lambda1 = 0.1 * lambda1 ;
  233. fins ;
  234. fins ;
  235. fins ;
  236. fins ;
  237.  
  238. * Stockage valeur meilleur critere :
  239. si (Rni1 < Rnmin1) ; Rnmin1 = Rni1 ; fins ;
  240. *list Rnmin1 ;
  241.  
  242. * Calcul de la matrice Jacobienne de la fonction cout Fi1 :
  243. * JacoFi1 : listreel contenant la Jacobienne de la fonction
  244. * JacoFi1 : Jkl = dFl/dpk = ((k-1)*nsol1+l)-ieme element du listreel
  245. JacoFi1 = prog ;
  246. lderiv1 = enum ;
  247. repe bparam1 npar1 ;
  248. parami1 = extr lpi1 &bparam1 ;
  249. izeroi1 = faux ;
  250. si (parami1 ega 0.) ;
  251. izeroi1 = vrai ;
  252. pmaxi1 = lpmax1 extr &bparam1 ;
  253. si (pmaxi1 ega 0.) ;
  254. parami2 = 1. ;
  255. sino ;
  256. parami2 = 0.02 * pmaxi1 ;
  257. fins ;
  258. sino ;
  259. parami2 = 1.02 * parami1 ;
  260. fins ;
  261. lpi2 = (lpi1 enle &bparam1) inse &bparam1 parami2 ;
  262. si echoff1 ; opti impr 30 ; fins ;
  263. lsoli2 = simu1 labsc1 lpi2 ;
  264. opti impr vimpr1 ;
  265. si izeroi1 ;
  266. JacoFi2 = (lsoli2 - lsoli1) / parami2 ;
  267. sino ;
  268. JacoFi2 = (lsoli2 - lsoli1) / 0.02 / parami1 ;
  269. fins ;
  270. lderiv1 = lderiv1 et JacoFi2 ;
  271. JacoFi1 = JacoFi1 et JacoFi2 ;
  272. fin bparam1 ;
  273.  
  274. *----- MOINDRE_CARRES :
  275.  
  276. si imoca1 ;
  277. lpi1p = lpi1 ;
  278. lpi1 = moca lpi1 lsref1 lsoli1 lderiv1 'POIDS' lpoid1 ;
  279. fins ;
  280.  
  281. *----- LEVENBERG_MARQUARDT :
  282.  
  283. si ilevmar1 ;
  284.  
  285. * Construction de la matrice Hessienne = H ~ tJac * Jac :
  286. nbhes1 = npar1 * npar1 ;
  287. lrigi1 = prog ;
  288. ldiag1 = prog ;
  289. repe bhes1 nbhes1 ;
  290. Pi1 = (&bhes1 - 1) / npar1 + 1 ;
  291. Qi1 = &bhes1 - ((Pi1 - 1) * npar1) ;
  292. Hpqi1 = 0. ;
  293. repe bsol1 nsol1 ;
  294. JacoKP1 = JacoFi1 extr ((Pi1 - 1) * nsol1 + &bsol1) ;
  295. JacoKQ1 = JacoFi1 extr ((Qi1 - 1) * nsol1 + &bsol1) ;
  296. Hpqi1 = Hpqi1 + (JacoKP1 * JacoKQ1) ;
  297. fin bsol1 ;
  298. lrigi1 = lrigi1 et Hpqi1 ;
  299. si (Pi1 ega Qi1) ;
  300. ldiag1 = ldiag1 et Hpqi1 ;
  301. sino ;
  302. ldiag1 = ldiag1 et 0. ;
  303. fins ;
  304. fin bhes1 ;
  305. rigi1 = manu rigi prig1 lprim1 lrigi1 ;
  306. diagi1 = manu rigi prig1 lprim1 ldiag1 ;
  307. operi1 = rigi1 et (lambda1 * diagi1) ;
  308.  
  309. * Caclul du gradient de Fi1 = JacFi1 * Ri1 :
  310. gradFi1 = vide chpoint ;
  311. repe bpar1 npar1 ;
  312. lJacoFi1 = extr JacoFi1 (lect ((&bpar1 - 1) * nsol1 + 1) pas 1 (npar1 * nsol1)) ;
  313. RJacoFj1 = 0. ;
  314. repe bsol1 nsol1 ;
  315. RJacoFj1 = (lRi1 extr &bsol1) * (lJacoFi1 extr &bsol1) + RJacoFj1 ;
  316. fin bsol1 ;
  317. moti1 = ldual1 extr &bpar1 ;
  318. gradFij1 = manu chpo prig1 1 moti1 RJacoFj1 nature discret ;
  319. gradFi1 = gradFi1 et gradFij1 ;
  320. fin bpar1 ;
  321.  
  322. * Calcul de l'increment des parametres avec RESO :
  323. ldpi1 = RESO operi1 gradFi1 ;
  324.  
  325. * Conversion LISTREEL :
  326. ldpi2 = prog ;
  327. repe bpar1 npar1 ;
  328. ldpi2 = ldpi2 et (ldpi1 extr vale prig1 (lprim1 extr &bpar1)) ;
  329. fin bpar1 ;
  330. ldpi1 = ldpi2 ;
  331.  
  332. * Nouvelle liste de parametres :
  333. lpi1p = lpi1 ;
  334. lpi1 = lpi1 - ldpi1 ;
  335.  
  336. fins ;
  337. *----- fin LEVENBERG_MARQUARDT
  338.  
  339. * Limitation des parametres aux bornes :
  340. lpi2 = prog ;
  341. repe bparam1 npar1 ;
  342. pi1 = extr lpi1 &bparam1 ;
  343. pimin1 = extr lpmin1 &bparam1 ;
  344. pimax1 = extr lpmax1 &bparam1 ;
  345. pi1 = maxi (prog pi1 pimin1) ;
  346. pi1 = mini (prog pi1 pimax1) ;
  347. lpi2 = lpi2 et pi1 ;
  348. fin bparam1 ;
  349. lpi1 = lpi2 ;
  350.  
  351. * Dessin evolution critere relatif de chaque objectif :
  352. si idess1 ;
  353. evcrit1 = vide evolution ;
  354. repe bsol1 nsol1 ;
  355. tdess1 . &bsol1 = (tdess1 . &bsol1) et ((lRi1 extr &bsol1) abs) ;
  356. moti1 = chai 'Obj.' (&bsol1)*6 ;
  357. evi1 = evol manu lege moti1 marq &bsol1 'Iter' liter1 'Critere' (tdess1 . &bsol1) ;
  358. evi1 = evi1 coul (&bsol1 + 1) ;
  359. evcrit1 = evcrit1 et evi1 ;
  360. fin bsol1 ;
  361. si (iti1 &lt;EG 10) ;
  362. dess evcrit1 nclk lege xbor -1. (flot iti1) xgra 1. posy exce ;
  363. sino ;
  364. dess evcrit1 nclk lege xbor -1. (flot iti1) posy exce ;
  365. fins ;
  366. fins ;
  367.  
  368. fin bmini1 ;
  369.  
  370. 'FINP' TAB1 ;
  371.  
  372.  

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