1#ifndef __JFIT__JSIMPLEX__ 
    2#define __JFIT__JSIMPLEX__ 
   18namespace JPP { 
using namespace JFIT; }
 
   41  template<
class JModel_t>
 
   43    public JMessage< JSimplex<JModel_t> >
 
   70    template<
class JFunction_t, 
class T>
 
   71    double operator()(
const JFunction_t& fit, T __begin, T __end)
 
   76      double chi2_old = 
evaluate(fit, __begin, __end);
 
   78      const int N = 
step.size();
 
   92          DEBUG(
"old: " << 
FIXED(12,5) << chi2_old << endl);
 
   96          for (
int i = 0; i != N; ++i) {
 
  100            chi2[i] = (*this)(fit, __begin, __end, 
step[i]);
 
  108          const double chi2_new = (*this)(fit, __begin, __end, 
wall);
 
  110          DEBUG(
"new: " << 
FIXED(12,5) << chi2_new << endl);
 
  113          if (fabs(chi2_old - chi2_new) < 
EPSILON*fabs(chi2_old)) {
 
  123          const double fe = 
evaluate(fit, __begin, __end);
 
  128          for (
int i = N-1; i != 0; --i) {
 
  129            chi2[i] = chi2[i-1] - chi2[i];
 
  132          chi2[0] = chi2_old - chi2[0];
 
  137          for (
int i = 0; i != N; ++i) {
 
  143          const double fn = chi2_new;
 
  144          const double f0 = chi2_old;
 
  145          const double ff = f0 - fn - df;
 
  149          if (fe < f0 && 2.0*(f0 - 2.0*fn + fe)*ff*ff < (f0-fe)*(f0-fe)*df) {
 
  151            for (
int i = 0; i != N - 1; ++i) {
 
 
  177    template<
class JFunction_t, 
class T>
 
  178    double operator()(
const JFunction_t& fit, T __begin, T __end, 
const JModel_t& 
step)
 
  186      double chi2_old = 
evaluate(fit, __begin, __end);
 
  194        const double chi2_new = 
evaluate(fit, __begin, __end);
 
  196        DEBUG(
"step: " << setw(3) << i << 
' ' << 
FIXED(12,5) << chi2_old << 
' ' << 
FIXED(12,5) << chi2_new << 
' ' << 
FIXED(5,2) << lambda << endl);
 
  198        if (fabs(chi2_old - chi2_new) < 
EPSILON*fabs(chi2_old)) {
 
  200          if (chi2_new > chi2_old) {
 
  214        if (chi2_new < chi2_old) {
 
  230        lambda = factor * lambda;
 
 
  252    template<
class JFunction_t, 
class T>
 
  253    inline double evaluate(
const JFunction_t& fit, T __begin, T __end)
 const 
  257      for (T hit = __begin; hit != __end; ++hit) {
 
  258        chi2 += fit(
value, *hit);
 
 
 
  273  template<
class JModel_t>
 
  280  template<
class JModel_t>
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++,...
 
double operator()(const JFunction_t &fit, T __begin, T __end)
Multi-dimensional fit.
 
static int MAXIMUM_ITERATIONS
maximal number of iterations
 
std::vector< JModel_t > step
 
double operator()(const JFunction_t &fit, T __begin, T __end, const JModel_t &step)
1D fit.
 
static double EPSILON
maximal distance to minimum
 
JSimplex()
Default constructor.
 
double evaluate(const JFunction_t &fit, T __begin, T __end) const
Evaluate chi2 for given data set.
 
Auxiliary classes and methods for linear and iterative data regression.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Auxiliary data structure for floating point format specification.
 
Auxiliary class for handling debug parameter within a class.
 
static int debug
debug level (default is off).