Changeset 3083 in Sophya for trunk/SophyaLib/NTools/generalfit.cc


Ignore:
Timestamp:
Sep 19, 2006, 3:44:03 PM (19 years ago)
Author:
cmv
Message:

extraction de GeneralFunction+ GeneralFunc de generalfit.h,cc -> generalfunc.h,cc cmv 19/09/2006

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/NTools/generalfit.cc

    r2615 r3083  
    66#include <math.h>
    77#ifdef __MWERKS__
    8    #include "mwerksmath.h" // Portage mac D. Y.
     8#include "mwerksmath.h" // Portage mac D. Y.
    99#include "unixmac.h"
    1010#endif
     
    1717
    1818#define EPS_FIT_MIN 1.e-8
    19 
    20 //================================================================
    21 // GeneralFunction
    22 //================================================================
    23 
    24 /*!
    25   \class SOPHYA::GeneralFunction
    26   \ingroup NTools
    27    Classe de fonctions parametrees a plusieurs variables:
    28   \f$ F[x1,x2,x3,...:a1,a2,a3,...] \f$
    29 */
    30 
    31 //////////////////////////////////////////////////////////////////////
    32 /*!
    33  Creation d'une fonction de `nVar' variables et `nPar' parametres:
    34  \f$ F[x(1),x(2),x(3),...x(nVar) : a(1),a(2),a(3),...,a(nPar)] \f$
    35 */
    36 GeneralFunction::GeneralFunction(unsigned int nVar, unsigned int nPar)
    37   : mNVar(nVar), mNPar(nPar)
    38 {
    39  ASSERT( nVar > 0 && nPar > 0 );
    40  deltaParm = new double[nPar];
    41  tmpParm   = new double[nPar];
    42 }
    43 
    44 GeneralFunction::~GeneralFunction()
    45 {
    46  delete[] deltaParm;
    47  delete[] tmpParm;
    48 }
    49 
    50 //////////////////////////////////////////////////////////////////////
    51 /*!
    52   Valeur et Derivees de la fonction (fct virtuelle par defaut).
    53 */
    54 double GeneralFunction::Val_Der(double const xp[], double const* parm
    55                                , double *DgDpar)
    56 {
    57  for(int i=0;i<mNPar;i++) tmpParm[i] = parm[i];
    58  {for(int i=0;i<mNPar;i++) {
    59    double d = deltaParm[i];
    60    if(d==0.) { DgDpar[i] = 0.; continue;}
    61    tmpParm[i] -= d/2.;
    62    double vg = Value(xp,tmpParm);
    63    tmpParm[i] += d;
    64    double vd = Value(xp,tmpParm);
    65    DgDpar[i] = (vd - vg)/d;
    66    tmpParm[i] = parm[i];
    67  }}
    68  return Value(xp, parm);
    69 }
    70 
    71 //////////////////////////////////////////////////////////////////////
    72 /*!
    73   Definition de la variation du parametre numPar
    74   pour calculer la derivee automatiquement.
    75 */
    76 void GeneralFunction::SetDeltaParm(int numPar, double d)
    77 {
    78  ASSERT(numPar >= 0 && numPar < mNPar);
    79  deltaParm[numPar] = d;
    80 }
    81 
    82 
    83 /*!
    84   Idem precedente fonction mais pour tous les parametres
    85 */
    86 void GeneralFunction::SetDeltaParm(double const* dparam)
    87 {
    88  for(int i=0;i<mNPar;i++) deltaParm[i] = dparam[i];
    89 }
    90 
    91 //================================================================
    92 // GeneralFunc
    93 //================================================================
    94 
    95 /*!
    96   \class SOPHYA::GeneralFunc
    97   \ingroup NTools
    98   Classe de fonctions parametrees a plusieurs variables
    99   derivant de ``GeneralFunction''. Permet de definir
    100   une fonction a fiter sans passer par une classe derivee
    101   en utilisant l'ecriture courante du C. La fonction
    102   retournant les derivees par rapport aux parametres du fit
    103   peut etre egalement fournie (optionnel).
    104 */
    105 
    106 /////////////////////////////////////////////////////////////////
    107 /*!
    108   Createur, on passe le nom ``fun'' de la fonction a la mode C.
    109   On peut optionellement egalement passer le nom de la fonction
    110   ``funder'' qui retourne les valeurs des derivees par rapport
    111   aux parametres du fit.
    112   \verbatim
    113     ----------------------
    114     Exemple d'utilisation:
    115     ----------------------
    116     include "generalfit.h"
    117     ...
    118     double   gaussc(double const* x,double const* p);
    119     double d_gaussc(double const* x,double const* p,double* dp);
    120     ...
    121     main {
    122      ...
    123      // Fit SANS calcul automatique des derivees
    124      GeneralFunc      myfunc(2,7,gaussc);
    125      GeneralFit       myfit(&myfunc);
    126      ...
    127      myfit.Fit();
    128      ...
    129      // Fit AVEC calcul automatique des derivees
    130      GeneralFunc      myfunc(2,7,gaussc,d_gaussc);
    131      GeneralFit       myfit(&myfunc);
    132      ...
    133      myfit.Fit();
    134     }
    135     // Definition de la fonction a fitter a la mode C
    136     double gaussc(double const* x,double const* p)
    137     // Fonction: X=(x[0]-p[1])/p[3], Y=(x[1]-p[2])/p[4],
    138     //  f = p[0]*exp{-0.5*[X^2+Y^2-2*p[5]*X*Y]} + p[6]
    139     {
    140      double X = (x[0]-p[1])/p[3];
    141      double Y = (x[1]-p[2])/p[4];
    142      return p[0]*exp(-(X*X+Y*Y-2*p[5]*X*Y)/2)+p[6];
    143     }
    144     // Definition de la fonction des derivees / parametres
    145     // Cette fonction retourne aussi la valeur de la fonction a fitter.
    146     double d_gaussc(double const* x,double const* p,double* dp)
    147     {
    148      dp[0] = derivee de gaussc par rapport au parametre p[0]
    149      ...
    150      dp[6] = derivee de gaussc par rapport au parametre p[6]
    151      return gaussc(x,p);
    152     }
    153   \endverbatim
    154 */
    155 GeneralFunc::GeneralFunc(unsigned int nvar, unsigned int npar
    156              , double (*fun) (double const*, double const*)
    157              , double (*funder) (double const*, double const*, double*) )
    158 : GeneralFunction(nvar,npar), tmpFun(fun), tmpFunDer(funder)
    159 {
    160 }
    161 
    162 GeneralFunc::~GeneralFunc()
    163 {
    164 }
    165 
    166 double GeneralFunc::Value(double const xp[], double const* Par)
    167 {
    168 return tmpFun(xp,Par);
    169 }
    170 
    171 double GeneralFunc::Val_Der(double const xp[],double const* parm, double* DgDpar)
    172 {
    173 if(tmpFunDer) return tmpFunDer(xp,parm,DgDpar);
    174   else        return GeneralFunction::Val_Der(xp,parm,DgDpar);
    175 }
    17619
    17720//================================================================
Note: See TracChangeset for help on using the changeset viewer.