source: Sophya/trunk/SophyaLib/NTools/simplex.h@ 3494

Last change on this file since 3494 was 2808, checked in by ansari, 20 years ago

MAJ documentation - Reza 14/6/2005

File size: 6.0 KB
RevLine 
[2650]1#ifndef SIMPLEX_SEEN
2#define SIMPLEX_SEEN
3
4#include "machdefs.h"
5#include "tvector.h"
6#include "generalfit.h"
7#include <string>
8#include <vector>
9
10// ---------------------------------------------------------------
11// (C) UPS-LAL R. Ansari , Aout 2004
12// ---------------------------------------------------------------
13// Classe de minimisation (optimisation) non lineaire dans
14// un espace multidimensionnel suivant la methode des simplex.
15// Simplex : Figure geometrique formee de N+1 sommets (points)
16// (points) dans un espace a N dimension
17// La methode d'optimisation codee ici dans la classe MinZSimplex
18// est basee sur celle decrite dans Numerical Recipes ,
19// Chapitre X, Minimization or Maximization of Functions
20// L'algorithme est ameliore sur deux aspects :
21// - Test d'arret plus complexe
22// - Ajout d'une transformation du simplex (ExpandHigh)
23// Reflection,ReflecExpand,ContractHigh,ContractLow+ExpandHigh
24// ----------------------------------------------------------------
25
26using namespace std;
27
28namespace SOPHYA {
29
[2808]30//! Interface definition for multivariable function (used by SimplexMinmizer)
[2650]31class MinZFunction {
32public:
33 //! Constructor with nVar defining the number of variables
34 MinZFunction(unsigned int nVar);
35 virtual ~MinZFunction();
36 //! Returns the value of the function for the point defined by xp[]
37 virtual double Value(double const xp[])=0;
38 //! Returns the number of variables (dimension of xp[]) in method Value()
39 inline int NVar() const {return mNVar;}
40protected:
41 const int mNVar; //!< nombre de variables f(x,y,z,...)
42};
43
[2808]44//! Wrapper class implementing MinZFunction for a GeneralXi2 associated with a GeneralFitData
[2650]45class MinZFuncXi2 : public MinZFunction {
46public:
47 MinZFuncXi2(GeneralXi2* gxi2, GeneralFitData* gd);
48 virtual ~MinZFuncXi2();
49 virtual double Value(double const xp[]);
50protected:
51 GeneralXi2 *mGXi2;
52 GeneralFitData *mGData;
53};
54
55//! Class implementing the Simplex minimisation method
56class MinZSimplex {
57public:
58 static int AutoTest(int tsel=-1, int prtlev=0);
59
60 MinZSimplex(MinZFunction *mzf);
61 virtual ~MinZSimplex();
62
[2808]63 //! Return the parameter space dimension
[2650]64 inline int NDim() { return mZF->NVar(); }
65 // Simplex initial
[2808]66 //! Defines the initial point (center of simplex figure)
[2650]67 inline void SetInitialPoint(Vector& point) { mPoint0 = point; }
[2808]68 //! Defines the step along each dimension to construct the simplex from initial point
[2650]69 inline void SetInitialStep(Vector& step) { mStep0 = step; }
70
[2808]71 //! Set the info/debug print level
[2650]72 inline void SetPrtLevel(int lev=0) { mPrt = lev; }
[2808]73 //! Return the current print level
[2650]74 inline int PrtLevel() { return mPrt; }
75
[2808]76 //! Set the maximum number of iteration
[2650]77 inline void SetMaxIter(int max = 100000) { mMaxIter = max; }
[2808]78 //! Return the current max iter
[2650]79 inline int MaxIter() { return mMaxIter; }
[2808]80 //! Return the number of iterations performed
[2650]81 inline int NbIter() { return mIter; }
[2808]82 //! Return the stop reason
[2650]83 inline int StopReason() { return mStop; }
[2808]84 //! Return the stop reason and a description string (\b s)
[2650]85 int StopReason(string& s);
86
87 // On minimise f(x) f=mZF->Value() ,
88 // f_max = max(f) sur simplex , f_min = min(f) sur simplex
89 // fm = (abs(f_max)+abs(f_min))
90 // [Delta f] = abs(f_max-f_min)
91 // [Delta f/f]simplex = 2.*Delta f / fm
92 // fm2 = (abs(f_max)+abs(f_max(iter-1)))
93 // [Delta f_max/f_max]iter = [f_max(iter-1)-f_max]/fm2
94 // Test d'arret :
95 // fm < mTol0 OU
96 // [Delta f/f]simplex < mTol1 mRep1 fois de suite OU
97 // [Delta f_max/f_max]iter < mTol2 mRep2 fois de suite
[2808]98
99 //! Define the tolerances for the various convergence tests
[2650]100 inline void SetStopTolerance(double tol0=1.e-39, double tol1 = 1.e-3, int rep1=5,
101 double tol2=1.e-4, int rep2=5)
102 { mTol0 = tol0; mTol1 = tol1; mRep1 = rep1; mTol2 = tol2, mRep2 = rep2; }
103
104 // Controle des facteurs de deformation du simplex:
105 // Alpha = Facteur d'homothetie pour la reflexion simple (Reflection)
106 // Gamma = Facteur d'homothetie pour la reflexion+expansion (ReflecExpand)
107 // Beta = Facteur d'homothetie pour la contraction pour le sommet haut f_max (ContractHigh)
108 // Beta2 = Facteur d'homothetie pour la contraction vers le sommet bas f_min (ContractLow)
109 // Gamma2 = Facteur d'homothetie pour la l'extension pour le sommet haut ExpandHigh
[2808]110
111 //! Define the similarity (homothetic) factors for the different simplex transformations
[2650]112 inline void SetControls(double alpha=1., double beta=0.5, double beta2=0.5,
113 double gamma=2.0, double gamma2=2.0)
114 { mAlpha = alpha; mBeta = beta; mBeta2 = beta2; mGamma = gamma; mGamma2 = gamma2;}
115
[2808]116 //! Return the the homothetic factor for Reflection
[2650]117 inline double Alpha() { return mAlpha; }
[2808]118 //! Return the the homothetic factor for ContractHigh (contraction away from high point)
[2650]119 inline double Beta() { return mBeta; }
[2808]120 //! Return the the homothetic factor for ContractLow (contraction toward the low point)
[2650]121 inline double Beta2() { return mBeta2; }
[2808]122 //! Return the the homothetic factor for ReflecExpand (reflection+expansion)
[2650]123 inline double Gamma() { return mGamma; }
[2808]124 //! Return the the homothetic factor for ExpandHigh (expansion along high point)
[2650]125 inline double Gamma2() { return mGamma2; }
126
127 // Fonction de minimisation - Rc=0, OK, convergence , Rc>0, Non convergence
128 // Voir StopReason(string& s)
129 virtual int Minimize(Vector& fpoint);
130
131protected:
132 int FindMinMax12(Vector& fval, int& ilo, int& ihi, int& inhi);
133 inline double Value(Vector& point) { return mZF->Value(point.Data()); }
134
135 MinZFunction* mZF;
136 int mMaxIter, mIter;
137 int mStop;
138 int mPrt;
139
140 Vector mPoint0;
141 Vector mStep0;
142 // vector< Vector > simplex0;
143 // vector< Vector > simplex_cur;
144 double mAlpha, mBeta, mBeta2, mGamma, mGamma2;
145 double mTol0, mTol1, mTol2;
146 int mRep1,mRep2;
147};
148
149} // namespace SOPHYA
150
151#endif
Note: See TracBrowser for help on using the repository browser.