diff options
Diffstat (limited to 'gsl-1.9/multimin/test_funcs.c')
-rw-r--r-- | gsl-1.9/multimin/test_funcs.c | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/gsl-1.9/multimin/test_funcs.c b/gsl-1.9/multimin/test_funcs.c new file mode 100644 index 0000000..34081af --- /dev/null +++ b/gsl-1.9/multimin/test_funcs.c @@ -0,0 +1,244 @@ +/* multimin/test_funcs.c + * + * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <config.h> +#include <gsl/gsl_multimin.h> + +#include "test_funcs.h" + +gsl_multimin_function_fdf rosenbrock = +{&rosenbrock_f, + &rosenbrock_df, + &rosenbrock_fdf, + 2, 0}; + +gsl_multimin_function rosenbrock_fmin = +{&rosenbrock_f, + 2, 0}; + +void rosenbrock_initpt (gsl_vector * x) +{ + gsl_vector_set (x, 0, -1.2); + gsl_vector_set (x, 1, 1.0); +} + +double rosenbrock_f (const gsl_vector * x, void *params) +{ + double u = gsl_vector_get(x,0); + double v = gsl_vector_get(x,1); + double a = u - 1; + double b = u * u - v; + fcount++; + return a * a + 10 * b * b; +} + +void rosenbrock_df (const gsl_vector * x, void *params, gsl_vector * df) +{ + double u = gsl_vector_get(x,0); + double v = gsl_vector_get(x,1); + double b = u * u - v; + gcount++; + gsl_vector_set(df,0,2 * (u - 1) + 40 * u * b); + gsl_vector_set(df,1,-20 * b); +} + +void rosenbrock_fdf (const gsl_vector * x, void *params, double * f, + gsl_vector * df) +{ + double u = gsl_vector_get(x,0); + double v = gsl_vector_get(x,1); + double a = u - 1; + double b = u * u - v; + gcount++; + *f = a * a + 10 * b * b; + gsl_vector_set(df,0,2 * (u - 1) + 40 * u * b); + gsl_vector_set(df,1,-20 * b); +} + +gsl_multimin_function_fdf roth = +{&roth_f, + &roth_df, + &roth_fdf, + 2, 0}; + +gsl_multimin_function roth_fmin = +{&roth_f, + 2, 0}; + +void roth_initpt (gsl_vector * x) +{ + gsl_vector_set (x, 0, 4.5); + gsl_vector_set (x, 1, 3.5); +} + +double roth_f (const gsl_vector * x, void *params) +{ + double u = gsl_vector_get(x,0); + double v = gsl_vector_get(x,1); + double a = -13.0 + u + ((5.0 - v)*v - 2.0)*v; + double b = -29.0 + u + ((v + 1.0)*v - 14.0)*v; + fcount++; + return a * a + b * b; +} + +void roth_df (const gsl_vector * x, void *params, gsl_vector * df) +{ + double u = gsl_vector_get(x,0); + double v = gsl_vector_get(x,1); + double a = -13.0 + u + ((5.0 - v)*v - 2.0)*v; + double b = -29.0 + u + ((v + 1.0)*v - 14.0)*v; + double c = -2 + v * (10 - 3 * v); + double d = -14 + v * (2 + 3 * v); + gcount++; + gsl_vector_set(df,0,2 * a + 2 * b); + gsl_vector_set(df,1,2 * a * c + 2 * b * d); +} + +void roth_fdf (const gsl_vector * x, void *params, double * f, + gsl_vector * df) +{ + *f = roth_f (x,params); + roth_df(x,params,df); +} + +gsl_multimin_function_fdf wood = +{&wood_f, + &wood_df, + &wood_fdf, + 4, 0}; + +gsl_multimin_function wood_fmin = +{&wood_f, + 4, 0}; + +void +wood_initpt (gsl_vector * x) +{ + gsl_vector_set (x, 0, -3.0); + gsl_vector_set (x, 1, -1.0); + gsl_vector_set (x, 2, -3.0); + gsl_vector_set (x, 3, -1.0); +} + +double wood_f (const gsl_vector * x, void *params) +{ + double u1 = gsl_vector_get(x,0); + double u2 = gsl_vector_get(x,1); + double u3 = gsl_vector_get(x,2); + double u4 = gsl_vector_get(x,3); + + double t1 = u1 * u1 - u2; + double t2 = u3 * u3 - u4; + fcount++; + return 100 * t1 * t1 + (1 - u1) * (1 - u1) + + 90 * t2 * t2 + (1 - u3) * (1 - u3) + + 10.1 * ( (1 - u2) * (1 - u2) + (1 - u4) * (1 - u4) ) + + 19.8 * (1 - u2) * (1 - u4); +} + +void wood_df (const gsl_vector * x, void *params, gsl_vector * df) +{ + double u1 = gsl_vector_get(x,0); + double u2 = gsl_vector_get(x,1); + double u3 = gsl_vector_get(x,2); + double u4 = gsl_vector_get(x,3); + + double t1 = u1 * u1 - u2; + double t2 = u3 * u3 - u4; + gcount++; + gsl_vector_set(df,0, 400 * u1 * t1 - 2 * (1 - u1) ); + gsl_vector_set(df,1, -200 * t1 - 20.2 * (1 - u2) - 19.8 * (1 - u4) ); + gsl_vector_set(df,2, 360 * u3 * t2 - 2 * (1 - u3) ); + gsl_vector_set(df,3, -180 * t2 - 20.2 * (1 - u4) - 19.8 * (1 - u2) ); + +} + +void wood_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df) +{ + wood_df(x,params,df); + *f=wood_f(x,params); +} + + +gsl_multimin_function_fdf Nrosenbrock = +{&rosenbrock_f, + &Nrosenbrock_df, + &Nrosenbrock_fdf, + 2, 0}; + +void Nrosenbrock_df (const gsl_vector * x, void *params, gsl_vector * df) +{ + gsl_multimin_function F ; + F.f = rosenbrock_f; + F.params = params; + F.n = x->size; + gsl_multimin_diff (&F, x, df); +} + +void Nrosenbrock_fdf (const gsl_vector * x, void *params, double * f, + gsl_vector * df) +{ + *f = rosenbrock_f (x, params); + Nrosenbrock_df (x, params, df); +} + +gsl_multimin_function_fdf Nroth = +{&roth_f, + &Nroth_df, + &Nroth_fdf, + 2, 0}; + +void Nroth_df (const gsl_vector * x, void *params, gsl_vector * df) +{ + gsl_multimin_function F ; + F.f = roth_f; + F.params = params; + F.n = x->size; + gsl_multimin_diff (&F, x, df); +} + +void Nroth_fdf (const gsl_vector * x, void *params, double * f, + gsl_vector * df) +{ + *f = roth_f (x, params); + Nroth_df (x, params, df); +} + + +gsl_multimin_function_fdf Nwood = +{&wood_f, + &Nwood_df, + &Nwood_fdf, + 4, 0}; + +void Nwood_df (const gsl_vector * x, void *params, gsl_vector * df) +{ + gsl_multimin_function F ; + F.f = wood_f; + F.params = params; + F.n = x->size; + gsl_multimin_diff (&F, x, df); +} + +void Nwood_fdf (const gsl_vector * x, void *params, double * f, + gsl_vector * df) +{ + *f = wood_f (x, params); + Nwood_df (x, params, df); +} |