source: Sophya/trunk/SophyaLib/NTools/generalfit.h@ 3468

Last change on this file since 3468 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: 7.5 KB
RevLine 
[220]1// This may look like C code, but it is really -*- C++ -*-
2#ifndef GENERALFIT_SEEN
3#define GENERALFIT_SEEN
4
[244]5#include "pexceptions.h"
[514]6#include "tvector.h"
[220]7#include "generaldata.h"
[3083]8#include "generalfunc.h"
[220]9
[552]10namespace SOPHYA {
[307]11
[220]12//================================================================
13// GeneralXi2
14//================================================================
15
[926]16//! Classe de Xi2 a plusieurs parametres
[307]17class GeneralXi2 {
[220]18public:
19 GeneralXi2(unsigned int nPar);
20 virtual ~GeneralXi2();
21
[914]22 /*!
23 Valeur du Xi2 a definir par l'utilisateur (fct virtuelle pure)
24 a partir des donnees de `data'. l'utilisateur doit egalement
25 retourner le nombre de points de mesure utilises dans le calcul
26 du Xi2 (`ndataused').
27 */
[220]28 virtual double Value(GeneralFitData& data, double* parm, int& ndataused)=0;
29 virtual double Derivee(GeneralFitData& data, int i, double* parm);
30 virtual double Derivee2(GeneralFitData& data, int i,int j, double* parm);
31
32 void SetDeltaParm(int numPar, double delta=0.);
33 void SetDeltaParm(double const* dparam);
34
[914]35 //! Retourne le nombre de parametres Ai.
[220]36 inline int NPar() const {return mNPar;}
37
38protected:
[914]39 const int mNPar; //!< nombre de parametres
[220]40
41 double *deltaParm;
42};
43
44//================================================================
45// GENERALFIT
46//================================================================
47
[914]48//! Classe de fit d'une GeneralFunction sur une GeneralFitData
[307]49class GeneralFit {
[220]50public:
51 GeneralFit(GeneralFunction* f);
52 GeneralFit(GeneralXi2* f);
53 ~GeneralFit();
54
55 void WriteStep(char *filename = NULL);
56 void SetDebug(int level = 0);
57 void SetMaxStep(int n = 100);
58 void SetLambda_Fac(double fac = 10.);
59 void SetStopChi2(double s = 0.01);
60 void SetEps(double ep = 1.e-8);
61 void SetEps(int n,double ep = 1.e-8);
62 void SetStopMx(int nstopmx = 3, double stopchi2 = -1.);
63 void SetStopLent(int nstoplent = 3);
64 void SetFunction(GeneralFunction*);
65 void SetFuncXi2(GeneralXi2*);
66 void SetData(GeneralFitData*);
67 void SetParam(int n,double value, double step
68 ,double min=1., double max=-1.);
69 void SetParam(int n,string const&
70 ,double value, double step
71 ,double min=1., double max=-1.);
72 void SetParam(int n,double value);
73 void SetStep(int n,double value);
74 void SetMinStepDeriv(int i,double val = 0.);
75 void SetMinStepDeriv(double val = 0.);
76 void SetBound(int n,double min,double max);
77 void SetBound(int n);
78 void SetUnBound(int n);
79 void SetUnBound();
80 void SetFix(int n,double v);
81 void SetFix(int n);
82 void SetFree(int n);
83 void SetFree();
84
85 double GetParm(int);
[938]86 TVector<r_8> GetParm();
[220]87 double GetParmErr(int);
88 double GetCoVar(int,int);
89 double GetStep(int n);
90 double GetMax(int n);
91 double GetMin(int n);
[914]92 //! Retourne le Chi2
[220]93 inline double GetChi2() const {return Chi2;};
[914]94 //! Retourne le Chi2 reduit
[220]95 inline double GetChi2Red() const {
96 if(mNddl<=0) return (double) mNddl;
97 return Chi2/(double) mNddl;
98 };
[914]99 //! Retourne la precision de convergence pour le parametre i.
[220]100 inline double GetEps(int i) const {return Eps(i);};
[914]101 //! Retourne le nombre de degres de liberte
[220]102 inline int GetNddl() const {return mNddl;};
[914]103 //! Retourne le nombre d'iterations
[220]104 inline int GetNStep() const {return nStep;};
[914]105 //! Retourne le nombre de variables
[220]106 inline int GetNVar() const {return mNVar;};
[914]107 //! Retourne le nombre de parametres
[220]108 inline int GetNPar() const {return mNPar;};
[914]109 //! Retourne le nombre de parametres libres
[220]110 inline int GetNFree() const {return mNParFree;};
[914]111 //! Retourne le nombre de parametres bornes
[220]112 inline int GetNBound() const {return mNParBound;};
[914]113 //! Retourne le nstop de convergence
[220]114 inline int GetNStop() const {return nStop;};
[914]115 //! Retourne le nstop de convergence lente.
[220]116 inline int GetNStopLent() const {return nStopLent;};
[914]117 //! Retourne le pointeur sur la GeneralFunction utilisee.
[220]118 inline GeneralFunction* GetFunction() const {return mFunction;};
[914]119 //! Retourne le pointeur sur la GeneralFitData utilisee.
[220]120 inline GeneralFitData* GetGData() const {return mData;};
121
122 void PrintStatus();
123 void PrintFit();
124 void PrintParm(int n);
125 void PrintParm();
126
127 int Fit();
128 double ReCalChi2(int& nddl, double* par = NULL);
[307]129 GeneralFitData DataResidus(bool clean=true);
130 GeneralFitData DataFunction(bool clean=true);
[220]131 void PrintFitErr(int rc);
132
133protected:
[914]134 int mNtry; //!< numero d'appel de la routine de fit.
135 int mNVar; //!< nombre de variables f(x,y,z,...)
136 int mNPar; //!< nombre de parametres
137 int mNParFree; //!< nombre de parametres libres
138 int mNParBound; //!< nombre de parametres bornes
[220]139 GeneralFunction* mFunction;
140 GeneralXi2* mFuncXi2;
141 GeneralFitData* mData;
142
[938]143 TVector<r_8> Param;
144 TVector<r_8> errParam;
145 TVector<r_8> stepParam;
146 TVector<r_8> minParam;
147 TVector<r_8> maxParam;
148 TVector<r_8> minStepDeriv;
149 TVector<r_8> Eps;
[220]150 unsigned short int* fixParam;
151 unsigned short int* boundParam;
152 string* nameParam;
153
154 double Lambda_Fac;
155 double stopChi2;
156 int maxStep;
157 int nStopMx;
158 double stopChi2SMx;
159 int nStopLent;
160 int debugLevel;
161 FILE *FileStep;
162
[938]163 TMatrix<r_8> ATGA;
164 TVector<r_8> BETA;
165 TMatrix<r_8> ATGA_Try;
166 TVector<r_8> BETA_Try;
167 TVector<r_8> C;
168 TVector<r_8> D;
[220]169
170 double Chi2;
171 int mNddl;
172 int nStep;
173 int nStop, nStopL;
174 double Lambda;
175
176 // Fonctions privees
[938]177 void write_in_step(double ci2,TVector<r_8>& par);
178 void General_Init(void);
179 void TryFunc(TVector<r_8>& par,TVector<r_8>& par_tr);
180 void TryXi2(TVector<r_8>& par,TVector<r_8>& par_tr);
181 void CheckSanity();
182 void Set_Bound_C_D(int i);
183 void Set_Bound_C_D();
184 double p_vers_tr(int i,double p);
185 TVector<r_8> p_vers_tr(TVector<r_8> const& p);
186 void p_vers_tr(TVector<r_8> const& p,TVector<r_8>& tr);
187 double tr_vers_p(int i,double tr);
188 TVector<r_8> tr_vers_p(TVector<r_8> const& tr);
189 void tr_vers_p(TVector<r_8> const& tr,TVector<r_8>& p);
190 double c_dp_vers_dtr(int i,double tr);
191 TVector<r_8> dp_vers_dtr(TVector<r_8> const& dp,TVector<r_8> const& tr);
192 void dp_vers_dtr(TVector<r_8> const& dp,TVector<r_8> const& tr,TVector<r_8>& dtr);
193 double c_dtr_vers_dp(int i,double tr);
194 TVector<r_8> dtr_vers_dp(TVector<r_8> const& dtr,TVector<r_8> const& tr);
195 int put_in_limits_for_deriv(TVector<r_8> const& p,TVector<r_8>& dp,double dist=0.66);
196 inline void dtr_vers_dp(TVector<r_8> const& dtr,TVector<r_8> const& tr,TVector<r_8>& dp)
[220]197 { for(int i=0;i<mNPar;i++)
198 { if( fixParam[i] ) continue;
199 if( ! boundParam[i] ) dp(i) = dtr(i);
200 else dp(i) = D(i)/(1.+tr(i)*tr(i)) * dtr(i); }
201 };
202};
203
[307]204} // Fin du namespace
205
[220]206#endif
Note: See TracBrowser for help on using the repository browser.