6 #include <gsl/gsl_errno.h>
7 #include <gsl/gsl_sf.h>
8 #include <gsl/gsl_siman.h>
9 #include <gsl/gsl_randist.h>
14 #define J_END_COL(i) \
15 for (j=0; j<N; j++) gsl_matrix_set(J,i,j,J_COL[j]);
17 static inline _Bool IS_SMALL(double v) {
21 static inline double sinc(double x) {
22 return gsl_sf_sinc(x / M_PI);
25 static double target[N];
27 static double cb_Efunc(void *xp) {
31 for (i=0; i<N-3; i++) {
32 // A is point i, B i+1, C i+2, etc.
42 for (i=0, e=0; i<N; i++) {
43 double d = F[i] - target[i];
46 //printf("\n cb_Efunc %p %10.7f [", xp, e);
47 //for (i=0; i<N; i++) printf(" %10.7f,", x[i]);
52 static int cb_fdf(const gsl_vector *x, void *params,
53 gsl_vector *f, gsl_matrix *J) {
57 static void cb_step(const gsl_rng *rng, void *xp, double step_size) {
61 gsl_ran_dir_nd(rng, N,step);
63 x[i] += step_size * step[i];
64 //printf("\n cb_step %p %10.7f [", xp, step_size);
65 //for (i=0; i<N; i++) printf(" %10.7f,", step[i]);
69 static double cb_metric(void *xp, void *yp) {
70 const double *x=xp, *y=yp;
73 for (i=0, s=0; i<N; i++) {
74 double d = x[i] - y[i];
80 static void printcore(const double *x) {
86 for (i=0; i<6; i++) printf(" %.18g,", x[i]);
87 for (i=0; i<6; i++) printf(" %.18g,", F[i]);
91 static void __attribute__((unused)) cb_print(void *xp) {
97 static double scan1double(void) {
102 if (ferror(stdin)) { perror("stdin"); exit(-1); }
103 if (feof(stdin)) exit(0);
104 if (r!=1) { fputs("bad input\n",stderr); exit(-1); }
112 double startpoint[N];
114 gsl_rng *rng = gsl_rng_alloc(gsl_rng_ranlxd2);
117 /* 2N+1 doubles: target, initial guess, epsilon for residual */
119 target[i] = scan1double();
121 startpoint[i] = scan1double();
122 epsilon = scan1double();
126 gsl_siman_params_t siman_params = {
130 .t_min = epsilon * 1E-3,
131 .iters_fixed_T = 100,
138 cb_Efunc, cb_step, cb_metric,
140 0,0,0, sizeof(startpoint), siman_params);
142 printcore(startpoint);