Blame multifit_nlinear/test_osborne.c

Packit 67cb25
#define osborne_N         33
Packit 67cb25
#define osborne_P         5
Packit 67cb25
Packit 67cb25
static double osborne_x0[osborne_P] = { 0.5, 1.5, -1.0, 0.01, 0.02 };
Packit 67cb25
static double osborne_epsrel = 1.0e-8;
Packit 67cb25
Packit 67cb25
static double osborne_Y[osborne_N] = {
Packit 67cb25
0.844, 0.908, 0.932, 0.936, 0.925, 0.908, 0.881,
Packit 67cb25
0.850, 0.818, 0.784, 0.751, 0.718, 0.685, 0.658,
Packit 67cb25
0.628, 0.603, 0.580, 0.558, 0.538, 0.522, 0.506,
Packit 67cb25
0.490, 0.478, 0.467, 0.457, 0.448, 0.438, 0.431,
Packit 67cb25
0.424, 0.420, 0.414, 0.411, 0.406
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static void
Packit 67cb25
osborne_checksol(const double x[], const double sumsq,
Packit 67cb25
                 const double epsrel, const char *sname,
Packit 67cb25
                 const char *pname)
Packit 67cb25
{
Packit 67cb25
  const double sumsq_exact = 5.464894697482687e-05;
Packit 67cb25
  double osborne_x[osborne_P];
Packit 67cb25
  
Packit 67cb25
  osborne_x[0] = 3.754100521058740e-01;
Packit 67cb25
  osborne_x[1] = GSL_NAN;
Packit 67cb25
  osborne_x[2] = GSL_NAN;
Packit 67cb25
  osborne_x[3] = GSL_NAN;
Packit 67cb25
  osborne_x[4] = GSL_NAN;
Packit 67cb25
Packit 67cb25
  gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq",
Packit 67cb25
               sname, pname);
Packit 67cb25
Packit 67cb25
  /* only the first model parameter is uniquely constrained */
Packit 67cb25
  gsl_test_rel(x[0], osborne_x[0], epsrel, "%s/%s i=0",
Packit 67cb25
               sname, pname);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
static int
Packit 67cb25
osborne_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
  double x5 = gsl_vector_get(x, 4);
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < osborne_N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double ti = 10.0*i;
Packit 67cb25
      double yi = osborne_Y[i];
Packit 67cb25
      double fi = yi - (x1 + x2*exp(-x4*ti) + x3*exp(-x5*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
osborne_df (const gsl_vector * x, void *params, gsl_matrix * J)
Packit 67cb25
{
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 x5 = gsl_vector_get(x, 4);
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < osborne_N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double ti = 10.0*i;
Packit 67cb25
      double term1 = exp(-x4*ti);
Packit 67cb25
      double term2 = exp(-x5*ti);
Packit 67cb25
Packit 67cb25
      gsl_matrix_set(J, i, 0, -1.0);
Packit 67cb25
      gsl_matrix_set(J, i, 1, -term1);
Packit 67cb25
      gsl_matrix_set(J, i, 2, -term2);
Packit 67cb25
      gsl_matrix_set(J, i, 3, ti*x2*term1);
Packit 67cb25
      gsl_matrix_set(J, i, 4, ti*x3*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
osborne_fvv (const gsl_vector * x, const gsl_vector * v,
Packit 67cb25
             void *params, gsl_vector * fvv)
Packit 67cb25
{
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 x5 = gsl_vector_get(x, 4);
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
  double v5 = gsl_vector_get(v, 4);
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < osborne_N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double ti = 10.0*i;
Packit 67cb25
      double term1 = exp(-x4*ti);
Packit 67cb25
      double term2 = exp(-x5*ti);
Packit 67cb25
      double term3 = -2*v2 + ti*v4*x2;
Packit 67cb25
      double term4 = -2*v3 + ti*v5*x3;
Packit 67cb25
Packit 67cb25
      gsl_vector_set(fvv, i, -term1 * term2 * ti *
Packit 67cb25
                             (v4 / term2 * term3 + v5 / term1 * 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 osborne_func =
Packit 67cb25
{
Packit 67cb25
  osborne_f,
Packit 67cb25
  osborne_df,
Packit 67cb25
  osborne_fvv,
Packit 67cb25
  osborne_N,
Packit 67cb25
  osborne_P,
Packit 67cb25
  NULL,
Packit 67cb25
  0,
Packit 67cb25
  0,
Packit 67cb25
  0
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static test_fdf_problem osborne_problem =
Packit 67cb25
{
Packit 67cb25
  "osborne",
Packit 67cb25
  osborne_x0,
Packit 67cb25
  NULL,
Packit 67cb25
  NULL,
Packit 67cb25
  &osborne_epsrel,
Packit 67cb25
  &osborne_checksol,
Packit 67cb25
  &osborne_func
Packit 67cb25
};