Code:
extern status NelderMeadSimplexMethod(n, f, xinit, length, fopt, timeout, eps, array1, array2)
int n;
dbl (*f)();
dbl *xinit;
dbl length;
dbl *fopt;
int timeout;
dbl eps;
dbl array1[], array2[];
{
status stat = failure;
int count, i;
nvar = n;
objective = f;
initialize();
initial_simplex(xinit, length);
/* fprint_simplex(stderr); */
for (i=0; i<=nvar; i++) {
fvalue[i] = (*objective)(nvar, simp[i], array1, array2);
}
/* vectorfprint(stderr, nvar+1, fvalue); */
for (count=0; count<timeout; count++) {
search_simplex();
compute_xcentroid();
/* fprint_points(stderr); */
compute_fmean_fvar();
/* fprintf(stderr, "fvar = %40.35f\n", fvar); */
if (fvar <= eps) {
stat = success;
break;
}
#if Debug
if (count % SKIPTIME == 0) {
fprintf(stderr, "k = %d f = %lg\n", count, fvalue[il]);
/* vectorfprint(stderr, nvar, xinit); */
}
#endif
reflection();
if (freflect <= fvalue[is]) {
if (freflect >= fvalue[il]) {
vectorcopy(nvar, simp[ih], xreflect);
fvalue[ih] = freflect;
} else {
expansion();
if (fexpand < fvalue[il]) {
vectorcopy(nvar, simp[ih], xexpand);
fvalue[ih] = fexpand;
} else {
vectorcopy(nvar, simp[ih], xreflect);
fvalue[ih] = freflect;
}
}
} else {
if (freflect < fvalue[ih]) {
vectorcopy(nvar, simp[ih], xreflect);
fvalue[ih] = freflect;
}
contraction();
if (fcontract < fvalue[ih]) {
vectorcopy(nvar, simp[ih], xcontract);
fvalue[ih] = fcontract;
} else {
for (i=0; i<=nvar; i++) {
if (i == il) continue;
vectoradd(nvar, simp[i], simp[i], simp[il]);
scalarvector(nvar, simp[i], 0.50, simp[i]);
fvalue[i] = (*objective)(nvar, simp[i], array1, array2);
}
}
}
#if Debug
/* fprintf(stderr, "%d : min = %lf\n", count, fvalue[il]); */
#endif
}
vectorcopy(nvar, xinit, simp[il]);
*fopt = fvalue[il];
return stat;
}
my language was wrong