* AJUSTE PROCEDUR PV 14/03/13 21:15:01 7997 * * =============================================================== * AJUSTEMENT D'UNE FONCTION DE LA FORME * * F = q1*f1(x,p) + q2*f2(x,p) + ... + qL*fL(x,p) + g(x,p) * * on a L parametres lineaires : q * et K parametres non lineaires: p * * definir les procedures FCT et DERI * (dont on peut préciser des noms différents) * * nombre maximum de points: mxn=100000 * de parametres lineaires: mxl=5000 * de parametres non lineaires: mxk=50 * * =============================================================== * ENTREES * tab1 : TABLE d'indices : * 'K' : nb de paramètres internes 'non linéaires' aux fonctions * 'L' : nb de fonctions précédées de paramètres * 'linéaires' à évaluer * 'X' : TABLE des coordonnées (x,y,z,...) * 'F' : LISTREEL des N valeurs à caler * 'MESSAGES' : niveau de bavardage (défaut 0) * 'IMPRESSION' : fréquence avec laquelle impression les résultats * 'NOM_FCT' : nom de la proc. de calcul de la fonction * 'NOM_DERI' : nom de la proc. de calcul de sa dérivée par * rapport aux paramètres * * 'PMIN' : LISTREEL des K val. minimales des K paramètres * internes 'non linéaires' * 'PMAX' : LISTREEL des K val. maximales " " " * 'PRECISION' : LISTREEL des K val. de précision souhaitée pour eux * Ces 3 indices doivent être donnés si K > 0 * (défaut 1d-7) * 'POIDS' : LISTREEL des N poids à attribuer à chaque point de valeur * 'MXTER' : nb max. d'itérations avant sortie (si K > 1) * * SORTIES * q : LISTREEL des valeurs des paramètres internes optimaux * p : idem (non linéaires) * * =============================================================== * * MODIFICATIONS : * 20/04/2006, P. Maugis : * mise en paramètre des noms de procédures FCT et DERI * 10/10/2006, P. Maugis : * niveau de messages * * =============================================================== * Lecture des entrées * ------------------- k = tab1.'K'; l = tab1.'L'; xtab = tab1.'X'; y = tab1.'F'; 'SI' ('NON' ('EXISTE' tab1 'NOM_FCT')) ; * on conserve le nom par défaut 'SINON' ; 'FINSI' ; 'SI' ('NON' ('EXISTE' tab1 'NOM_DERI')) ; * on conserve le nom par défaut 'SINON' ; 'FINSI' ; 'SI' ('EXISTE' tab1 'IMPRESSION'); iimpr = tab1.'IMPRESSION'; 'SINON' ; iimpr = 20; 'FINSI' ; * Coefficients de pondération 'SI' ('EXISTE' TAB1 'POIDS'); POI = TAB1.'POIDS'; 'SINON'; 'FINSI'; * Niveau de message 'SI' ('EXISTE' tab1 'MESSAGES') ; IMESS = 'ENTIER' (tab1.'MESSAGES') ; 'SINON' ; IMESS = 0 ; 'FINSI' ; * TROIS cas de figure selon le nb de paramètres non linéaires * ----------------------------------------------------------- * 1) Cas où PAS DE paramètres non linéaires 'SI' (k '<EG' 0); tbfonc = ('TEXTE' NOMFCT) xtab ; 'SI' (IMESS '>EG' 1) ; ' paramètres linéaires valent respectivement'; 'REPETER' bcl1 l ; 'FIN' bcl1 ; 'MESS' ' Erreur d estimation : ' wphi ; 'FINSI' ; 'FINSI'; * 2) Cas avec UN SEUL paramètre non linéaire 'SI' (k 'EGA' 1); * on lit les options pour les paramètres non linéaires pmin = tab1.'PMIN'; pmax = tab1.'PMAX'; 'SI' ( 'EXISTE' tab1 'PRECISION'); dp = tab1.'PRECISION'; 'SINON' ; 'FINSI'; p1 = 0.6180340051651; q1 = 0.3819659948349; 'SI' (('ABS' raq) '<EG' eaq); raq = 0.; 'FINSI'; 'SI' (raq '<EG' 0); pp = 0.5 * (wa+wb); 'SINON'; wu = (p1*wa) + (q1*wb); wv = (q1*wa) + (p1*wb); wtbfoncu = ('TEXTE' NOMFCT) xtab wul; wtbfoncv = ('TEXTE' NOMFCT) xtab wvl; 'REPETER' wbloc ; raq = wf - wg; 'SI' (('ABS' raq) '<EG' eaq); raq = 0.; 'FINSI'; 'SI' (raq '<EG' 0.); wb = wv; 'SI' (('ABS' raq) '<EG' eaq); raq = 0. ; 'FINSI'; 'SI' (raq '<EG' 0); wpp = 0.5 * (wa+wb); 'QUITTER' wbloc; 'SINON'; wv = wu; wg = wf; wu = (p1*wa) + (q1*wb); wtbfoncu = ('TEXTE' NOMFCT) xtab wul; 'ITERER' wbloc; 'FINSI'; 'SINON'; wa = wu; 'SI' (('ABS' raq) '<EG' eaq); raq = 0. ; 'FINSI'; 'SI' (raq '<EG' 0.); wpp = 0.5 * (wa+wb); 'QUITTER' wbloc; 'SINON'; wu = wv; wf = wg; wv = (q1*wa) + (p1*wb); wtbfoncv = ('TEXTE' NOMFCT) xtab wvl; 'ITERER' wbloc; 'FINSI'; 'FINSI'; 'FIN' wbloc; 'FINSI'; wtbfp = ('TEXTE' NOMFCT) xtab p; 'SI' (IMESS '>EG' 1) ; ' paramètres linéaires valent respectivement'; 'REPETER' bcl1 l ; 'FIN' bcl1 ; 'MESS' ' Erreur d estimation : ' wphi ; 'FINSI' ; 'FINSI'; * 3) Cas avec PLUSIEURS paramètres non linéaire 'SI' (k > 1); * on lit les options pour les paramètres non linéaires pmin = tab1.'PMIN'; pmax = tab1.'PMAX'; 'SI' ( 'EXISTE' tab1 'PRECISION'); dp = tab1.'PRECISION'; 'SINON' ; 'FINSI'; p = pmin + ( (pmax - pmin) * 0.555 ); 'SI' ( 'EXISTE' tab1 'MXTER'); mxter = tab1.'MXTER'; 'SINON'; mxter = 100; 'FINSI'; hzinf = 1.D150; qzero = 2.D-56; qrela = 2.D-14; hiter = 0; htbfonc = ('TEXTE' NOMFCT) xtab p; htbderi = ('TEXTE' NOMDERI) xtab p; 'REPETER' hbloc2 ; h = hf; hkas = 0; 'REPETER' hbloc3 ; qt = qrela *(('ABS' p)+('ABS' (pmin+dp))); eaq = aqp*zq + (aqpc*qt); raq = p - pmin - dp; raq = raq * aaqa; hs = 'MASQUE' raq 'EGINFE' 0; qt = qrela *(('ABS' p)+('ABS' (pmax-dp))); eaq = aqp*zq + aqpc*qt; raq = p - pmax + dp; raq = raq * aaqa; ht = 'MASQUE' raq 'EGSUPE' 0; htt = 'MASQUE' ht 'INFERIEUR' 0.5; hss = 'MASQUE' hs 'INFERIEUR' 0.5; hh = 'MASQUE' h 'SUPERIEUR' 0; hhh = 'MASQUE' h 'INFERIEUR' 0; hminh= h*hhh; hmaxh= h*hh; h = (hs*hmaxh) + ((hss*htt)*h) + (ht*hminh); hv = 0; hi = 0; 'REPETER' hblo hk; hi = hi+1 ; 'FIN' hblo; raq = hu - 0; 'SI' (('ABS' raq) '<EG' eaq); raq = 0.; 'FINSI'; 'SI' (raq '<EG' 0); 'QUITTER' hbloc2; 'FINSI'; raq = hv - 0; 'SI' (('ABS' raq) '<EG' eaq); raq = 0.; 'FINSI'; 'SI' (raq '<EG' 0); 'SI' ( hkas '<EG' 0); 'QUITTER' hbloc2; 'SINON' ; 'ITERER' hbloc2; 'FINSI'; 'FINSI'; hrm = hzinf; hdr = hzinf; *gounand Masquage de h pour éviter les divisions par zéro zh = 'MASQUE' ('ABS' h) 'EGINFE' 2.D-56 ; mzh = '-' uh zh ; h2 = '+' ('*' h mzh) ('*' ('*' uh 2.D-56) zh) ; h = h2 ; * fin masquage hl1 = (pmin-p) / h; hl2 = (pmax-p) / h; hl11 = 'MASQUE' hl1 'EGSUPE' hl2; hl22 = 'MASQUE' hl11 'INFERIEUR' 0.5; hmaxl = (hl11*hl1) + (hl22*hl2); hlr2 = 'MASQUE' hlr1 'INFERIEUR' 0.5; hldr = dp / ('ABS' h); hld2 = 'MASQUE' hld1 'INFERIEUR' 0.5; 'REPETER' hbloc1 ; * recherche du minimum d'une fonction (k variable) sur un segment * hg hq hr hphi2=seck hrm hdr l xtab y p h; p1 = 0.6180340051651; q1 = 0.3819659948349; ka = 0.; kb = hrm; raq = kb - ka - kprec; 'SI' (('ABS' raq) '<EG' eaq); raq = 0. ; 'FINSI'; 'SI' (raq '<EG' 0); kpp = 0.5 * (ka+kb); 'SINON'; ku = (p1*ka) + (q1*kb); kv = (q1*ka) + (p1*kb); kpu = p + (ku*h); kpv = p + (kv*h); ktbpu = ('TEXTE' NOMFCT) xtab kpu; ktbpv = ('TEXTE' NOMFCT) xtab kpv; 'REPETE' kbloc ; raq = kf - kg; 'SI' (('ABS' raq) '<EG' eaq); raq = 0. ; 'FINSI'; 'SI' (raq '<EG' 0); kb = kv; raq = kb - ka - kprec; 'SI' (('ABS' raq) '<EG' eaq); raq = 0. ; 'FINSI'; 'SI' (raq '<EG' 0); kpp = 0.5 * (ka+kb); 'QUITTER' kbloc; 'SINON'; kv = ku; kg = kf; ku = (p1*ka) + (q1*kb); kpu = p + (ku*h); ktbpu = ('TEXTE' NOMFCT) xtab kpu; 'ITERER' kbloc; 'FINSI'; 'SINON'; ka = ku; raq = kb - ka - kprec; 'SI' (('ABS' raq) '<EG' eaq); raq = 0. ; 'FINSI'; 'SI' (raq '<EG' 0); kpp = 0.5 * (ka+kb); 'QUITTER' kbloc; 'SINON'; ku = kv; kf = kg; kv = (q1*ka) + (p1*kb); kpv = p + (kv*h); ktbpv = ('TEXTE' NOMFCT) xtab kpv; 'ITERER' kbloc; 'FINSI'; 'FINSI'; 'FIN' kbloc; 'FINSI'; kt = p + (kpp*h); ktbft = ('TEXTE' NOMFCT) xtab kt; hg = kt; hq = kq; hr = kpp; hphi2 = kphi; hiter = hiter + 1; 'MESS' ' itération numéro :' hiter; 'SI' (l > 0) ; 'linéaires '; 'LIST' hq; 'FINSI' ; 'SI' (k > 0) ; 'non linéaires '; 'LIST' hg; 'FINSI' ; 'FINSI'; 'SI' ((mxter '>EG' 1) 'ET' (hiter '>EG' mxter)); 'SI' (IMESS '>EG' 1) ; 'LE NOMBRE MAXIMUM D ITERATIONS EST ATTEINT !'; 'FINSI' ; 'QUITTER' hbloc2; 'FINSI'; raq = hr - hdr; 'SI' (('ABS' raq) '<EG' eaq); raq = 0.; 'FINSI'; 'SI' (raq '<EG' 0); 'SI' (hkas '<EG' 0); 'QUITTER' hbloc2; 'SINON'; 'ITERER' hbloc2; 'FINSI'; 'FINSI'; (qrela*(('ABS' hphi2)+('ABS' hphi1)))); raq = hphi2 - hphi1; 'SI' (('ABS' raq) '<EG' eaq); raq = 0.; 'FINSI'; 'SI' (raq '>EG' 0); hrm = 0.5 * hrm; 'ITERER' hbloc1; 'SINON'; 'QUITTER' hbloc1; 'FINSI'; 'FIN' hbloc1; hphi1 = hphi2; p = hg; htbfonc = ('TEXTE' NOMFCT) xtab p; htbderi = ('TEXTE' NOMDERI) xtab p; 'SI' (hr '>EG' (0.99999*hrm)); hf = hg; hu = hb; 'ITERER' hbloc2; 'FINSI'; hfg = 0 ; hi = 0 ; 'REPETER' hhblo hk; hi = hi + 1; 'FIN' hhblo; hc = (hb-hfg) / hu; hu = hb; hf = hg; h = hg + (hc*h); hkas = 1; 'ITERER' hbloc3; 'FIN' hbloc3; 'FIN' hbloc2; htbfonc = ('TEXTE' NOMFCT) xtab p; 'SI' (IMESS '>EG' 1) ; 'SI' (l > 0) ; ' paramètres linéaires valent respectivement'; 'REPETER' bcl1 l ; 'FIN' bcl1 ; 'SINON' ; 'MESS' ' Il n y a pas de paramètre linéaire'; 'FINSI'; 'SI' (k > 0) ; 'REPETER' bcl1 k ; 'FIN' bcl1 ; 'SINON' ; 'FINSI' ; 'MESS' ' Erreur d estimation : ' hphi ; 'FINSI' ; 'FINSI'; 'FINPROC' q p;
© Cast3M 2003 - Tous droits réservés.
Mentions légales