|
Packit |
67cb25 |
#define boxbod_N 6
|
|
Packit |
67cb25 |
#define boxbod_P 2
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double boxbod_x0a[boxbod_P] = { 1.0, 1.0 };
|
|
Packit |
67cb25 |
static double boxbod_x0b[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 |
(void)params; /* avoid unused parameter warning */
|
|
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 |
(void)params; /* avoid unused parameter warning */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static int
|
|
Packit |
67cb25 |
boxbod_fvv (const gsl_vector * x, const gsl_vector * v,
|
|
Packit |
67cb25 |
void *params, gsl_vector * fvv)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double x1 = gsl_vector_get(x, 0);
|
|
Packit |
67cb25 |
double x2 = gsl_vector_get(x, 1);
|
|
Packit |
67cb25 |
double v1 = gsl_vector_get(v, 0);
|
|
Packit |
67cb25 |
double v2 = gsl_vector_get(v, 1);
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < boxbod_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double ti = boxbod_X[i];
|
|
Packit |
67cb25 |
double term = exp(-x2 * ti);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector_set(fvv, i, term * ti * v2 * (2*v1 - ti*v2*x1));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
(void)params; /* avoid unused parameter warning */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static gsl_multifit_nlinear_fdf boxbod_func =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
boxbod_f,
|
|
Packit |
67cb25 |
boxbod_df,
|
|
Packit |
67cb25 |
boxbod_fvv,
|
|
Packit |
67cb25 |
boxbod_N,
|
|
Packit |
67cb25 |
boxbod_P,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
0,
|
|
Packit |
67cb25 |
0,
|
|
Packit |
67cb25 |
0
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static test_fdf_problem boxboda_problem =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
"nist-boxboda",
|
|
Packit |
67cb25 |
boxbod_x0a,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
boxbod_sigma,
|
|
Packit |
67cb25 |
&boxbod_epsrel,
|
|
Packit |
67cb25 |
&boxbod_checksol,
|
|
Packit |
67cb25 |
&boxbod_func
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static test_fdf_problem boxbodb_problem =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
"nist-boxbodb",
|
|
Packit |
67cb25 |
boxbod_x0b,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
boxbod_sigma,
|
|
Packit |
67cb25 |
&boxbod_epsrel,
|
|
Packit |
67cb25 |
&boxbod_checksol,
|
|
Packit |
67cb25 |
&boxbod_func
|
|
Packit |
67cb25 |
};
|