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).