Blame doc/examples/min.c

Packit 67cb25
#include <stdio.h>
Packit 67cb25
#include <gsl/gsl_errno.h>
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
#include <gsl/gsl_min.h>
Packit 67cb25
Packit 67cb25
double fn1 (double x, void * params)
Packit 67cb25
{
Packit 67cb25
  (void)(params); /* avoid unused parameter warning */
Packit 67cb25
  return cos(x) + 1.0;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
main (void)
Packit 67cb25
{
Packit 67cb25
  int status;
Packit 67cb25
  int iter = 0, max_iter = 100;
Packit 67cb25
  const gsl_min_fminimizer_type *T;
Packit 67cb25
  gsl_min_fminimizer *s;
Packit 67cb25
  double m = 2.0, m_expected = M_PI;
Packit 67cb25
  double a = 0.0, b = 6.0;
Packit 67cb25
  gsl_function F;
Packit 67cb25
Packit 67cb25
  F.function = &fn1;
Packit 67cb25
  F.params = 0;
Packit 67cb25
Packit 67cb25
  T = gsl_min_fminimizer_brent;
Packit 67cb25
  s = gsl_min_fminimizer_alloc (T);
Packit 67cb25
  gsl_min_fminimizer_set (s, &F, m, a, b);
Packit 67cb25
Packit 67cb25
  printf ("using %s method\n",
Packit 67cb25
          gsl_min_fminimizer_name (s));
Packit 67cb25
Packit 67cb25
  printf ("%5s [%9s, %9s] %9s %10s %9s\n",
Packit 67cb25
          "iter", "lower", "upper", "min",
Packit 67cb25
          "err", "err(est)");
Packit 67cb25
Packit 67cb25
  printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
Packit 67cb25
          iter, a, b,
Packit 67cb25
          m, m - m_expected, b - a);
Packit 67cb25
Packit 67cb25
  do
Packit 67cb25
    {
Packit 67cb25
      iter++;
Packit 67cb25
      status = gsl_min_fminimizer_iterate (s);
Packit 67cb25
Packit 67cb25
      m = gsl_min_fminimizer_x_minimum (s);
Packit 67cb25
      a = gsl_min_fminimizer_x_lower (s);
Packit 67cb25
      b = gsl_min_fminimizer_x_upper (s);
Packit 67cb25
Packit 67cb25
      status 
Packit 67cb25
        = gsl_min_test_interval (a, b, 0.001, 0.0);
Packit 67cb25
Packit 67cb25
      if (status == GSL_SUCCESS)
Packit 67cb25
        printf ("Converged:\n");
Packit 67cb25
Packit 67cb25
      printf ("%5d [%.7f, %.7f] "
Packit 67cb25
              "%.7f %+.7f %.7f\n",
Packit 67cb25
              iter, a, b,
Packit 67cb25
              m, m - m_expected, b - a);
Packit 67cb25
    }
Packit 67cb25
  while (status == GSL_CONTINUE && iter < max_iter);
Packit 67cb25
Packit 67cb25
  gsl_min_fminimizer_free (s);
Packit 67cb25
Packit 67cb25
  return status;
Packit 67cb25
}