|
Packit |
67cb25 |
#define boxbod_N 6
|
|
Packit |
67cb25 |
#define boxbod_P 2
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define boxbod_NTRIES 1
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double boxbod_x0[boxbod_P] = { 100.0, 0.75 };
|
|
Packit |
67cb25 |
static double boxbod_epsrel = 1.0e-7;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double boxbod_sigma[boxbod_P] = {
|
|
Packit |
67cb25 |
1.2354515176E+01, 1.0455993237E-01
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double boxbod_X[boxbod_N] = { 1.0, 2.0, 3.0, 5.0, 7.0, 10.0 };
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double boxbod_F[boxbod_N] = { 109.0, 149.0, 149.0, 191.0,
|
|
Packit |
67cb25 |
213.0, 224.0 };
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static void
|
|
Packit |
67cb25 |
boxbod_checksol(const double x[], const double sumsq,
|
|
Packit |
67cb25 |
const double epsrel, const char *sname,
|
|
Packit |
67cb25 |
const char *pname)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
const double sumsq_exact = 1.1680088766E+03;
|
|
Packit |
67cb25 |
const double boxbod_x[boxbod_P] = { 2.1380940889E+02,
|
|
Packit |
67cb25 |
5.4723748542E-01 };
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq",
|
|
Packit |
67cb25 |
sname, pname);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < boxbod_P; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_test_rel(x[i], boxbod_x[i], epsrel, "%s/%s i=%zu",
|
|
Packit |
67cb25 |
sname, pname, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static int
|
|
Packit |
67cb25 |
boxbod_f (const gsl_vector * x, void *params, gsl_vector * f)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double b[boxbod_P];
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < boxbod_P; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
b[i] = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < boxbod_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = boxbod_X[i];
|
|
Packit |
67cb25 |
double yi;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
yi = b[0] * (1.0 - exp(-b[1] * xi));
|
|
Packit |
67cb25 |
gsl_vector_set (f, i, yi - boxbod_F[i]);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static int
|
|
Packit |
67cb25 |
boxbod_df (const gsl_vector * x, void *params, gsl_matrix * df)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double b[boxbod_P];
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < boxbod_P; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
b[i] = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < boxbod_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = boxbod_X[i];
|
|
Packit |
67cb25 |
double term = exp(-b[1] * xi);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_matrix_set (df, i, 0, 1.0 - term);
|
|
Packit |
67cb25 |
gsl_matrix_set (df, i, 1, b[0] * term * xi);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static gsl_multifit_function_fdf boxbod_func =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
&boxbod_f,
|
|
Packit |
67cb25 |
&boxbod_df,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
boxbod_N,
|
|
Packit |
67cb25 |
boxbod_P,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
0,
|
|
Packit |
67cb25 |
0
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static test_fdf_problem boxbod_problem =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
"nist-boxbod",
|
|
Packit |
67cb25 |
boxbod_x0,
|
|
Packit |
67cb25 |
boxbod_sigma,
|
|
Packit |
67cb25 |
&boxbod_epsrel,
|
|
Packit |
67cb25 |
boxbod_NTRIES,
|
|
Packit |
67cb25 |
&boxbod_checksol,
|
|
Packit |
67cb25 |
&boxbod_func
|
|
Packit |
67cb25 |
};
|