Blame multifit/test_rat42.c

Packit 67cb25
#define rat42_N       9
Packit 67cb25
#define rat42_P       3
Packit 67cb25
Packit 67cb25
#define rat42_NTRIES  1
Packit 67cb25
Packit 67cb25
static double rat42_x0[rat42_P] = { 100.0, 1.0, 0.1 };
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
  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
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
static gsl_multifit_function_fdf rat42_func =
Packit 67cb25
{
Packit 67cb25
  &rat42_f,
Packit 67cb25
  &rat42_df,
Packit 67cb25
  NULL,
Packit 67cb25
  rat42_N,
Packit 67cb25
  rat42_P,
Packit 67cb25
  NULL,
Packit 67cb25
  0,
Packit 67cb25
  0
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static test_fdf_problem rat42_problem =
Packit 67cb25
{
Packit 67cb25
  "nist-rat42",
Packit 67cb25
  rat42_x0,
Packit 67cb25
  rat42_sigma,
Packit 67cb25
  &rat42_epsrel,
Packit 67cb25
  rat42_NTRIES,
Packit 67cb25
  &rat42_checksol,
Packit 67cb25
  &rat42_func
Packit 67cb25
};