Changeset 3083 in Sophya for trunk/SophyaLib/NTools/generalfit.cc
- Timestamp:
- Sep 19, 2006, 3:44:03 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/generalfit.cc
r2615 r3083 6 6 #include <math.h> 7 7 #ifdef __MWERKS__ 8 8 #include "mwerksmath.h" // Portage mac D. Y. 9 9 #include "unixmac.h" 10 10 #endif … … 17 17 18 18 #define EPS_FIT_MIN 1.e-8 19 20 //================================================================21 // GeneralFunction22 //================================================================23 24 /*!25 \class SOPHYA::GeneralFunction26 \ingroup NTools27 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* parm55 , 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 numPar74 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 parametres85 */86 void GeneralFunction::SetDeltaParm(double const* dparam)87 {88 for(int i=0;i<mNPar;i++) deltaParm[i] = dparam[i];89 }90 91 //================================================================92 // GeneralFunc93 //================================================================94 95 /*!96 \class SOPHYA::GeneralFunc97 \ingroup NTools98 Classe de fonctions parametrees a plusieurs variables99 derivant de ``GeneralFunction''. Permet de definir100 une fonction a fiter sans passer par une classe derivee101 en utilisant l'ecriture courante du C. La fonction102 retournant les derivees par rapport aux parametres du fit103 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 fonction110 ``funder'' qui retourne les valeurs des derivees par rapport111 aux parametres du fit.112 \verbatim113 ----------------------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 derivees124 GeneralFunc myfunc(2,7,gaussc);125 GeneralFit myfit(&myfunc);126 ...127 myfit.Fit();128 ...129 // Fit AVEC calcul automatique des derivees130 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 C136 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 / parametres145 // 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 \endverbatim154 */155 GeneralFunc::GeneralFunc(unsigned int nvar, unsigned int npar156 , 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 }176 19 177 20 //================================================================
Note:
See TracChangeset
for help on using the changeset viewer.