source: Sophya/trunk/SophyaLib/NTools/generalfunc.cc@ 3195

Last change on this file since 3195 was 3083, checked in by cmv, 19 years ago

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

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