|
Packit |
67cb25 |
#define eckerle_N 35
|
|
Packit |
67cb25 |
#define eckerle_P 3
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define eckerle_NTRIES 1
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double eckerle_x0[eckerle_P] = { 1.0, 10.0, 500.0 };
|
|
Packit |
67cb25 |
static double eckerle_epsrel = 1.0e-7;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double eckerle_sigma[eckerle_P] = {
|
|
Packit |
67cb25 |
1.5408051163E-02, 4.6803020753E-02, 4.6800518816E-02
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double eckerle_X[eckerle_N] = {
|
|
Packit |
67cb25 |
400.000000, 405.000000, 410.000000, 415.000000, 420.000000,
|
|
Packit |
67cb25 |
425.000000, 430.000000, 435.000000, 436.500000, 438.000000,
|
|
Packit |
67cb25 |
439.500000, 441.000000, 442.500000, 444.000000, 445.500000,
|
|
Packit |
67cb25 |
447.000000, 448.500000, 450.000000, 451.500000, 453.000000,
|
|
Packit |
67cb25 |
454.500000, 456.000000, 457.500000, 459.000000, 460.500000,
|
|
Packit |
67cb25 |
462.000000, 463.500000, 465.000000, 470.000000, 475.000000,
|
|
Packit |
67cb25 |
480.000000, 485.000000, 490.000000, 495.000000, 500.000000 };
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static double eckerle_F[eckerle_N] = {
|
|
Packit |
67cb25 |
0.0001575, 0.0001699, 0.0002350, 0.0003102, 0.0004917,
|
|
Packit |
67cb25 |
0.0008710, 0.0017418, 0.0046400, 0.0065895, 0.0097302,
|
|
Packit |
67cb25 |
0.0149002, 0.0237310, 0.0401683, 0.0712559, 0.1264458,
|
|
Packit |
67cb25 |
0.2073413, 0.2902366, 0.3445623, 0.3698049, 0.3668534,
|
|
Packit |
67cb25 |
0.3106727, 0.2078154, 0.1164354, 0.0616764, 0.0337200,
|
|
Packit |
67cb25 |
0.0194023, 0.0117831, 0.0074357, 0.0022732, 0.0008800,
|
|
Packit |
67cb25 |
0.0004579, 0.0002345, 0.0001586, 0.0001143, 0.0000710 };
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static void
|
|
Packit |
67cb25 |
eckerle_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.4635887487E-03;
|
|
Packit |
67cb25 |
const double eckerle_x[eckerle_P] = { 1.5543827178E+00,
|
|
Packit |
67cb25 |
4.0888321754E+00,
|
|
Packit |
67cb25 |
4.5154121844E+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 < eckerle_P; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_test_rel(x[i], eckerle_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 |
eckerle_f (const gsl_vector * x, void *params, gsl_vector * f)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double b[eckerle_P];
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < eckerle_P; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
b[i] = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < eckerle_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = eckerle_X[i];
|
|
Packit |
67cb25 |
double term = xi - b[2];
|
|
Packit |
67cb25 |
double yi;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
yi = b[0] / b[1] * exp(-0.5 * term * term / b[1] / b[1]);
|
|
Packit |
67cb25 |
gsl_vector_set (f, i, yi - eckerle_F[i]);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static int
|
|
Packit |
67cb25 |
eckerle_df (const gsl_vector * x, void *params, gsl_matrix * df)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double b[eckerle_P];
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < eckerle_P; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
b[i] = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < eckerle_N; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = eckerle_X[i];
|
|
Packit |
67cb25 |
double term1 = xi - b[2];
|
|
Packit |
67cb25 |
double term2 = exp(-0.5 * term1 * term1 / (b[1] * b[1]));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_matrix_set (df, i, 0, term2 / b[1]);
|
|
Packit |
67cb25 |
gsl_matrix_set (df, i, 1,
|
|
Packit |
67cb25 |
-b[0] * term2 / (b[1] * b[1]) + b[0] / pow(b[1], 4.0) * term2 * term1 * term1);
|
|
Packit |
67cb25 |
gsl_matrix_set (df, i, 2, b[0] / pow(b[1], 3.0) * term1 * term2);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static gsl_multifit_function_fdf eckerle_func =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
&eckerle_f,
|
|
Packit |
67cb25 |
&eckerle_df,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
eckerle_N,
|
|
Packit |
67cb25 |
eckerle_P,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
0,
|
|
Packit |
67cb25 |
0
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static test_fdf_problem eckerle_problem =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
"nist-eckerle",
|
|
Packit |
67cb25 |
eckerle_x0,
|
|
Packit |
67cb25 |
eckerle_sigma,
|
|
Packit |
67cb25 |
&eckerle_epsrel,
|
|
Packit |
67cb25 |
eckerle_NTRIES,
|
|
Packit |
67cb25 |
&eckerle_checksol,
|
|
Packit |
67cb25 |
&eckerle_func
|
|
Packit |
67cb25 |
};
|