Blame multifit/test_eckerle.c

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
};