|
Packit |
67cb25 |
#define brown2_N 5
|
|
Packit |
67cb25 |
#define brown2_P 5
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define brown2_NTRIES 3
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double brown2_x0[brown2_P] = { 0.5, 0.5, 0.5, 0.5, 0.5 };
|
|
Packit |
67cb25 |
static double brown2_epsrel = 1.0e-12;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static void
|
|
Packit |
67cb25 |
brown2_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 |
double sumsq_exact;
|
|
Packit |
67cb25 |
double alpha;
|
|
Packit |
67cb25 |
const double p = (double) brown2_P;
|
|
Packit |
67cb25 |
double alpha1mp, lhs, lastel;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (sumsq < 0.5)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* sumsq = 0 case */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
sumsq_exact = 0.0;
|
|
Packit |
67cb25 |
alpha = x[0];
|
|
Packit |
67cb25 |
alpha1mp = pow(alpha, 1.0 - p);
|
|
Packit |
67cb25 |
lhs = p*pow(alpha, p) - (p + 1)/alpha1mp;
|
|
Packit |
67cb25 |
lastel = alpha1mp;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test_rel(lhs, -1.0, epsrel, "%s/%s alpha lhs",
|
|
Packit |
67cb25 |
sname, pname);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* sumsq = 1 case */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
sumsq_exact = 1.0;
|
|
Packit |
67cb25 |
alpha = 0.0;
|
|
Packit |
67cb25 |
lastel = p + 1.0;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq",
|
|
Packit |
67cb25 |
sname, pname);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 1; i < brown2_P - 1; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_test_rel(x[i], alpha, epsrel, "%s/%s i=%zu",
|
|
Packit |
67cb25 |
sname, pname, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test_rel(x[brown2_P - 1], lastel, epsrel, "%s/%s last element",
|
|
Packit |
67cb25 |
sname, pname);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static int
|
|
Packit |
67cb25 |
brown2_f (const gsl_vector * x, void *params, gsl_vector * f)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
double sum = -(brown2_N + 1.0);
|
|
Packit |
67cb25 |
double prod = 1.0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < brown2_N; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
sum += xi;
|
|
Packit |
67cb25 |
prod *= xi;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < brown2_N - 1; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
gsl_vector_set(f, i, xi + sum);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector_set(f, brown2_N - 1, prod - 1.0);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static int
|
|
Packit |
67cb25 |
brown2_df (const gsl_vector * x, void *params, gsl_matrix * J)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
size_t i, j;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (j = 0; j < brown2_P; ++j)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double prod = 1.0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < brown2_N - 1; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double Jij = (i == j) ? 2.0 : 1.0;
|
|
Packit |
67cb25 |
gsl_matrix_set(J, i, j, Jij);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < brown2_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
if (i != j)
|
|
Packit |
67cb25 |
prod *= gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_matrix_set(J, brown2_N - 1, j, prod);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static gsl_multifit_function_fdf brown2_func =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
&brown2_f,
|
|
Packit |
67cb25 |
&brown2_df,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
brown2_N,
|
|
Packit |
67cb25 |
brown2_P,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
0,
|
|
Packit |
67cb25 |
0
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static test_fdf_problem brown2_problem =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
"brown_almost_linear",
|
|
Packit |
67cb25 |
brown2_x0,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
&brown2_epsrel,
|
|
Packit |
67cb25 |
brown2_NTRIES,
|
|
Packit |
67cb25 |
&brown2_checksol,
|
|
Packit |
67cb25 |
&brown2_func
|
|
Packit |
67cb25 |
};
|