|
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 |
}
|