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