help-gsl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-gsl] gsl_multimin_fdfminimizer_conjugate_fr


From: Christian MOENNE-LOCCOZ
Subject: [Help-gsl] gsl_multimin_fdfminimizer_conjugate_fr
Date: Tue, 08 Mar 2005 12:12:26 +0100
User-agent: Mozilla Thunderbird 1.0 (Windows/20041206)

Hello,
Can I use the gsl_multimin_fdfminimizer_conjugate_fr algorithm to minimize all types of function ?

I copy/paste the example of code from the documentation.
For f(x) = x*x, the minimum is found.
   1 4.99000   24.90010
   2 4.97000   24.70090
   3 4.93000   24.30490
   4 4.85000   23.52250
   5 4.69000   21.99610
   6 4.37000   19.09690
   7 3.73000   13.91290
   8 2.45000    6.00250
   9 -0.11000    0.01210
Minimum found at:
  10 0.00000    0.00000


But for f(x) = x, it divaricates :
   1 4.99000    4.99000
   2 4.97000    4.97000
   3 4.93000    4.93000
   4 4.85000    4.85000
   5 4.69000    4.69000
   6 4.37000    4.37000
   7 3.73000    3.73000
   8 2.45000    2.45000
   9 -0.11000   -0.11000
  10 -5.23000   -5.23000
  11 -15.47000  -15.47000
  12 -35.95000  -35.95000
(...)
99 -6338253001141146039913283584.00000 -6338253001141146039913283584.00000 100 -12676506002282292079826567168.00000 -12676506002282292079826567168.00000

What's wrong ?

Thanks.
--
CML
ps : the code :
#include <gsl/gsl_vector.h>
#include <gsl/gsl_multimin.h>
#include <iostream>

using namespace std;


double
my_f (const gsl_vector *v, void *params)
{
 double x;

 x = gsl_vector_get(v, 0);

 //return x*x;
 return x;
}

void
my_df (const gsl_vector *v, void *params,
      gsl_vector *df)
{
 double x;
x = gsl_vector_get(v, 0);

 gsl_vector_set(df, 0, 1.0);
 //gsl_vector_set(df, 0, 2.0 *x);
}
void
my_fdf (const gsl_vector *x, void *params,
       double *f, gsl_vector *df)
{
 *f = my_f(x, params);
 my_df(x, params, df);
}


int
main (void)
{
 const size_t Dim =1;
 size_t iter = 0;
 int status;

 const gsl_multimin_fdfminimizer_type *T;
 gsl_multimin_fdfminimizer *s;

 double par[2] = { 1.0, 2.0 };

 gsl_vector *x;
 gsl_multimin_function_fdf my_func;

 my_func.f = &my_f;
 my_func.df = &my_df;
 my_func.fdf = &my_fdf;
 my_func.n = Dim;
 my_func.params = &par;

 x = gsl_vector_alloc (Dim);
 gsl_vector_set (x, 0, 5.0);

 T = gsl_multimin_fdfminimizer_conjugate_fr;
 s = gsl_multimin_fdfminimizer_alloc (T, Dim);

 gsl_multimin_fdfminimizer_set (s, &my_func, x, 0.01, 1e-4);

 do
   {
     iter++;
     status = gsl_multimin_fdfminimizer_iterate (s);

     if (status)
       break;

     status = gsl_multimin_test_gradient (s->gradient, 1e-3);

     if (status == GSL_SUCCESS)
       printf ("Minimum found at:\n");

     printf ("%5d %.5f %10.5f\n", iter,
             gsl_vector_get (s->x, 0),
             s->f);

   }
 while (status == GSL_CONTINUE && iter < 100);

 gsl_multimin_fdfminimizer_free (s);
 gsl_vector_free (x);

 return 0;
}





reply via email to

[Prev in Thread] Current Thread [Next in Thread]