30 double (*_fun)(
double*),
47 double Max, Min, Max2, Min2, LastChi;
48 int NextBest, New2, Best;
51 if(verbose>0) printf(
"%s(func, %d, p[], delta[], %g, %d)\n", __func__, parNr, maxerr, maxiter);
54 _simplexParNr=parNr; it=0; NewPnt=_simplexParNr+1;
55 for(i=0; i<_simplexParNr; i++)
for(Meas=0; Meas<_simplexParNr+3; Meas++) _simplexP[Meas][i]=par[i];
57 for(
int i=0; i<_simplexParNr; i++) printf(
"%12g %12g\n", _simplexP[0][i], delta[i]);
58 printf(
"ChiSqr of guesses: %f\n", (*_simplexFunc)(_simplexP[0]));
61 for(Meas=0; Meas<=_simplexParNr; Meas++) {
63 _simplexR[Meas] = (*_simplexFunc)(_simplexP[Meas]);
64 for (i=0; i<_simplexParNr; i++) {
65 if(i==Meas) delta[i]= -delta[i];
66 _simplexP[Meas+1][i] = _simplexP[Meas][i] + delta[i];
71 LastChi = 1.0E30; NextBest=Best=0;
73 for(j=0; j<100; j++) {
76 for (i=0; i<=_simplexParNr; i++) {
77 if(_simplexR[i] > Max) {Max=_simplexR[i]; Worst=i;}
78 if(_simplexR[i] < Min) {Min=_simplexR[i]; Best=i; }
82 for (i=0; i<=_simplexParNr; i++) {
83 if((_simplexR[i] > Max2) && (_simplexR[i] < Max)) Max2=_simplexR[i];
84 if((_simplexR[i] < Min2) && (_simplexR[i] > Min)) {
85 Min2=_simplexR[i]; NextBest=i;}
88 for(i=0; i<_simplexParNr; i++) {
90 for(Meas=0; Meas<=_simplexParNr; Meas++)
91 if(Meas!=Worst) _simplexC[i]+=_simplexP[Meas][i];
92 _simplexC[i]/=(double)_simplexParNr;
95 for(i=0; i<_simplexParNr; i++)
96 _simplexP[NewPnt][i] = 2.*_simplexC[i] - _simplexP[Worst][i];
97 _simplexR[NewPnt]= (*_simplexFunc)(_simplexP[NewPnt]);
101 if(_simplexR[NewPnt] < _simplexR[Best]) {
102 _simplexGenNew(New2,2.0); it++;
106 if(_simplexR[NewPnt] > _simplexR[Worst]) {
107 _simplexGenNew(New2,-0.5); it++;
112 if((_simplexR[NextBest] < _simplexR[NewPnt]) &&
113 (_simplexR[NewPnt] < _simplexR[Worst])) {
114 _simplexGenNew(New2,0.5); it++;
117 for(i=0; i<_simplexParNr; i++)
118 _simplexP[Worst][i] = _simplexP[NewPnt][i];
119 _simplexR[Worst] = _simplexR[NewPnt];
124 if(verbose>1) printf(
" it=%i; ChiSqr=%f\n", it, _simplexR[Best]);
126 for(i=0; i<_simplexParNr; i++) printf(
" %12g\n", _simplexP[Best][i]);
128 if(_simplexR[Best] == LastChi) {
129 for(i=0; i<_simplexParNr; i++) par[i]=_simplexP[Best][i];
130 return _simplexR[Best];
132 LastChi = _simplexR[Best];
133 }
while ((_simplexR[Best]>maxerr) && (it<=maxiter));
135 for(i=0; i<_simplexParNr; i++) par[i]=_simplexP[Best][i];
136 return _simplexR[Best];