Blame multimin/test_funcs.c

Packit 67cb25
/* multimin/test_funcs.c
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
Packit 67cb25
 * 
Packit 67cb25
 * This program is free software; you can redistribute it and/or modify
Packit 67cb25
 * it under the terms of the GNU General Public License as published by
Packit 67cb25
 * the Free Software Foundation; either version 3 of the License, or (at
Packit 67cb25
 * your option) any later version.
Packit 67cb25
 * 
Packit 67cb25
 * This program is distributed in the hope that it will be useful, but
Packit 67cb25
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67cb25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 67cb25
 * General Public License for more details.
Packit 67cb25
 * 
Packit 67cb25
 * You should have received a copy of the GNU General Public License
Packit 67cb25
 * along with this program; if not, write to the Free Software
Packit 67cb25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
#include <config.h>
Packit 67cb25
#include <math.h>
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
#include <gsl/gsl_multimin.h>
Packit 67cb25
Packit 67cb25
#include "test_funcs.h"
Packit 67cb25
Packit 67cb25
gsl_multimin_function_fdf simpleabs =
Packit 67cb25
{&simpleabs_f,
Packit 67cb25
 &simpleabs_df,
Packit 67cb25
 &simpleabs_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
gsl_multimin_function simpleabs_fmin =
Packit 67cb25
{&simpleabs_f,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void simpleabs_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, 1.0);
Packit 67cb25
  gsl_vector_set (x, 1, 2.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void simpleabs_initpt1 (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, 1.0);
Packit 67cb25
  gsl_vector_set (x, 1, 1.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double simpleabs_f (const gsl_vector * x, void *params)
Packit 67cb25
{
Packit 67cb25
  double u = gsl_vector_get(x,0);
Packit 67cb25
  double v = gsl_vector_get(x,1);
Packit 67cb25
  double a = u - 1;
Packit 67cb25
  double b = v - 2;
Packit 67cb25
  fcount++;
Packit 67cb25
  return fabs(a) + fabs(b);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void simpleabs_df (const gsl_vector * x, void *params, gsl_vector * df)
Packit 67cb25
{
Packit 67cb25
  double u = gsl_vector_get(x,0);
Packit 67cb25
  double v = gsl_vector_get(x,1);
Packit 67cb25
  gcount++;
Packit 67cb25
  gsl_vector_set(df,0, GSL_SIGN(u-1));
Packit 67cb25
  gsl_vector_set(df,1, GSL_SIGN(v-2));  
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void simpleabs_fdf (const gsl_vector * x, void *params, double * f,
Packit 67cb25
                     gsl_vector * df) 
Packit 67cb25
{
Packit 67cb25
  double u = gsl_vector_get(x,0);
Packit 67cb25
  double v = gsl_vector_get(x,1);
Packit 67cb25
  double a = u - 1;
Packit 67cb25
  double b = v - 2;
Packit 67cb25
  gcount++;
Packit 67cb25
  *f = fabs(a) + fabs(b);
Packit 67cb25
  gsl_vector_set(df,0, GSL_SIGN(u-1));
Packit 67cb25
  gsl_vector_set(df,1, GSL_SIGN(v-2));  
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
gsl_multimin_function_fdf rosenbrock =
Packit 67cb25
{&rosenbrock_f,
Packit 67cb25
 &rosenbrock_df,
Packit 67cb25
 &rosenbrock_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
gsl_multimin_function rosenbrock_fmin =
Packit 67cb25
{&rosenbrock_f,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void rosenbrock_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, -1.2);
Packit 67cb25
  gsl_vector_set (x, 1, 1.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void rosenbrock_initpt1 (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, 1.0);
Packit 67cb25
  gsl_vector_set (x, 1, 1.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double rosenbrock_f (const gsl_vector * x, void *params)
Packit 67cb25
{
Packit 67cb25
  double u = gsl_vector_get(x,0);
Packit 67cb25
  double v = gsl_vector_get(x,1);
Packit 67cb25
  double a = u - 1;
Packit 67cb25
  double b = u * u - v;
Packit 67cb25
  fcount++;
Packit 67cb25
  return a * a + 10 * b * b;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void rosenbrock_df (const gsl_vector * x, void *params, gsl_vector * df)
Packit 67cb25
{
Packit 67cb25
  double u = gsl_vector_get(x,0);
Packit 67cb25
  double v = gsl_vector_get(x,1);
Packit 67cb25
  double b = u * u - v;
Packit 67cb25
  gcount++;
Packit 67cb25
  gsl_vector_set(df,0,2 * (u - 1) + 40 * u * b);
Packit 67cb25
  gsl_vector_set(df,1,-20 * b);  
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void rosenbrock_fdf (const gsl_vector * x, void *params, double * f,
Packit 67cb25
                     gsl_vector * df) 
Packit 67cb25
{
Packit 67cb25
  double u = gsl_vector_get(x,0);
Packit 67cb25
  double v = gsl_vector_get(x,1);
Packit 67cb25
  double a = u - 1;
Packit 67cb25
  double b = u * u - v;
Packit 67cb25
  gcount++;
Packit 67cb25
  *f = a * a + 10 * b * b;
Packit 67cb25
  gsl_vector_set(df,0,2 * (u - 1) + 40 * u * b);
Packit 67cb25
  gsl_vector_set(df,1,-20 * b);  
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
gsl_multimin_function_fdf roth =
Packit 67cb25
{&roth_f,
Packit 67cb25
 &roth_df,
Packit 67cb25
 &roth_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
gsl_multimin_function roth_fmin =
Packit 67cb25
{&roth_f,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void roth_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, 4.5);
Packit 67cb25
  gsl_vector_set (x, 1, 3.5);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double roth_f (const gsl_vector * x, void *params)
Packit 67cb25
{
Packit 67cb25
  double u = gsl_vector_get(x,0);
Packit 67cb25
  double v = gsl_vector_get(x,1);
Packit 67cb25
  double a = -13.0 + u + ((5.0 - v)*v - 2.0)*v;
Packit 67cb25
  double b = -29.0 + u + ((v + 1.0)*v - 14.0)*v;
Packit 67cb25
  fcount++;
Packit 67cb25
  return a * a + b * b;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void roth_df (const gsl_vector * x, void *params, gsl_vector * df)
Packit 67cb25
{
Packit 67cb25
  double u = gsl_vector_get(x,0);
Packit 67cb25
  double v = gsl_vector_get(x,1);
Packit 67cb25
  double a = -13.0 + u + ((5.0 - v)*v - 2.0)*v;
Packit 67cb25
  double b = -29.0 + u + ((v + 1.0)*v - 14.0)*v;
Packit 67cb25
  double c = -2 + v * (10 - 3 * v);
Packit 67cb25
  double d = -14 + v * (2 + 3 * v);
Packit 67cb25
  gcount++;
Packit 67cb25
  gsl_vector_set(df,0,2 * a + 2 * b);
Packit 67cb25
  gsl_vector_set(df,1,2 * a * c + 2 * b * d);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void roth_fdf (const gsl_vector * x, void *params, double * f,
Packit 67cb25
               gsl_vector * df) 
Packit 67cb25
{
Packit 67cb25
  *f = roth_f (x,params);
Packit 67cb25
  roth_df(x,params,df);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
gsl_multimin_function_fdf wood =
Packit 67cb25
{&wood_f,
Packit 67cb25
 &wood_df,
Packit 67cb25
 &wood_fdf,
Packit 67cb25
 4, 0};
Packit 67cb25
Packit 67cb25
gsl_multimin_function wood_fmin =
Packit 67cb25
{&wood_f,
Packit 67cb25
 4, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
wood_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, -3.0);
Packit 67cb25
  gsl_vector_set (x, 1, -1.0);
Packit 67cb25
  gsl_vector_set (x, 2, -3.0);
Packit 67cb25
  gsl_vector_set (x, 3, -1.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double wood_f (const gsl_vector * x, void *params)
Packit 67cb25
{
Packit 67cb25
  double u1 = gsl_vector_get(x,0);
Packit 67cb25
  double u2 = gsl_vector_get(x,1);
Packit 67cb25
  double u3 = gsl_vector_get(x,2);
Packit 67cb25
  double u4 = gsl_vector_get(x,3);
Packit 67cb25
Packit 67cb25
  double t1 = u1 * u1 - u2;
Packit 67cb25
  double t2 = u3 * u3 - u4;
Packit 67cb25
  fcount++;
Packit 67cb25
  return 100 * t1 * t1 + (1 - u1) * (1 - u1)
Packit 67cb25
    + 90 * t2 * t2 + (1 - u3) * (1 - u3)
Packit 67cb25
    + 10.1 * ( (1 - u2) * (1 - u2) + (1 - u4) * (1 - u4) )
Packit 67cb25
    + 19.8 * (1 - u2) * (1 - u4);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void wood_df (const gsl_vector * x, void *params, gsl_vector * df)
Packit 67cb25
{
Packit 67cb25
  double u1 = gsl_vector_get(x,0);
Packit 67cb25
  double u2 = gsl_vector_get(x,1);
Packit 67cb25
  double u3 = gsl_vector_get(x,2);
Packit 67cb25
  double u4 = gsl_vector_get(x,3);
Packit 67cb25
Packit 67cb25
  double t1 = u1 * u1 - u2;
Packit 67cb25
  double t2 = u3 * u3 - u4;
Packit 67cb25
  gcount++;
Packit 67cb25
  gsl_vector_set(df,0, 400 * u1 * t1 - 2 * (1 - u1) );
Packit 67cb25
  gsl_vector_set(df,1, -200 * t1 - 20.2 * (1 - u2) - 19.8 * (1 - u4) );
Packit 67cb25
  gsl_vector_set(df,2, 360 * u3 * t2 - 2 * (1 - u3) );
Packit 67cb25
  gsl_vector_set(df,3, -180 * t2 - 20.2 * (1 - u4) - 19.8 * (1 - u2) );
Packit 67cb25
  
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void wood_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df)
Packit 67cb25
{
Packit 67cb25
  wood_df(x,params,df);
Packit 67cb25
  *f=wood_f(x,params);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
gsl_multimin_function_fdf Nrosenbrock =
Packit 67cb25
{&rosenbrock_f,
Packit 67cb25
 &Nrosenbrock_df,
Packit 67cb25
 &Nrosenbrock_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void Nrosenbrock_df (const gsl_vector * x, void *params, gsl_vector * df)
Packit 67cb25
{
Packit 67cb25
  gsl_multimin_function F ;
Packit 67cb25
  F.f = rosenbrock_f;
Packit 67cb25
  F.params = params;
Packit 67cb25
  F.n = x->size;
Packit 67cb25
  gsl_multimin_diff (&F, x, df);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void Nrosenbrock_fdf (const gsl_vector * x, void *params, double * f,
Packit 67cb25
                     gsl_vector * df) 
Packit 67cb25
{
Packit 67cb25
  *f = rosenbrock_f (x, params);
Packit 67cb25
  Nrosenbrock_df (x, params, df);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
gsl_multimin_function_fdf Nroth =
Packit 67cb25
{&roth_f,
Packit 67cb25
 &Nroth_df,
Packit 67cb25
 &Nroth_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void Nroth_df (const gsl_vector * x, void *params, gsl_vector * df)
Packit 67cb25
{
Packit 67cb25
  gsl_multimin_function F ;
Packit 67cb25
  F.f = roth_f;
Packit 67cb25
  F.params = params;
Packit 67cb25
  F.n = x->size;
Packit 67cb25
  gsl_multimin_diff (&F, x, df);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void Nroth_fdf (const gsl_vector * x, void *params, double * f,
Packit 67cb25
                     gsl_vector * df) 
Packit 67cb25
{
Packit 67cb25
  *f = roth_f (x, params);
Packit 67cb25
  Nroth_df (x, params, df);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
gsl_multimin_function_fdf Nwood =
Packit 67cb25
{&wood_f,
Packit 67cb25
 &Nwood_df,
Packit 67cb25
 &Nwood_fdf,
Packit 67cb25
 4, 0};
Packit 67cb25
Packit 67cb25
void Nwood_df (const gsl_vector * x, void *params, gsl_vector * df)
Packit 67cb25
{
Packit 67cb25
  gsl_multimin_function F ;
Packit 67cb25
  F.f = wood_f;
Packit 67cb25
  F.params = params;
Packit 67cb25
  F.n = x->size;
Packit 67cb25
  gsl_multimin_diff (&F, x, df);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void Nwood_fdf (const gsl_vector * x, void *params, double * f,
Packit 67cb25
                     gsl_vector * df) 
Packit 67cb25
{
Packit 67cb25
  *f = wood_f (x, params);
Packit 67cb25
  Nwood_df (x, params, df);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
gsl_multimin_function spring_fmin = { &spring_f,
Packit 67cb25
  3, 0
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
spring_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, 1.0);
Packit 67cb25
  gsl_vector_set (x, 1, 0.0);
Packit 67cb25
  gsl_vector_set (x, 2, 7.0 * M_PI);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double
Packit 67cb25
spring_f (const gsl_vector * x, void *params)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
  double x2 = gsl_vector_get (x, 2);
Packit 67cb25
Packit 67cb25
  double theta = atan2 (x1, x0);
Packit 67cb25
  double r = sqrt (x0 * x0 + x1 * x1);
Packit 67cb25
  double z = x2;
Packit 67cb25
  while (z > M_PI)
Packit 67cb25
    z -= 2.0 * M_PI;
Packit 67cb25
  while (z < -M_PI)
Packit 67cb25
    z += 2.0 * M_PI;
Packit 67cb25
  {
Packit 67cb25
    double tmz = theta - z;
Packit 67cb25
    double rm1 = r - 1.0;
Packit 67cb25
    double ret = 0.1 * (expm1 (tmz * tmz + rm1 * rm1) + fabs (x2 / 10.0));
Packit 67cb25
    return ret;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25