Blame multiroots/test_funcs.c

Packit 67cb25
/* multiroots/test_funcs.c
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough
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_vector.h>
Packit 67cb25
#include <gsl/gsl_matrix.h>
Packit 67cb25
#include <gsl/gsl_multiroots.h>
Packit 67cb25
Packit 67cb25
#include "test_funcs.h"
Packit 67cb25
Packit 67cb25
/* For information on testing see the following paper,
Packit 67cb25
Packit 67cb25
   J.J More, B.S. Garbow, K.E. Hillstrom, "Testing Unconstrained
Packit 67cb25
   Optimization Software", ACM Transactions on Mathematical Software,
Packit 67cb25
   Vol 7, No 1, (1981) p 17-41
Packit 67cb25
Packit 67cb25
   */
Packit 67cb25
Packit 67cb25
/* Rosenbrock Function */
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf rosenbrock =
Packit 67cb25
{&rosenbrock_f,
Packit 67cb25
 &rosenbrock_df,
Packit 67cb25
 &rosenbrock_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
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
int
Packit 67cb25
rosenbrock_f (const gsl_vector * x, void *params, gsl_vector * f)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
Packit 67cb25
  double y0 = 1 - x0;
Packit 67cb25
  double y1 = 10 * (x1 - x0 * x0);
Packit 67cb25
Packit 67cb25
  gsl_vector_set (f, 0, y0);
Packit 67cb25
  gsl_vector_set (f, 1, y1);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
rosenbrock_df (const gsl_vector * x, void *params, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
Packit 67cb25
  double df00 = -1;
Packit 67cb25
  double df01 = 0;
Packit 67cb25
  double df10 = -20 * x0;
Packit 67cb25
  double df11 = 10;
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 0, 0, df00);
Packit 67cb25
  gsl_matrix_set (df, 0, 1, df01);
Packit 67cb25
  gsl_matrix_set (df, 1, 0, df10);
Packit 67cb25
  gsl_matrix_set (df, 1, 1, df11);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
rosenbrock_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  rosenbrock_f (x, params, f);
Packit 67cb25
  rosenbrock_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* Freudenstein and Roth function */
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf roth =
Packit 67cb25
{&roth_f,
Packit 67cb25
 &roth_df,
Packit 67cb25
 &roth_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
roth_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, 4.5);  /* changed from the value in the paper */
Packit 67cb25
  gsl_vector_set (x, 1, 3.5);  /* otherwise the problem is too hard */
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
roth_f (const gsl_vector * x, void *params, gsl_vector * f)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
Packit 67cb25
  double y0 = -13.0 + x0 + ((5.0 - x1)*x1 - 2.0)*x1;
Packit 67cb25
  double y1 = -29.0 + x0 + ((x1 + 1.0)*x1 - 14.0)*x1;
Packit 67cb25
Packit 67cb25
  gsl_vector_set (f, 0, y0);
Packit 67cb25
  gsl_vector_set (f, 1, y1);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
roth_df (const gsl_vector * x, void *params, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
Packit 67cb25
  double df00 = 1;
Packit 67cb25
  double df01 = -3 * x1 * x1 + 10 * x1 - 2;
Packit 67cb25
  double df10 = 1;
Packit 67cb25
  double df11 = 3 * x1 * x1 + 2 * x1 - 14;
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 0, 0, df00);
Packit 67cb25
  gsl_matrix_set (df, 0, 1, df01);
Packit 67cb25
  gsl_matrix_set (df, 1, 0, df10);
Packit 67cb25
  gsl_matrix_set (df, 1, 1, df11);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
roth_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  roth_f (x, params, f);
Packit 67cb25
  roth_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* Powell badly scaled function */
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf powellscal =
Packit 67cb25
{&powellscal_f,
Packit 67cb25
 &powellscal_df,
Packit 67cb25
 &powellscal_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
powellscal_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  gsl_vector_set (x, 0, 0.0);
Packit 67cb25
  gsl_vector_set (x, 1, 1.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
powellscal_f (const gsl_vector * x, void *params, gsl_vector * f)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
Packit 67cb25
  double y0 = 10000.0 * x0 * x1 - 1.0;
Packit 67cb25
  double y1 = exp (-x0) + exp (-x1) - 1.0001;
Packit 67cb25
Packit 67cb25
  gsl_vector_set (f, 0, y0);
Packit 67cb25
  gsl_vector_set (f, 1, y1);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
powellscal_df (const gsl_vector * x, void *params, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
Packit 67cb25
  double df00 = 10000.0 * x1, df01 = 10000.0 * x0;
Packit 67cb25
  double df10 = -exp (-x0), df11 = -exp (-x1);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 0, 0, df00);
Packit 67cb25
  gsl_matrix_set (df, 0, 1, df01);
Packit 67cb25
  gsl_matrix_set (df, 1, 0, df10);
Packit 67cb25
  gsl_matrix_set (df, 1, 1, df11);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
powellscal_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                  gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  powellscal_f (x, params, f);
Packit 67cb25
  powellscal_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* Brown badly scaled function */
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf brownscal =
Packit 67cb25
{&brownscal_f,
Packit 67cb25
 &brownscal_df,
Packit 67cb25
 &brownscal_fdf,
Packit 67cb25
 2, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
brownscal_initpt (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
int
Packit 67cb25
brownscal_f (const gsl_vector * x, void *params, gsl_vector * f)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
Packit 67cb25
  double y0 = x0 - 1e6;
Packit 67cb25
  double y1 = x0 * x1 - 2;
Packit 67cb25
Packit 67cb25
  gsl_vector_set (f, 0, y0);
Packit 67cb25
  gsl_vector_set (f, 1, y1);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
brownscal_df (const gsl_vector * x, void *params, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
Packit 67cb25
  double df00 = 1.0, df01 = 0.0;
Packit 67cb25
  double df10 = x1, df11 = x0;
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 0, 0, df00);
Packit 67cb25
  gsl_matrix_set (df, 0, 1, df01);
Packit 67cb25
  gsl_matrix_set (df, 1, 0, df10);
Packit 67cb25
  gsl_matrix_set (df, 1, 1, df11);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
brownscal_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                  gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  brownscal_f (x, params, f);
Packit 67cb25
  brownscal_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* Powell Singular Function */
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf powellsing =
Packit 67cb25
{&powellsing_f,
Packit 67cb25
 &powellsing_df,
Packit 67cb25
 &powellsing_fdf,
Packit 67cb25
 4, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
powellsing_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, 0.0);
Packit 67cb25
  gsl_vector_set (x, 3, 1.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
powellsing_f (const gsl_vector * x, void *params, gsl_vector * f)
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
  double x3 = gsl_vector_get (x, 3);
Packit 67cb25
Packit 67cb25
  double y0 = x0 + 10 * x1;
Packit 67cb25
  double y1 = sqrt (5.0) * (x2 - x3);
Packit 67cb25
  double y2 = pow (x1 - 2 * x2, 2.0);
Packit 67cb25
  double y3 = sqrt (10.0) * pow (x0 - x3, 2.0);
Packit 67cb25
Packit 67cb25
  gsl_vector_set (f, 0, y0);
Packit 67cb25
  gsl_vector_set (f, 1, y1);
Packit 67cb25
  gsl_vector_set (f, 2, y2);
Packit 67cb25
  gsl_vector_set (f, 3, y3);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
powellsing_df (const gsl_vector * x, void *params, gsl_matrix * df)
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
  double x3 = gsl_vector_get (x, 3);
Packit 67cb25
Packit 67cb25
  double df00 = 1, df01 = 10, df02 = 0, df03 = 0;
Packit 67cb25
  double df10 = 0, df11 = 0, df12 = sqrt (5.0), df13 = -df12;
Packit 67cb25
  double df20 = 0, df21 = 2 * (x1 - 2 * x2), df22 = -2 * df21, df23 = 0;
Packit 67cb25
  double df30 = 2 * sqrt (10.0) * (x0 - x3), df31 = 0, df32 = 0, df33 = -df30;
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 0, 0, df00);
Packit 67cb25
  gsl_matrix_set (df, 0, 1, df01);
Packit 67cb25
  gsl_matrix_set (df, 0, 2, df02);
Packit 67cb25
  gsl_matrix_set (df, 0, 3, df03);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 1, 0, df10);
Packit 67cb25
  gsl_matrix_set (df, 1, 1, df11);
Packit 67cb25
  gsl_matrix_set (df, 1, 2, df12);
Packit 67cb25
  gsl_matrix_set (df, 1, 3, df13);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 2, 0, df20);
Packit 67cb25
  gsl_matrix_set (df, 2, 1, df21);
Packit 67cb25
  gsl_matrix_set (df, 2, 2, df22);
Packit 67cb25
  gsl_matrix_set (df, 2, 3, df23);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 3, 0, df30);
Packit 67cb25
  gsl_matrix_set (df, 3, 1, df31);
Packit 67cb25
  gsl_matrix_set (df, 3, 2, df32);
Packit 67cb25
  gsl_matrix_set (df, 3, 3, df33);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
powellsing_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                    gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  powellsing_f (x, params, f);
Packit 67cb25
  powellsing_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* Wood function */
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf wood =
Packit 67cb25
{&wood_f,
Packit 67cb25
 &wood_df,
Packit 67cb25
 &wood_fdf,
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
int
Packit 67cb25
wood_f (const gsl_vector * x, void *params, gsl_vector * f)
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
  double x3 = gsl_vector_get (x, 3);
Packit 67cb25
Packit 67cb25
  double t1 = x1 - x0 * x0;
Packit 67cb25
  double t2 = x3 - x2 * x2;
Packit 67cb25
Packit 67cb25
  double y0 = -200.0 * x0 * t1 - (1 - x0);
Packit 67cb25
  double y1 = 200.0 * t1 + 20.2 * (x1 - 1) + 19.8 * (x3 - 1);
Packit 67cb25
  double y2 = -180.0 * x2 * t2 - (1 - x2);
Packit 67cb25
  double y3 = 180.0 * t2 + 20.2 * (x3 - 1) + 19.8 * (x1 - 1);
Packit 67cb25
Packit 67cb25
  gsl_vector_set (f, 0, y0);
Packit 67cb25
  gsl_vector_set (f, 1, y1);
Packit 67cb25
  gsl_vector_set (f, 2, y2);
Packit 67cb25
  gsl_vector_set (f, 3, y3);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
wood_df (const gsl_vector * x, void *params, gsl_matrix * df)
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
  double x3 = gsl_vector_get (x, 3);
Packit 67cb25
Packit 67cb25
  double t1 = x1 - 3 * x0 * x0;
Packit 67cb25
  double t2 = x3 - 3 * x2 * x2;
Packit 67cb25
Packit 67cb25
  double df00 = -200.0 * t1 + 1, df01 = -200.0 * x0, df02 = 0, df03 = 0;
Packit 67cb25
  double df10 = -400.0*x0, df11 = 200.0 + 20.2, df12 = 0, df13 = 19.8;
Packit 67cb25
  double df20 = 0, df21 = 0, df22 = -180.0 * t2 + 1, df23 = -180.0 * x2;
Packit 67cb25
  double df30 = 0, df31 = 19.8, df32 = -2 * 180 * x2, df33 = 180.0 + 20.2;
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 0, 0, df00);
Packit 67cb25
  gsl_matrix_set (df, 0, 1, df01);
Packit 67cb25
  gsl_matrix_set (df, 0, 2, df02);
Packit 67cb25
  gsl_matrix_set (df, 0, 3, df03);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 1, 0, df10);
Packit 67cb25
  gsl_matrix_set (df, 1, 1, df11);
Packit 67cb25
  gsl_matrix_set (df, 1, 2, df12);
Packit 67cb25
  gsl_matrix_set (df, 1, 3, df13);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 2, 0, df20);
Packit 67cb25
  gsl_matrix_set (df, 2, 1, df21);
Packit 67cb25
  gsl_matrix_set (df, 2, 2, df22);
Packit 67cb25
  gsl_matrix_set (df, 2, 3, df23);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 3, 0, df30);
Packit 67cb25
  gsl_matrix_set (df, 3, 1, df31);
Packit 67cb25
  gsl_matrix_set (df, 3, 2, df32);
Packit 67cb25
  gsl_matrix_set (df, 3, 3, df33);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
wood_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                    gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  wood_f (x, params, f);
Packit 67cb25
  wood_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* Helical Valley Function */
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf helical =
Packit 67cb25
{&helical_f,
Packit 67cb25
 &helical_df,
Packit 67cb25
 &helical_fdf,
Packit 67cb25
 3, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
helical_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, 0.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
helical_f (const gsl_vector * x, void *params, gsl_vector * f)
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 t1, t2;
Packit 67cb25
  double y0, y1, y2;
Packit 67cb25
Packit 67cb25
  if (x0 > 0) 
Packit 67cb25
    {
Packit 67cb25
      t1 = atan(x1/x0) / (2.0 * M_PI);
Packit 67cb25
    }
Packit 67cb25
  else if (x0 < 0)
Packit 67cb25
    {
Packit 67cb25
      t1 = 0.5 + atan(x1/x0) / (2.0 * M_PI);
Packit 67cb25
    }
Packit 67cb25
  else
Packit 67cb25
    {
Packit 67cb25
      t1 = 0.25 * (x1 > 0 ? +1 : -1);
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  t2 = sqrt(x0*x0 + x1*x1) ;
Packit 67cb25
  
Packit 67cb25
  y0 = 10 * (x2 - 10 * t1);
Packit 67cb25
  y1 = 10 * (t2 - 1);
Packit 67cb25
  y2 = x2 ;
Packit 67cb25
Packit 67cb25
  gsl_vector_set (f, 0, y0);
Packit 67cb25
  gsl_vector_set (f, 1, y1);
Packit 67cb25
  gsl_vector_set (f, 2, y2);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
helical_df (const gsl_vector * x, void *params, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  double x0 = gsl_vector_get (x, 0);
Packit 67cb25
  double x1 = gsl_vector_get (x, 1);
Packit 67cb25
Packit 67cb25
  double t = x0 * x0 + x1 * x1 ;
Packit 67cb25
  double t1 = 2 * M_PI * t ;
Packit 67cb25
  double t2 = sqrt(t) ;
Packit 67cb25
Packit 67cb25
  double df00 = 100*x1/t1, df01 = -100.0 * x0/t1, df02 = 10.0;
Packit 67cb25
  double df10 = 10*x0/t2, df11 = 10*x1/t2, df12 = 0;
Packit 67cb25
  double df20 = 0, df21 = 0, df22 = 1.0;
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 0, 0, df00);
Packit 67cb25
  gsl_matrix_set (df, 0, 1, df01);
Packit 67cb25
  gsl_matrix_set (df, 0, 2, df02);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 1, 0, df10);
Packit 67cb25
  gsl_matrix_set (df, 1, 1, df11);
Packit 67cb25
  gsl_matrix_set (df, 1, 2, df12);
Packit 67cb25
Packit 67cb25
  gsl_matrix_set (df, 2, 0, df20);
Packit 67cb25
  gsl_matrix_set (df, 2, 1, df21);
Packit 67cb25
  gsl_matrix_set (df, 2, 2, df22);
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
helical_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                    gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  helical_f (x, params, f);
Packit 67cb25
  helical_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* Discrete Boundary Value Function */
Packit 67cb25
Packit 67cb25
#define N 10
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf dbv =
Packit 67cb25
{&dbv_f,
Packit 67cb25
 &dbv_df,
Packit 67cb25
 &dbv_fdf,
Packit 67cb25
 N, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
dbv_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  size_t i;
Packit 67cb25
  double h = 1.0 / (N + 1.0);
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; i++)
Packit 67cb25
    {
Packit 67cb25
      double t = (i + 1) * h;
Packit 67cb25
      double z = t * (t - 1);
Packit 67cb25
      gsl_vector_set (x, i, z);
Packit 67cb25
    }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
dbv_f (const gsl_vector * x, void *params, gsl_vector * f)
Packit 67cb25
{
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  double h = 1.0 / (N + 1.0);
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; i++)
Packit 67cb25
    {
Packit 67cb25
      double z, ti = (i + 1) * h;
Packit 67cb25
      double xi = 0, xim1 = 0, xip1 = 0;
Packit 67cb25
Packit 67cb25
      xi = gsl_vector_get (x, i);
Packit 67cb25
      
Packit 67cb25
      if (i > 0)
Packit 67cb25
        xim1 = gsl_vector_get (x, i - 1);
Packit 67cb25
Packit 67cb25
      if (i < N - 1)
Packit 67cb25
        xip1 = gsl_vector_get (x, i + 1);
Packit 67cb25
Packit 67cb25
      z = 2 * xi - xim1 - xip1 + h * h * pow(xi + ti + 1, 3.0) / 2.0;
Packit 67cb25
Packit 67cb25
      gsl_vector_set (f, i, z);
Packit 67cb25
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
dbv_df (const gsl_vector * x, void *params, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  size_t i, j;
Packit 67cb25
Packit 67cb25
  double h = 1.0 / (N + 1.0);
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; i++)
Packit 67cb25
    for (j = 0; j < N; j++)
Packit 67cb25
      gsl_matrix_set (df, i, j, 0.0);
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; i++)
Packit 67cb25
    {
Packit 67cb25
      double dz_dxi, ti = (i + 1) * h;
Packit 67cb25
Packit 67cb25
      double xi = gsl_vector_get (x, i);
Packit 67cb25
      
Packit 67cb25
      dz_dxi = 2.0 + (3.0 / 2.0) * h * h * pow(xi + ti + 1, 2.0) ;
Packit 67cb25
      
Packit 67cb25
      gsl_matrix_set (df, i, i, dz_dxi);
Packit 67cb25
Packit 67cb25
      if (i > 0)
Packit 67cb25
        gsl_matrix_set (df, i, i-1, -1.0);
Packit 67cb25
Packit 67cb25
      if (i < N - 1)
Packit 67cb25
        gsl_matrix_set (df, i, i+1, -1.0);
Packit 67cb25
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
dbv_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                    gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  dbv_f (x, params, f);
Packit 67cb25
  dbv_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* Trigonometric Function */
Packit 67cb25
Packit 67cb25
gsl_multiroot_function_fdf trig =
Packit 67cb25
{&trig_f,
Packit 67cb25
 &trig_df,
Packit 67cb25
 &trig_fdf,
Packit 67cb25
 N, 0};
Packit 67cb25
Packit 67cb25
void
Packit 67cb25
trig_initpt (gsl_vector * x)
Packit 67cb25
{
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; i++)       /* choose an initial point which converges */
Packit 67cb25
    {
Packit 67cb25
      gsl_vector_set (x, i, 0.05);   
Packit 67cb25
    }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
trig_f (const gsl_vector * x, void *params, gsl_vector * f)
Packit 67cb25
{
Packit 67cb25
  size_t i;
Packit 67cb25
  double sum = 0;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; i++)
Packit 67cb25
    {
Packit 67cb25
      sum += cos(gsl_vector_get(x,i));
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; i++)
Packit 67cb25
    {
Packit 67cb25
      double xi = gsl_vector_get (x,i);
Packit 67cb25
      double z = N - sum + (i + 1) * (1 - cos(xi)) - sin(xi);
Packit 67cb25
Packit 67cb25
      gsl_vector_set (f, i, z);
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
trig_df (const gsl_vector * x, void *params, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  size_t i, j;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; i++)
Packit 67cb25
    {
Packit 67cb25
      for (j = 0; j < N; j++)
Packit 67cb25
        {
Packit 67cb25
          double dz;
Packit 67cb25
          double xi = gsl_vector_get(x, i);
Packit 67cb25
          double xj = gsl_vector_get(x, j);
Packit 67cb25
Packit 67cb25
          if (j == i)
Packit 67cb25
            dz = sin(xi) + (i + 1) * sin(xi) - cos(xi);
Packit 67cb25
          else
Packit 67cb25
            dz = sin(xj);
Packit 67cb25
          
Packit 67cb25
          gsl_matrix_set(df, i, j, dz);
Packit 67cb25
        }
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  params = 0;                   /* avoid warning about unused parameters */
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
trig_fdf (const gsl_vector * x, void *params,
Packit 67cb25
                    gsl_vector * f, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  trig_f (x, params, f);
Packit 67cb25
  trig_df (x, params, df);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}