Blame doc/examples/multiminfn.c

Packit 67cb25
/* Paraboloid centered on (p[0],p[1]), with  
Packit 67cb25
   scale factors (p[2],p[3]) and minimum p[4] */
Packit 67cb25
Packit 67cb25
double
Packit 67cb25
my_f (const gsl_vector *v, void *params)
Packit 67cb25
{
Packit 67cb25
  double x, y;
Packit 67cb25
  double *p = (double *)params;
Packit 67cb25
  
Packit 67cb25
  x = gsl_vector_get(v, 0);
Packit 67cb25
  y = gsl_vector_get(v, 1);
Packit 67cb25
 
Packit 67cb25
  return p[2] * (x - p[0]) * (x - p[0]) +
Packit 67cb25
           p[3] * (y - p[1]) * (y - p[1]) + p[4]; 
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* The gradient of f, df = (df/dx, df/dy). */
Packit 67cb25
void 
Packit 67cb25
my_df (const gsl_vector *v, void *params, 
Packit 67cb25
       gsl_vector *df)
Packit 67cb25
{
Packit 67cb25
  double x, y;
Packit 67cb25
  double *p = (double *)params;
Packit 67cb25
  
Packit 67cb25
  x = gsl_vector_get(v, 0);
Packit 67cb25
  y = gsl_vector_get(v, 1);
Packit 67cb25
 
Packit 67cb25
  gsl_vector_set(df, 0, 2.0 * p[2] * (x - p[0]));
Packit 67cb25
  gsl_vector_set(df, 1, 2.0 * p[3] * (y - p[1]));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* Compute both f and df together. */
Packit 67cb25
void 
Packit 67cb25
my_fdf (const gsl_vector *x, void *params, 
Packit 67cb25
        double *f, gsl_vector *df) 
Packit 67cb25
{
Packit 67cb25
  *f = my_f(x, params); 
Packit 67cb25
  my_df(x, params, df);
Packit 67cb25
}