|
Packit |
67cb25 |
#define rat42_N 9
|
|
Packit |
67cb25 |
#define rat42_P 3
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double rat42_x0a[rat42_P] = { 100.0, 1.0, 0.1 };
|
|
Packit |
67cb25 |
static double rat42_x0b[rat42_P] = { 75.0, 2.5, 0.07 };
|
|
Packit |
67cb25 |
static double rat42_epsrel = 1.0e-7;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double rat42_sigma[rat42_P] = {
|
|
Packit |
67cb25 |
1.7340283401E+00, 8.8295217536E-02, 3.4465663377E-03
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double rat42_X[rat42_N] = { 9.0, 14.0, 21.0, 28.0, 42.0,
|
|
Packit |
67cb25 |
57.0, 63.0, 70.0, 79.0 };
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double rat42_F[rat42_N] = { 8.930, 10.800, 18.590, 22.330,
|
|
Packit |
67cb25 |
39.350, 56.110, 61.730, 64.620,
|
|
Packit |
67cb25 |
67.080 };
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static void
|
|
Packit |
67cb25 |
rat42_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 = 8.0565229338E+00;
|
|
Packit |
67cb25 |
const double rat42_x[rat42_P] = { 7.2462237576E+01,
|
|
Packit |
67cb25 |
2.6180768402E+00,
|
|
Packit |
67cb25 |
6.7359200066E-02 };
|
|
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 < rat42_P; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_test_rel(x[i], rat42_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 |
rat42_f (const gsl_vector * x, void *params, gsl_vector * f)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double b[rat42_P];
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < rat42_P; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
b[i] = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < rat42_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = rat42_X[i];
|
|
Packit |
67cb25 |
double yi = b[0] / (1.0 + exp(b[1] - b[2]*xi));
|
|
Packit |
67cb25 |
gsl_vector_set (f, i, yi - rat42_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 |
rat42_df (const gsl_vector * x, void *params, gsl_matrix * df)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double b[rat42_P];
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < rat42_P; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
b[i] = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < rat42_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = rat42_X[i];
|
|
Packit |
67cb25 |
double term1 = exp(b[1] - b[2]*xi);
|
|
Packit |
67cb25 |
double term2 = 1.0 + term1;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_matrix_set (df, i, 0, 1.0 / term2);
|
|
Packit |
67cb25 |
gsl_matrix_set (df, i, 1, -b[0] * term1 / (term2 * term2));
|
|
Packit |
67cb25 |
gsl_matrix_set (df, i, 2, b[0] * term1 * xi / (term2 * term2));
|
|
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 |
rat42_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 x3 = gsl_vector_get(x, 2);
|
|
Packit |
67cb25 |
double v1 = gsl_vector_get(v, 0);
|
|
Packit |
67cb25 |
double v2 = gsl_vector_get(v, 1);
|
|
Packit |
67cb25 |
double v3 = gsl_vector_get(v, 2);
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < rat42_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double ti = rat42_X[i];
|
|
Packit |
67cb25 |
double term1 = exp(x2);
|
|
Packit |
67cb25 |
double term2 = exp(ti * x3);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector_set(fvv, i,
|
|
Packit |
67cb25 |
-pow(term1 + term2, -3.0) * term1 * term2 *
|
|
Packit |
67cb25 |
(v2 - ti*v3) * (term1*(2*v1 - v2*x1 + ti*v3*x1) +
|
|
Packit |
67cb25 |
term2*(2*v1 + x1*(v2 - ti*v3))));
|
|
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 rat42_func =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
rat42_f,
|
|
Packit |
67cb25 |
rat42_df,
|
|
Packit |
67cb25 |
rat42_fvv,
|
|
Packit |
67cb25 |
rat42_N,
|
|
Packit |
67cb25 |
rat42_P,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
0,
|
|
Packit |
67cb25 |
0,
|
|
Packit |
67cb25 |
0
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static test_fdf_problem rat42a_problem =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
"nist-rat42a",
|
|
Packit |
67cb25 |
rat42_x0a,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
rat42_sigma,
|
|
Packit |
67cb25 |
&rat42_epsrel,
|
|
Packit |
67cb25 |
&rat42_checksol,
|
|
Packit |
67cb25 |
&rat42_func
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static test_fdf_problem rat42b_problem =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
"nist-rat42b",
|
|
Packit |
67cb25 |
rat42_x0b,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
rat42_sigma,
|
|
Packit |
67cb25 |
&rat42_epsrel,
|
|
Packit |
67cb25 |
&rat42_checksol,
|
|
Packit |
67cb25 |
&rat42_func
|
|
Packit |
67cb25 |
};
|