25 #include "tbci/basics.h"
26 #include "tbci/vector.h"
27 #include "tbci/matrix.h"
28 #include "tbci/constants.h"
29 #include "tbci/solver/gauss_jordan.h"
46 # pragma interface "LM_fit.h"
53 #define DELTA(i,j) ((i==j)?1:0)
62 INST(template <typename T>
class Vector friend \
63 int Basis_Trafo (
long int,
long int,
Vector<T>&);)
74 if (value == 0)
return 1;
92 INST(template <typename T>
class Vector friend \
114 STD__ cerr <<
"\n error: partial_del: derivate variable index out of range \n";
118 buf_plus2 =
x; buf_minus2 =
x; buf_plus2(mu) += hh*2; buf_minus2 -= hh*2;
119 a(0,0) = (-(*func)(buf_plus2,
p) + 8.0*(*func)(
buf_plus,
p)
120 - 8.0*(*func)(
buf_minus,
p) + (*func)(buf_minus2,
p)) / (hh*12.0);
125 for (
int i = 1; i <
NTAB; i++) {
129 buf_plus2 =
x; buf_minus2 =
x; buf_plus2(mu) += hh*2; buf_minus2 -= hh*2;
130 a(0,i) = (-(*func)(buf_plus2,
p) + 8.0*(*func)(
buf_plus,
p)
131 - 8.0*(*func)(
buf_minus,
p) + (*func)(buf_minus2,
p)) / (hh*12.0);
137 a(j,i) = (
a(j-1,i)*fac -
a(j-1,i-1))/(fac-1.0);
151 INST(template <typename T>
class Vector friend \
154 template <typename T>
167 INST(template <typename T>
class Vector friend \
171 template <typename T>
191 INST(template <typename T>
class Vector friend \
196 long int,
int,
char);)
198 template <typename T>
207 int plen=pmin.
size();
223 STD__ cout <<
"\n parameter space discretisation with " << len <<
" points in progress ... \n ";
224 for (
REGISTER int j = 0; j < plen; j++)
226 for (
long int i=0; i<
len; i++) {
228 if ( !Basis_Trafo(i, res, index) )
229 STD__ cerr <<
"\n error: basis trafo failed\n";
234 for (
int l=0; l<
max_it; l++) {
237 for (
int k=0; k<plen; k++) {
238 for (
int j=0; j<
xlen; j++) {
241 Partial_Del(func, p, arg, k,
p(k)*
fac,
err);
246 for (
int k=0; k<plen; k++) {
249 a(k)+=
sqr(Partial_Del(func, p, arg, k,
p(k)*fac, err))/
253 for (
int k=0; k<plen; k++)
262 if ( i%1000==0 )
STD__ cerr << i <<
"\t\t\t\r";
264 if (sigint) { sigint--;
return 0; }
272 INST(template <typename T>
class Vector friend \
277 template <typename T>
282 T tol,
int iter,
char ver)
290 int plen = param.
size();
298 STD__ cout <<
" \n chi-squared with start parameters is: " <<
chi;
303 STD__ cout <<
"\n initializing matrices and starting loop... \n";
309 for (k=0; k<plen; k++)
310 for (
int l=0; l<plen; l++) {
311 for (
int i=0; i<
len; i++) {
313 a(k,l) += Partial_Del(func, param, arg, k,
param(k)*fac, err)*
314 Partial_Del(func, param, arg, l,
param(l)*fac, err) /(
sig(i)*
sig(i));
324 for (k=0;k<plen;k++) {
325 for (
int i=0;i<
len;i++) {
328 Partial_Del(func, param, arg, k,
param(k)*
fac,
err);
332 char exceed =
gaussj (a, b);
337 for (
REGISTER int f=0; f<plen; f++) {
338 if ((param2(f) > phigh(f)) && (phigh(f)!=plow(f)) ) exceed = 1;
339 if ((param2(f) < plow(f)) && (phigh(f)!=plow(f)) ) exceed = 1;
342 chi_new = Chisquare_2D <T> (func, param2,
x,
y,
z,
sig);
344 if ((chi_new >= chi) || (exceed == 1)) lambda *= lscale(0);
348 lambda*=(
T)1/lscale(1);
351 if (chi_new<chi_min) {
357 if (ver==
'y' || ver==
'Y')
358 STD__ cerr <<
"\n iteration " << j <<
" " << param <<
359 " " << param2 <<
" " << chi_new;
361 if (sigint) { sigint--; param = param_best;
return 1e38; }
364 if (j%10 == 0)
STD__ cerr <<
".";
366 }
while( (chi_dif >= tol) && (j < iter) );
368 STD__ cout <<
"\n loop finished after " << j <<
" iterations with last delta chi: "
369 << chi_dif <<
"\n and chi-squared: " << chi_new <<
STD__ endl;
const Vector< T > const Vector< T > const Vector< T > int mu
const Vector< T > const Vector< T > & x
const Vector< T > const Vector< T > const Vector< T > & p
const Vector< T > const Vector< T > const Vector< T > int T h
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > & sigma
< calculates function values of func at position x with params param and return chisq with given y va...
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > & pmin
TBCI__ cplx< T > log(const TBCI__ cplx< T > &z)
NAMESPACE_TBCI char gaussj(Matrix< T > &a, Matrix< T > &b)
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > & z
T arg(const TBCI__ cplx< T > &c)
#define DELTA(i, j)
the kronecker delta
cplx< T > sqr(const cplx< T > &c)
STD__ cout<< "\n parameter space discretisation with "<< len<< " points in progress ... \n ";factor(j)=(pmax(j)-pmin(j))/((T) res-(T) 1);for(long int i=0;i< len;i++){STD__ cerr<< "\n error: basis trafo failed\n";p(j)=factor(j)*index(j)+pmin(j);for(int l=0;l< xlen;l++){arg(0)=x(l);arg(1)=y(l);fval(l)=(*func)(p, arg);}chi=Chisq(z, fval, sig);if(chi< min){min=chi;min_pos=p;}if(i%1000==0) STD__ cerr<< i<< "\t\t\t\r";}STD__ cout<< " \n done! \n\n"<< STD__ endl;return min_pos;}INST(template< typename T > class Vector friend T LM_fit_2D(Vector< T > &, Vector< T > &, Vector< T > &, Vector< T > &, Vector< T > &, Vector< T > &, Vector< T > &, T(*func)(const Vector< T > &, const Vector< T > &), Vector< T >, Vector< T > &, T, int, char);) template< typename T > T LM_fit_2D(Vector< T > &x, Vector< T > &y, Vector< T > &z, Vector< T > &sig, Vector< T > ¶m, Vector< T > &plow, Vector< T > &phigh, T(*func)(const Vector< T > &, const Vector< T > &), Vector< T > lambda, Vector< T > &lscale, T tol, int iter, char ver)
long int Vector< T > & index
STD__ cerr<< "\n error: partial_del: derivate variable index out of range \n";hh=h;buf_plus=x;buf_minus=x;buf_plus(mu)+=hh;buf_minus(mu)-=hh;a(0, 0)=((*func)(buf_plus, p)-(*func)(buf_minus, p))/(2.0 *hh);err=1.0e30;for(int i=1;i< 10;i++){hh/=SQRT2;buf_plus=x;buf_minus=x;buf_plus(mu)+=hh;buf_minus(mu)-=hh;a(0, i)=((*func)(buf_plus, p)-(*func)(buf_minus, p))/(2.0 *hh);fac=2.0;for(REGISTER int j=1;j<=i;j++){a(j, i)=(a(j-1, i)*fac-a(j-1, i-1))/(fac-1.0);fac *=2.0;errt=MAX(MATH__ fabs(a(j, i)-a(j-1, i)), MATH__ fabs(a(j, i)-a(j-1, i-1)));if(errt<=err){err=errt;ans=a(j, i);}}if(MATH__ fabs(a(i, i)-a(i-1, i-1)) >=MATH__ fabs(2.0 *err)) break;}return ans;}INST(template< typename T > class Vector friend T Chisq(Vector< T > &, Vector< T > &, Vector< T > &);) template< typename T > T Chisq(Vector< T > &data, Vector< T > &func, Vector< T > &sig)
Vector< T > fval(x.size())
const Vector< T > Vector< T > & param
TVector< T > min_pos(pmin)
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > & sig
unsigned long size() const
Vector< T > buf_minus(xlen)
Vector< T > buf_plus(xlen)
const Vector< T > const Vector< T > const Vector< T > int T T & err
Temporary Base Class Idiom: Class TVector is used for temporary variables.
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > & lambda
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > & pmax
const Vector< T > Vector< T > Vector< T > Vector< T > & y
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > long int res
const unsigned TMatrix< T > const Matrix< T > * a
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > long int int char v
< find minimun of func on grid with resolution res
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > long int int max_it
TBCI__ cplx< T > pow(const TBCI__ cplx< T > &z, const double n)