Blame multifit_nlinear/test_exp1.c

Packit 67cb25
#define exp1_N         45
Packit 67cb25
#define exp1_P         4
Packit 67cb25
Packit 67cb25
static double exp1_x0[exp1_P] = { -1.0, -2.0, 1.0, -1.0 };
Packit 67cb25
static double exp1_epsrel = 1.0e-4;
Packit 67cb25
Packit 67cb25
static double exp1_Y[exp1_N] = {
Packit 67cb25
0.090542, 0.124569, 0.179367, 0.195654, 0.269707,
Packit 67cb25
0.286027, 0.289892, 0.317475, 0.308191, 0.336995,
Packit 67cb25
0.348371, 0.321337, 0.299423, 0.338972, 0.304763,
Packit 67cb25
0.288903, 0.300820, 0.303974, 0.283987, 0.262078,
Packit 67cb25
0.281593, 0.267531, 0.218926, 0.225572, 0.200594,
Packit 67cb25
0.197375, 0.182440, 0.183892, 0.152285, 0.174028,
Packit 67cb25
0.150874, 0.126220, 0.126266, 0.106384, 0.118923,
Packit 67cb25
0.091868, 0.128926, 0.119273, 0.115997, 0.105831,
Packit 67cb25
0.075261, 0.068387, 0.090823, 0.085205, 0.067203
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static void
Packit 67cb25
exp1_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.0e-2;
Packit 67cb25
  const double exp1_x[exp1_P] = { -4.0, -5.0, 4.0, -4.0 }; /* approx */
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 < exp1_P; ++i)
Packit 67cb25
    {
Packit 67cb25
      gsl_test_rel(x[i], exp1_x[i], epsrel, "%s/%s i=%zu",
Packit 67cb25
                   sname, pname, i);
Packit 67cb25
    }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
static int
Packit 67cb25
exp1_f (const gsl_vector * x, void *params, gsl_vector * f)
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 x4 = gsl_vector_get(x, 3);
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < exp1_N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double ti = 0.02*(i + 1.0);
Packit 67cb25
      double yi = exp1_Y[i];
Packit 67cb25
      double fi = yi - (x3*exp(x1*ti) + x4*exp(x2*ti));
Packit 67cb25
      gsl_vector_set(f, i, fi);
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
exp1_df (const gsl_vector * x, void *params, gsl_matrix * J)
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 x4 = gsl_vector_get(x, 3);
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < exp1_N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double ti = 0.02*(i + 1.0);
Packit 67cb25
      double term1 = exp(x1*ti);
Packit 67cb25
      double term2 = exp(x2*ti);
Packit 67cb25
Packit 67cb25
      gsl_matrix_set(J, i, 0, -x3*ti*term1);
Packit 67cb25
      gsl_matrix_set(J, i, 1, -x4*ti*term2);
Packit 67cb25
      gsl_matrix_set(J, i, 2, -term1);
Packit 67cb25
      gsl_matrix_set(J, i, 3, -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
exp1_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 x4 = gsl_vector_get(x, 3);
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
  double v4 = gsl_vector_get(v, 3);
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < exp1_N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double ti = 0.02*(i + 1.0);
Packit 67cb25
      double term1 = exp(x1*ti);
Packit 67cb25
      double term2 = exp(x2*ti);
Packit 67cb25
      double term3 = 2*v3 + ti*v1*x3;
Packit 67cb25
      double term4 = 2*v4 + ti*v2*x4;
Packit 67cb25
Packit 67cb25
      gsl_vector_set(fvv, i, -ti*(v1*term1*term3 + v2*term2*term4));
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 exp1_func =
Packit 67cb25
{
Packit 67cb25
  exp1_f,
Packit 67cb25
  exp1_df,
Packit 67cb25
  exp1_fvv,
Packit 67cb25
  exp1_N,
Packit 67cb25
  exp1_P,
Packit 67cb25
  NULL,
Packit 67cb25
  0,
Packit 67cb25
  0,
Packit 67cb25
  0
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static test_fdf_problem exp1_problem =
Packit 67cb25
{
Packit 67cb25
  "expfit1",
Packit 67cb25
  exp1_x0,
Packit 67cb25
  NULL,
Packit 67cb25
  NULL,
Packit 67cb25
  &exp1_epsrel,
Packit 67cb25
  &exp1_checksol,
Packit 67cb25
  &exp1_func
Packit 67cb25
};