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