void test_f (const gsl_min_fminimizer_type * T, const char * description, gsl_function *f, double lower_bound, double middle, double upper_bound, double correct_minimum) { int status; size_t iterations = 0; double m, a, b; double x_lower, x_upper; gsl_min_fminimizer * s; x_lower = lower_bound; x_upper = upper_bound; s = gsl_min_fminimizer_alloc (T) ; gsl_min_fminimizer_set (s, f, middle, x_lower, x_upper) ; do { iterations++ ; status = gsl_min_fminimizer_iterate (s); m = gsl_min_fminimizer_x_minimum(s); a = gsl_min_fminimizer_x_lower(s); b = gsl_min_fminimizer_x_upper(s); #ifdef DEBUG printf("%.12f %.18f %.12f %.18f %.12f %.18f status=%d\n", a, GSL_FN_EVAL(f, a), m, GSL_FN_EVAL(f, m), b, GSL_FN_EVAL(f, b), status); #endif if (a > b) gsl_test (GSL_FAILURE, "interval is invalid (%g,%g)", a, b); if (m < a || m > b) gsl_test (GSL_FAILURE, "m lies outside interval %g (%g,%g)", m, a, b); if (status) break ; status = gsl_min_test_interval (a, b, EPSABS, EPSREL); } while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS); gsl_test (status, "%s, %s (%g obs vs %g expected) ", gsl_min_fminimizer_name(s), description, gsl_min_fminimizer_x_minimum(s), correct_minimum); /* check the validity of the returned result */ if (!WITHIN_TOL (m, correct_minimum, EPSREL, EPSABS)) { gsl_test (GSL_FAILURE, "incorrect precision (%g obs vs %g expected)", m, correct_minimum); } gsl_min_fminimizer_free (s); }
int main (void) { int status; int iter = 0, max_iter = 100; const gsl_min_fminimizer_type *T; gsl_min_fminimizer *s; double m = 2.0, m_expected = M_PI; double a = 0.0, b = 6.0; gsl_function F; F.function = &fn1; F.params = 0; T = gsl_min_fminimizer_brent; s = gsl_min_fminimizer_alloc (T); gsl_min_fminimizer_set (s, &F, m, a, b); printf ("using %s method\n", gsl_min_fminimizer_name (s)); printf ("%5s [%9s, %9s] %9s %10s %9s\n", "iter", "lower", "upper", "min", "err", "err(est)"); printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n", iter, a, b, m, m - m_expected, b - a); do { iter++; status = gsl_min_fminimizer_iterate (s); m = gsl_min_fminimizer_x_minimum (s); a = gsl_min_fminimizer_x_lower (s); b = gsl_min_fminimizer_x_upper (s); status = gsl_min_test_interval (a, b, 0.001, 0.0); if (status == GSL_SUCCESS) printf ("Converged:\n"); printf ("%5d [%.7f, %.7f] " "%.7f %+.7f %.7f\n", iter, a, b, m, m - m_expected, b - a); } while (status == GSL_CONTINUE && iter < max_iter); gsl_min_fminimizer_free (s); return status; }
/*============================================================================= * MINIMIZATION *=============================================================================*/ double minimize(double a,double b, double m){ int status; int iter = 0, max_iter = 100; const gsl_min_fminimizer_type *T; gsl_min_fminimizer *s; double epsabs= 0.005; //eps of solution double epsrel= 0.0; //eps of solution gsl_function F; F.function = &min_func; F.params = 0; T = gsl_min_fminimizer_brent; s = gsl_min_fminimizer_alloc (T); gsl_min_fminimizer_set (s, &F, m, a, b); printf ("using %s method\n", gsl_min_fminimizer_name (s)); printf ("%5s [%9s, %9s] %9s %9s\n", "iter", "lower", "upper", "min", "err(est)"); printf ("%5d [%.7f, %.7f] %.7f %.7f\n", iter, a, b, m, b - a); do { iter++; status = gsl_min_fminimizer_iterate (s); m = gsl_min_fminimizer_x_minimum (s); a = gsl_min_fminimizer_x_lower (s); b = gsl_min_fminimizer_x_upper (s); status = gsl_min_test_interval (a, b, epsabs, epsrel); if (status == GSL_SUCCESS) printf ("Converged:\n"); printf ("%5d [%.7f, %.7f] " "%.7f %.7f\n", iter, a, b, m, b - a); } while (status == GSL_CONTINUE && iter < max_iter); gsl_min_fminimizer_free (s); return m; }
double iteractive_max(Params *params,double a, double b) { const gsl_min_fminimizer_type *T; gsl_min_fminimizer *s; gsl_function F; int status; int iter = 0, max_iter = 100; double m=(a+b)/2.0; printf("a=%lg b=%lg\n",a,b); printf("f(a)=%lg f(b)=%lg f((a+b)/2)=%lg\n",max_fun(a,params),max_fun(b,params),max_fun((a+b)/2.0,params)); F.function = &max_fun; F.params = (void*)params; T = gsl_min_fminimizer_brent; s = gsl_min_fminimizer_alloc (T); gsl_min_fminimizer_set (s, &F, m, a, b); printf ("using %s method\n",gsl_min_fminimizer_name (s)); fflush(stdout); printf("Start Interactions\n"); fflush(stdout); do { iter++; status = gsl_min_fminimizer_iterate (s); m = gsl_min_fminimizer_x_minimum (s); a = gsl_min_fminimizer_x_lower (s); b = gsl_min_fminimizer_x_upper (s); status = gsl_min_test_interval (a, b, 0.001, 0.0); if (status == GSL_SUCCESS) printf ("Converged:\n"); printf ("%5d [%.7f, %.7f] " "%.7f %.7f\n", iter, a, b, m, b - a); } while (status == GSL_CONTINUE && iter < max_iter); gsl_min_fminimizer_free (s); return m; }
int main () { int status; int iter = 0, max_iter = 100; /*Max. number of iterations*/ const gsl_min_fminimizer_type *T; gsl_min_fminimizer *s; double m = 0.7; /* Starting point for the search*/ double a = -4.0, b = 1.0; /* The interval in which the minimum lies*/ gsl_function F; F.function = &fn_1; /* Function to Minimize*/ F.params = 0; T = gsl_min_fminimizer_goldensection; /*Set the minimization algorithm - Uses Golden Section*/ s = gsl_min_fminimizer_alloc (T); /* Initialize the minimizer*/ gsl_min_fminimizer_set (s, &F, m, a, b); /*Set up the minimizer*/ printf ("Using %s method\n", gsl_min_fminimizer_name (s)); printf ("%5s [%9s, %9s] %9s \n","iter", "lower", "upper", "min", "err", "err(est)"); printf ("%5d [%.7f, %.7f] %.7f \n", iter, a, b, m); /* Set up the iterative minimization procedure*/ do { iter++; status = gsl_min_fminimizer_iterate(s); m = gsl_min_fminimizer_x_minimum (s); a = gsl_min_fminimizer_x_lower (s); b = gsl_min_fminimizer_x_upper (s); status = gsl_min_test_interval (a, b, 0.001, 0.0); if (status == GSL_SUCCESS) printf ("Converged:\n"); printf ("%5d [%.7f, %.7f] %.7f\n",iter, a, b, m); } while (status == GSL_CONTINUE && iter < max_iter); gsl_min_fminimizer_free (s); return status; }
void test_f_e (const gsl_min_fminimizer_type * T, const char * description, gsl_function *f, double lower_bound, double middle, double upper_bound, double correct_minimum) { int status; size_t iterations = 0; double x_lower, x_upper; double a, b; gsl_min_fminimizer * s; x_lower = lower_bound; x_upper = upper_bound; s = gsl_min_fminimizer_alloc (T) ; status = gsl_min_fminimizer_set (s, f, middle, x_lower, x_upper) ; if (status != GSL_SUCCESS) { gsl_min_fminimizer_free (s) ; gsl_test (status == GSL_SUCCESS, "%s, %s", T->name, description); return ; } do { iterations++ ; gsl_min_fminimizer_iterate (s); a = gsl_min_fminimizer_x_lower(s); b = gsl_min_fminimizer_x_upper(s); status = gsl_min_test_interval (a, b, EPSABS, EPSREL); } while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS); gsl_test (!status, "%s, %s", gsl_min_fminimizer_name(s), description, gsl_min_fminimizer_x_minimum(s) - correct_minimum); gsl_min_fminimizer_free (s); }
static VALUE rb_gsl_min_fminimizer_name(VALUE obj) { gsl_min_fminimizer *gmf = NULL; Data_Get_Struct(obj, gsl_min_fminimizer, gmf); return rb_str_new2(gsl_min_fminimizer_name(gmf)); }