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;