* OPTIMISE PROCEDUR SP204843 26/05/07 21:15:05 12544 'DEBP' OPTIMISE TAB1*'TABLE' ; *------------------------- Lecture des entrees ------------------------* * Arguments obligatoires * ---------------------- * Nom procedure simulation : * lpini1 : jeu de parametres initiaux : lpini1 = tab1 . parametres_initiaux ; * labsc1 : valeurs des abscisses : labsc1 = tab1 . points_de_mesure ; * lsref1 : vecteur objectif : lsref1 = tab1 . valeurs_objectif ; * Arguments optionnels * -------------------- * Choix methode de optimisation : ilevmar1 = ega tab1.methode_optimisation 'LEVENBERG_MARQUARDT' ; imoca1 = ega tab1.methode_optimisation 'MOINDRE_CARRES' ; si (non (ilevmar1 ou imoca1)) ; fins ; sino ; ilevmar1 = vrai ; imoca1 = faux ; fins ; * liste poids : lpoid1 = tab1 . poids ; sino ; fins ; * Bornes parametres : lpmin1 = tab1 . bornes_inf ; sino ; lpmin1 = 0.5 * lpini1 ; fins ; lpmax1 = tab1 . bornes_sup ; sino ; lpmax1 = 1.5 * lpini1 ; fins ; * crit1 : critere de precision crit1 = tab1 . precision ; sino ; crit1 = 1.e-2 ; fins ; * nmini1 : nombre iterations max. boucle minimisation : nmini1 = tab1 . niter_max ; sino ; nmini1 = 100 ; fins ; * lambda : parametre ponderation jacobienne (vs. hessienne) : si ilambda1 ; lambda0 = tab1 . lambda ; fins ; * Activation dessin evolution criteres : idess1 = faux ; idess1 = tab1 . dessin_evol ; fins ; * Activation affichages calcul : echoff1 = vrai ; echoff1 = non (tab1 . echo_simu) ; fins ; *-------------------------- Initialisations ---------------------------* * Point dupport rigidite associee a matrice hessienne : * Noms composantes primales / duales : repe bpar1 npar1 ; lprim1 = lprim1 et moti1 ; ldual1 = ldual1 et moti1 ; fin bpar1 ; *list lprim1 ; list ldual1 ; opti inco lprim1 ldual1 ; * Table enregistrement listreel ecarts relatifs pour dessin : si idess1 ; repe bsol1 nsol1 ; fin bsol1 ; fins ; *------------------------- Affichage initial --------------------------* si ilevmar1 ; fins ; si imoca1 ; fins ; *------------------------- boucle minimisation ------------------------* * Initialisations : lpi1 = lpini1 ; iconst1 = faux ; iannul1 = faux ; iti1 = 0 ; repe bmini1 (nmini1 + 1) ; * Calcul vecteur solution (appel a la simulation) : lsoli1 = simu1 labsc1 lpi1 ; opti impr vimpr1 ; * Calcul Ecart Relatif a la solution de reference : lRi1 = (lsoli1 - lsref1) * lpoid1 ; Rni1 = (Fi1 ** 0.5) / Rdeno1 ; * Impressions messages critere et param. : repe bpar1 npar1 ; si (&bpar1 ega 1) ; motpar1 = motpari1 ; sino ; fins ; fin bpar1 ; mlambda1 = lambda1 ; si (&bmini1 ega 1) ; si ilevmar1 ; fins ; si imoca1 ; fins ; mess entete1 ; si ilambda1 ; mlambda1 = lambda0 ; sino ; fins ; fins ; si (non iannul1) ; si ilevmar1 ; fins ; si imoca1 ; fins ; mess messi1 ; si idess1 ; liter1 = liter1 et iti1 ; fins ; iti1 = iti1 + 1 ; fins ; * Indicateur d'arret si critere constant d'une iteration sur l'autre : si (&bmini1 ega 1) ; Rnmin1 = Rni1 ; sino ; iconst1 = (abs (Rni1 - Rnmin1)) '<' (rcprec1 * Rni1) ; iconst1 = iconst1 et (non iannul1) ; *list (abs (Rni1- Rnmin1)) ; *list iconst1 ; fins ; * Enregistrement resultats dans table : si ((Rni1 <EG Rnmin1) ou (&bmini1 ega 1) ou iconst1) ; tab1 . parametres_finaux = lpi1 ; tab1 . valeurs_solution = (lRi1 / lpoid1) + lsref1 ; tab1 . valeur_critere = Rni1 ; fins ; * Critere d'arret de la boucle de minimisation : si ((Rni1 < crit1) ou iconst1) ; quit bmini1 ; fins ; * Pilotage de lambda si Levenberg-Marquardt : si ilevmar1 ; iannul1 = faux ; si ilambda1 ; lambda1 = lambda0 ; sino ; lambda1 = 1. ; fins ; sino ; si (Rni1 > (1.01 * Rnmin1)) ; lambda1 = 10. * lambda1 ; lpi1 = lpi1p ; mess ' annulation iteration : reprise valeurs precedentes' ; iannul1 = vrai ; iter bmini1 ; sino ; si (Rni1 < (0.99 * Rnmin1)) ; lambda1 = 0.1 * lambda1 ; fins ; fins ; fins ; fins ; * Stockage valeur meilleur critere : si (Rni1 < Rnmin1) ; Rnmin1 = Rni1 ; fins ; *list Rnmin1 ; * Calcul de la matrice Jacobienne de la fonction cout Fi1 : * JacoFi1 : listreel contenant la Jacobienne de la fonction * JacoFi1 : Jkl = dFl/dpk = ((k-1)*nsol1+l)-ieme element du listreel lderiv1 = enum ; repe bparam1 npar1 ; izeroi1 = faux ; si (parami1 ega 0.) ; izeroi1 = vrai ; si (pmaxi1 ega 0.) ; parami2 = 1. ; sino ; parami2 = 0.02 * pmaxi1 ; fins ; sino ; parami2 = 1.02 * parami1 ; fins ; lsoli2 = simu1 labsc1 lpi2 ; opti impr vimpr1 ; si izeroi1 ; JacoFi2 = (lsoli2 - lsoli1) / parami2 ; sino ; JacoFi2 = (lsoli2 - lsoli1) / 0.02 / parami1 ; fins ; lderiv1 = lderiv1 et JacoFi2 ; JacoFi1 = JacoFi1 et JacoFi2 ; fin bparam1 ; *----- MOINDRE_CARRES : si imoca1 ; lpi1p = lpi1 ; fins ; *----- LEVENBERG_MARQUARDT : si ilevmar1 ; * Construction de la matrice Hessienne = H ~ tJac * Jac : nbhes1 = npar1 * npar1 ; repe bhes1 nbhes1 ; Pi1 = (&bhes1 - 1) / npar1 + 1 ; Qi1 = &bhes1 - ((Pi1 - 1) * npar1) ; Hpqi1 = 0. ; repe bsol1 nsol1 ; Hpqi1 = Hpqi1 + (JacoKP1 * JacoKQ1) ; fin bsol1 ; lrigi1 = lrigi1 et Hpqi1 ; si (Pi1 ega Qi1) ; ldiag1 = ldiag1 et Hpqi1 ; sino ; ldiag1 = ldiag1 et 0. ; fins ; fin bhes1 ; operi1 = rigi1 et (lambda1 * diagi1) ; * Caclul du gradient de Fi1 = JacFi1 * Ri1 : repe bpar1 npar1 ; RJacoFj1 = 0. ; repe bsol1 nsol1 ; fin bsol1 ; gradFi1 = gradFi1 et gradFij1 ; fin bpar1 ; * Calcul de l'increment des parametres avec RESO : * Conversion LISTREEL : repe bpar1 npar1 ; fin bpar1 ; ldpi1 = ldpi2 ; * Nouvelle liste de parametres : lpi1p = lpi1 ; lpi1 = lpi1 - ldpi1 ; fins ; *----- fin LEVENBERG_MARQUARDT * Limitation des parametres aux bornes : repe bparam1 npar1 ; lpi2 = lpi2 et pi1 ; fin bparam1 ; lpi1 = lpi2 ; * Dessin evolution critere relatif de chaque objectif : si idess1 ; repe bsol1 nsol1 ; evcrit1 = evcrit1 et evi1 ; fin bsol1 ; si (iti1 <EG 10) ; sino ; fins ; fins ; fin bmini1 ; 'FINP' TAB1 ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales