Opérateur AJUSTE DATE 99/08/17 date 21/03/95 procédure AJUSTE ---------------- Q P = AJUSTE TAB1 TAB2; TAB1.'X' TAB2.'PMIN' TAB1.'F' TAB2.'PMAX' TAB1.'K' TAB2.'PRECISION' (facultatif) TAB1.'L' TAB2.'MXTER' (facultatif) TAB2.'POIDS' (facultatif) TAB1.'IMPRESSION' (facultatif) Objet : -------- Soit une fonction F(x,y,z...,p1,..,pk) mise sous la forme: F(x,p)=q1*f1(x,y,z,.,p1,..,pk) + q2*f2(x,y,z,.,p1,..,pk) + q3*f3(x,y,z,.,p1,..,pk) +.. ..+ ql*fl(x,y,z,.,p1,..,pk) + g(x,y,z,.,p1,..,pk) qi (i=1,l) sont les paramètres linéaires. pj (j=1,k) sont les paramètres non linéaires. La procédure ajuste ces différents paramètres afin que la fonction passe au mieux dans une série de n couples ( (x,y,z,...);Fdi(x,y,z,..) ) fournie par l' utilisateur. En fait, on cherche à minimiser la fonction : G =[ ((poids(i)*(F(x,p)-Fdi(x,y,z..)))**2 ] somme sur i=1,n Données : ---------- TAB1.'X':TABLE indicée par des entiers i=1,n qui contient le(s) LISTREEL(s) x,y,z,..... TAB1.'F':LISTREEL des ordonnés (F(x,y,z...). TAB1.'K':ENTIER, nombre de paramètres non linéaires. TAB1.'L':ENTIER, nombre de paramètres linéaires. TAB1.'IMPRESSION' : ENTIER donne la frequence des impressions TAB2.'PMIN' :LISTREEL des valeurs minimum de p. TAB2.'PMAX' :LISTREEL des valeurs maximum de p. UN ENTIER :TAB1.'IMPRESSION' donne la frequence des impressions, la valeur par defaut est toutes les 20 itération. Un LISTREEL tab2.'precision'facultatif peut être crée, c'est le critère de précision de convergence pour les k paramètres non linéaires.(Par défaut la précision est 1.e-7) Un ENTIER tab2.'MXTER' facultatif peut être crée, c'est le nombre maximum d'itérations (par défaut 100). TAB2.'POIDS':LISTREEL des valeurs de poids à affecter à chacun des points de mesure fournis. Par défaut chaque points a le meme poids. Sortie : -------- Q et P sont des LISTREELs contenant les paramètres qi et pi. Utilisation : -------------- Deux procédures sont à créer par l'utilisateur. -Procédure FCT: Son but est de calculer la fonction à ajuster connaissant les valeurs des abscisses x,y,. et ceci pour un jeu de paramètres p donné. En fait, on demande de calculer les fonctions f1,f2,...,fl et la fonction g. Pour chaque fonction fi, la procédure calcule autant de valeurs qu'il y a de valeurs dans x,y,z .. Le résultat doit etre mis sous la forme d'un objet TABLE. tbfonc=FCT xtab p; En argument FCT recevra la table TAB2.'X', ainsi que le LISTREEL p qui contient les valeurs courantes de P. La table doit se mettre sous la forme suivante: tbfonc.'F'.i = listréel des valeurs de fi tbfonc.'G' = listréel des valeurs de g Les paramètres linéaires qi n'ont pas à être écrit. -Procédure DERI: Elle construit une table de listréels contenant les valeurs des fonctions f1,f2,...,fl et g derivées par rapport aux paramètres non linéaires pj pour chaque valeur de x,y,z.. et de p. tbderi=DERI xtab p; En argument DERI recevra la table TAB2.'X', ainsi que le LISTREEL p. La table doit être crée de la façon suivante: tbderi.'F'. j . i = listréel des valeurs de dfi/dpj tbderi.'G'. j = listréel des valeurs de dg/dpj Remarques : ----------- - Les abscisses étant dans une listréel , il faut que les constantes soient exprimées sous forme de listréel. ex: f1(x)=x+1 donne f1(x)=x+(prog n*1); n étant la dimension de x. - Si la fonction g n'existe pas il est quand même nécessaire d'introduire dans les procédures FCT et DERI des valeurs nulles. ex: g(x)=prog n*0; n dimension de x. - Attention, les fonctions sinusoidales appellent les les opérateurs de castem 2000 qui utilisent es degrés. * EXEMPLE : * On cherche a interpoler un nuage de points avec la fonction * suivante: * the given sets of points ( x , f(x)) must be adjusted with * a function as follows : * * f(x) =( A * (x**B ))+ (C * sin(D*x + B)) + (E * x) * * les deux parametres p1 et p2 non linéaires sont B et D. * The two non linear parameters p1 and p2 are B and D. * * les autres A,C,E sont linéaires.On peut donc mettre la * fonction sous la forme : * A,C,E are linear parameters. It is possible to write the function * in the following way : * f(x)= A*f1(x) +C*f2(x)+E*f3(x) * * PROCEDURES: FCT * debproc fct xtab*table p*listreel; tab1=table; tab2=table; x = xtab . 1; n=dime x; * fonction f1 tab1 . 1=x**(extr p 1); * fonction f2 aa=(((extr p 2)*x) + (prog n*(extr p 1)))*180. / PI; tab1 . 2=sin(aa ); * fonction f3 tab1 . 3 = x; *remplissage de la table résultat * filling of the result table tab2.'F'=tab1; * fonction g tab2.'G'=prog n*0; finproc tab2; * PROCEDURES: DERI debproc deri xtab*table p*listreel; tab1=table;tab2=table; tabg=table;tabf=table;tab=table; x = xtab . 1; n=dime x; * fonction df1/dp1 tab1 . 1=(log x)*(x**(extr p 1)); * fonction df2/dp1 aa = (((extr p 2)*x) + (prog n*(extr p 1)))*180. / PI; tab1 . 2=cos ( aa); * fonction df3/dp1 tab1 . 3=prog n*0; * fonction df1/dp2 tab2 . 1=prog n*0; * fonction df2/dp2 tab2 . 2 = x * ( cos (aa)); * fonction df3/dp2 tab2 . 3=prog n*0; * fonction dg/dp1 tabg . 1=prog n*0; * fonction dg/dp2 tabg . 2=prog n*0; tabf . 1=tab1; tabf . 2=tab2; tab.'F'=tabf;tab.'G'=tabg; finproc tab; * ***** Exemple éxécution * definition de la fonction pour le calcul des couples x,F(x) x=prog 0.01 pas 0.01 1.; * posons A = 1 ; B=0.5 ; C=1; D=1; E=3.14159...(pi) af1 = x ** 0.5; aa = (X + ( prog 100*0.5))* 180. / PI;cf2 = sin aa; ef3 = pi * x;y = af1 + cf2 + ef3; k=2; l=3; xtab = table; xtab . 1 = x; tab1=table; tab2=table; tab1.'X'=xtab; tab1.'F'=y; tab1.'K'=k; tab1.'L'=l; tab2.'PMIN'=prog k*0; tab2.'PMAX'=prog k*10; tab2.'POIDS' = prog 0.75 pas 0.01 1.74; q p=ajuste tab1 tab2; * recalcul de F(x) pour comparaison avec courbe initiale * computation of f(x) for comparison with initial curve n=dime x;B = extraire p 1;D = extraire p 2; A = extraire q 1;C = extraire q 2;E = extraire q 3; f1= A * ( x **B);aa = ((D*x) + (prog n*B))*180. / PI; f2 = C * ( sin (aa));f3 = E * x;y1 = f1 + f2 + f3; ev = evol roug manu 'X' x 'Y' y ; ev1 = evol bleu manu 'X' x 'Y1' y1; evt = ev et ev1;dess evt;