1 #ifndef __JFIT__JSIMPLEX__
2 #define __JFIT__JSIMPLEX__
18 namespace JPP {
using namespace JFIT; }
41 template<
class JModel_t>
43 public JMessage< JSimplex<JModel_t> >
68 template<
class JFunction_t,
class T>
69 double operator()(
const JFunction_t& fit, T __begin, T __end)
74 double chi2_old =
evaluate(fit, __begin, __end);
76 const int N =
step.size();
86 DEBUG(
"old: " <<
FIXED(12,5) << chi2_old << endl);
88 const JModel_t p0(
value);
90 for (
int i = 0; i != N; ++i) {
94 chi2[i] = (*this)(fit, __begin, __end,
step[i]);
99 JModel_t wall =
value - p0;
101 const double chi2_new = (*this)(fit, __begin, __end, wall);
103 DEBUG(
"new: " <<
FIXED(12,5) << chi2_new << endl);
106 if (fabs(chi2_old - chi2_new) <
EPSILON*fabs(chi2_old)) {
116 const double fe =
evaluate(fit, __begin, __end);
121 for (
int i = N-1; i != 0; --i) {
122 chi2[i] = chi2[i-1] - chi2[i];
125 chi2[0] = chi2_old - chi2[0];
130 for (
int i = 0; i != N; ++i) {
136 const double fn = chi2_new;
137 const double f0 = chi2_old;
138 const double ff = f0 - fn - df;
142 if (fe < f0 && 2.0*(f0 - 2.0*fn + fe)*ff*ff < (f0-fe)*(f0-fe)*df) {
144 for (
int i = 0; i != N - 1; ++i) {
170 template<
class JFunction_t,
class T>
171 double operator()(
const JFunction_t& fit, T __begin, T __end,
const JModel_t&
step)
179 double chi2_old =
evaluate(fit, __begin, __end);
185 const double chi2_new =
evaluate(fit, __begin, __end);
187 DEBUG(
"step: " << setw(3) << i <<
' ' <<
FIXED(12,5) << chi2_old <<
' ' <<
FIXED(12,5) << chi2_new <<
' ' <<
FIXED(5,2) << lambda << endl);
189 if (fabs(chi2_old - chi2_new) <
EPSILON*fabs(chi2_old)) {
191 if (chi2_new > chi2_old) {
203 if (chi2_new < chi2_old) {
217 lambda = factor * lambda;
239 template<
class JFunction_t,
class T>
240 inline double evaluate(
const JFunction_t& fit, T __begin, T __end)
const
244 for (T hit = __begin; hit != __end; ++hit) {
245 chi2 += fit(
value, *hit);
256 template<
class JModel_t>
263 template<
class JModel_t>
static int debug
debug level (default is off).
double operator()(const JFunction_t &fit, T __begin, T __end, const JModel_t &step)
1D fit.
Auxiliary data structure for floating point format specification.
I/O formatting auxiliaries.
General purpose messaging.
double operator()(const JFunction_t &fit, T __begin, T __end)
Multi-dimensional fit.
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++...
JSimplex()
Default constructor.
double evaluate(const JFunction_t &fit, T __begin, T __end) const
Evaluate chi2 for given data set.
static int MAXIMUM_ITERATIONS
maximal number of iterations
static double EPSILON
maximal distance to minimum
#define DEBUG(A)
Message macros.
Auxiliary class for handling debug parameter within a class.
std::vector< JModel_t > step