* MOCA_MMA PROCEDUR FD218221 26/04/29 21:15:02 12530 DEBP MOCA_MMA ; * Description : * ------------- * Ajustement des parametres d'une fonction pour coller au mieux a * une serie de points * Methode des moindres carres ponderee, sous contraintes, * basee sur la Methode des Asymptotes Mobiles (MMA) * * Notations : * ----------- * x = [x1,x2,...,xn] vecteur des parametres (les inconnues du probleme) * n dimension de x * xmin xmax vecteurs des bornes sur les parametres * P = [P1,P2,...,Pm] vecteur des points connus * H = [H1,H2,...,Hm] vecteur des valeurs connues * w = [w1,w2,...,wm] vecteur des ponderations associees aux points P * m dimension de P, H et w * h(Pi,x) fonction a ajuster (decrite par la procedure "nomproc") * gj(x) j=1,...,r ensemble de fonctions contraintes sur les parametres * r nombre de relations gj imposees (optionnelles) * * Objectif : * ---------- * m * ---- * 1 \ * Minimiser : S(x) = --- / wi * [h(Pi,x) - Hi]^2 * sur x 2 ---- * i = 1 * * tel que : gj(x) < 0 j = 1,...,r * xmin < xi < xmax ************************************************************************ * A C Q U I S I T I O N D E S P A R A M E T R E S * * D' E N T R E E * ************************************************************************ * Lecture des arguments obligatoires par couple ( 'MOT_CLEF' , ARG1 ) nargobl = 4 ; REPE b1 nargobl ; * Lecture du mot clef * Variables de depart : x0 SI (EGA mot1 'X0') ; FINSI ; * Points connus (Pi,Hi) : lp,lh SI (EGA mot1 'ABSC') ; FINSI ; FINSI ; * Procedure decrivant la fonction h(lp,x) a caler SI (EGA mot1 'PROC') ; FINSI ; FIN b1 ; * Dimension des donnees * Quelques verifications FINSI ; * Valeurs par defaut des arguments optionnels icont = FAUX ; move = 0.1 ; nitmax = 50 ; crit1 = 1.E-4 ; iecho = 0 ; bvisu = FAUX ; * Lecture des arguments optionnels par couple ( 'MOT_CLEF' , ARG1 ) nargopt = 9 ; REPE b1 nargopt ; * Lecture du mot clef QUIT b1 ; FINSI ; * Bornes min/max sur les variables : xmin,xmax SI (EGA mot1 'XMIN') ; FINSI ; SI (EGA mot1 'XMAX') ; FINSI ; * Ponderations wi : lw SI (EGA mot1 'POID') ; FINSI ; * Procedure decrivant les fonctions contraintes g(x) icont = VRAI ; FINSI ; * Critere de convergence sur le residu kkt : crit1 FINSI ; * Nombre d'iterations max. pour la MMA : nitmax SI (EGA mot1 'ITER') ; FINSI ; * Limite d'increment pour MMA : move SI (EGA mot1 'INCR') ; FINSI ; * Niveau d'affichage SI (EGA mot1 'ECHO') ; FINSI ; * Visualisation ? SI (EGA mot1 'VISU') ; bvisu = VRAI ; FINSI ; FIN b1 ; * Quelques verifications FINSI ; FINSI ; FINSI ; SI (move <EG 0.) ; FINSI ; SI (crit1 < 0.) ; FINSI ; SI (nitmax < 1) ; FINSI ; SI ((iecho < 0) OU (iecho > 2)) ; FINSI ; * Pour la visualisation SI bvisu ; FINSI ; ************************************************************************ * I N I T I A L I S A T I O N D E S D O N N E E S * * P O U R L' O P E R A T E U R M M A * ************************************************************************ * On applique l'operateur MMA (voir notice) avec le parametrage suivant : * f0(x) = 0 * fi(x) = h(Pi,x) - Hi pour i dans [1,m] * f{m+i}(x) = -h(Pi,x) + Hi pour i dans [1,m] * f{2m+j}(x) = gj pour j dans [1,r] * a0 = 0 * ai = 0 pour i dans [1,2m+r] * ci = 0 pour i dans [1,2m] * c{2m+j} = "grand" pour j dans [1,r] * di = wi pour i dans [1,2m] * d{2m+j} = 0 pour j dans [1,r] * avec * m : nombre de points connus (Pi,Hi) * r : nombre de relations supplementaires (gj) sur les parametres x * q : nombre total de contraintes imposees pour l'operateur MMA * Calcul des valeurs h(Pi,x0) et des dh(Pi,x0)/dx1 ... dh(Pi,x0)/dxn f0 = 0. ; f = (h0 - lh) ET ((-1. * h0) + lh) ; REPE b1 m ; FIN b1 ; REPE b1 m ; df . (&b1 + m) = -1. * (df . &b1) ; FIN b1 ; * Calcul des contraintes gj(x0) et des dgj(x0)/dx1 ... dgj(x0)/dxn r = 0 ; SI icont ; f = f ET g0 ; REPE b1 r ; FIN b1 ; FINSI ; q = (2 * m) + r ; * Calcul de l'ecart quadratique S(x0) * Initialisation de la table pour l'operateur MMA : t . 'X' = x0 ; t . 'XMIN' = xmin ; t . 'XMAX' = xmax ; t . 'F0VAL' = f0 ; t . 'DF0DX' = df0 ; t . 'FVAL' = f ; t . 'DFDX' = df ; t . 'A0' = 0. ; t . 'D' = lw ET lw ; SI icont ; FINSI ; t . 'MOVE' = move ; * Pour l'affichage SI (iecho > 0) ; REPE b1 n ; FIN b1 ; MESS txt0 ; MESS txt1 ; * Historique des valeurs de x selon les iterations SI (iecho > 1) ; lx = ENUM x0 ; FINSI ; FINSI ; * Pour la visualisation SI bvisu ; FINSI ; * Boucle d'optimisation par MMA REPE loop nitmax ; * Calcul d'un nouveau jeu de variables xnew par MMA MMA t ; xnew = t . 'X' ; * Mise a jour des valeurs des fonctions f = (h1 - lh) ET ((-1. * h1) + lh) ; REPE b1 m ; FIN b1 ; REPE b1 m ; df . (&b1 + m) = -1. * (df . &b1) ; FIN b1 ; SI icont ; f = f ET g1 ; REPE b1 r ; FIN b1 ; FINSI ; t . 'FVAL' = f ; t . 'DFDX' = df ; * Calcul de l'ecart quadratique S(x) * Calcul du residu pour les conditions KKT res kkt2 kktinf = KKT_MMA t ; * Pour l'affichage SI (iecho > 0) ; REPE b1 n ; FIN b1 ; MESS txt1 ; FINSI ; * Historique des valeurs de x selon les iterations SI (iecho > 1) ; lmse = lmse ET mse1 ; lx = lx ET xnew ; FINSI ; * Pour la visualisation SI bvisu ; FINSI ; * Critere d'arret SI (kkt2 < crit1) ; QUIT loop ; FINSI ; FIN loop ; * Ecriture des arguments de sortie RESP xnew ; SI (iecho > 1) ; RESP lmse lx ; FINSI ; FINP ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales