8 #include <gsl/gsl_errno.h>
9 #include <gsl/gsl_sf.h>
10 #include <gsl/gsl_siman.h>
11 #include <gsl/gsl_randist.h>
12 #include <gsl/gsl_multimin.h>
16 #define J_END_COL(i) \
17 for (j=0; j<PN; j++) gsl_matrix_set(J,i,j,J_COL[j]);
19 static inline _Bool IS_SMALL(double v) {
23 static inline double sinc(double x) {
24 return gsl_sf_sinc(x / M_PI);
28 static double *INPUT; /* dyanmic array, on main's stack */
29 static double PREP[NPREP];
34 for (get_x_i=0; get_x_i<NX; get_x_i++) \
35 X[get_x_i] = gsl_vector_get(xg, get_x_i); \
38 static void printcore(const double *X) {
45 printf(" %25.18g,", POINT(i)[j]);
49 static void prepare(double X[] /* startpoint */) {
50 /* fills in PREP and startpoint */
56 static double cb_f(const gsl_vector *xg, void *params) {
69 printf(" %7.4f", POINT(P)[j]);
79 static void __attribute__((unused)) cb_step(const gsl_rng *rng, void *xp, double step_size) {
83 gsl_ran_dir_nd(rng, NX, step);
85 x[i] += step_size * step[i];
86 //printf("\n cb_step %p %10.7f [", xp, step_size);
87 //for (i=0; i<N; i++) printf(" %10.7f,", step[i]);
91 static double __attribute__((unused)) cb_metric(void *xp, void *yp) {
92 const double *x=xp, *y=yp;
95 for (i=0, s=0; i<NX; i++) {
96 double d = x[i] - y[i];
102 static void __attribute__((unused)) cb_print(gsl_vector *xp) {
108 static double scan1double(void) {
113 if (ferror(stdin)) { perror("stdin"); exit(-1); }
114 if (feof(stdin)) exit(0);
115 if (r!=1) { fputs("bad input\n",stderr); exit(-1); }
119 int main(int argc, const char *const *argv) {
124 epsilon = atof(argv[2]);
126 double startpoint_X[NX];
127 double input[NINPUT]; INPUT = input;
129 gsl_multimin_function func = {
135 gsl_vector *current_gx = gsl_vector_alloc(NX);
136 gsl_vector *step_size = gsl_vector_alloc(NX);
137 gsl_vector_set_all(step_size, 0.01);
139 gsl_multimin_fminimizer *minimiser =
140 gsl_multimin_fminimizer_alloc(gsl_multimin_fminimizer_nmsimplex2rand, NX);
143 /* NINPUT + 1 doubles: startpoint, epsilon for residual */
144 for (i=0; i<NINPUT; i++)
145 INPUT[i] = scan1double();
147 prepare(startpoint_X);
149 gsl_vector_set(current_gx, i, startpoint_X[i]);
151 r = gsl_multimin_fminimizer_set(minimiser, &func, current_gx, step_size);
155 r = gsl_multimin_fminimizer_iterate(minimiser);
158 //cb_print(current_gx);
160 double size = gsl_multimin_fminimizer_size(minimiser);
161 //printf(" size=%10.7f\n", size);
163 if (size < epsilon) break;
166 cb_print(current_gx);