Blame multifit_nlinear/test_kirby2.c

Packit 67cb25
#define kirby2_N       151
Packit 67cb25
#define kirby2_P       5
Packit 67cb25
Packit 67cb25
static double kirby2_x0a[kirby2_P] = { 2.0, -0.1, 0.003, -0.001, 0.00001 };
Packit 67cb25
static double kirby2_x0b[kirby2_P] = { 1.5, -0.15, 0.0025, -0.0015, 0.00002 }; 
Packit 67cb25
static double kirby2_x[kirby2_P] = { 1.6745063063E+00, -1.3927397867E-01, 2.5961181191E-03,
Packit 67cb25
                                    -1.7241811870E-03,  2.1664802578E-05 }; 
Packit 67cb25
Packit 67cb25
static double kirby2_epsrel = 1.0e-5;
Packit 67cb25
Packit 67cb25
static double kirby2_sigma[kirby2_P] = {
Packit 67cb25
  8.7989634338E-02, 4.1182041386E-03, 4.1856520458E-05,
Packit 67cb25
  5.8931897355E-05, 2.0129761919E-07
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static double kirby2_F1[kirby2_N] = {
Packit 67cb25
       0.0082E0, 0.0112E0, 0.0149E0, 0.0198E0, 0.0248E0,
Packit 67cb25
       0.0324E0, 0.0420E0, 0.0549E0, 0.0719E0, 0.0963E0,
Packit 67cb25
       0.1291E0, 0.1710E0, 0.2314E0, 0.3227E0, 0.4809E0,
Packit 67cb25
       0.7084E0, 1.0220E0, 1.4580E0, 1.9520E0, 2.5410E0,
Packit 67cb25
       3.2230E0, 3.9990E0, 4.8520E0, 5.7320E0, 6.7270E0,
Packit 67cb25
       7.8350E0, 9.0250E0, 10.2670E0, 11.5780E0, 12.9440E0,
Packit 67cb25
      14.3770E0, 15.8560E0, 17.3310E0, 18.8850E0, 20.5750E0,
Packit 67cb25
      22.3200E0, 22.3030E0, 23.4600E0, 24.0600E0, 25.2720E0,
Packit 67cb25
      25.8530E0, 27.1100E0, 27.6580E0, 28.9240E0, 29.5110E0,
Packit 67cb25
      30.7100E0, 31.3500E0, 32.5200E0, 33.2300E0, 34.3300E0,
Packit 67cb25
      35.0600E0, 36.1700E0, 36.8400E0, 38.0100E0, 38.6700E0,
Packit 67cb25
      39.8700E0, 40.0300E0, 40.5000E0, 41.3700E0, 41.6700E0,
Packit 67cb25
      42.3100E0, 42.7300E0, 43.4600E0, 44.1400E0, 44.5500E0,
Packit 67cb25
      45.2200E0, 45.9200E0, 46.3000E0, 47.0000E0, 47.6800E0,
Packit 67cb25
      48.0600E0, 48.7400E0, 49.4100E0, 49.7600E0, 50.4300E0,
Packit 67cb25
      51.1100E0, 51.5000E0, 52.1200E0, 52.7600E0, 53.1800E0,
Packit 67cb25
      53.7800E0, 54.4600E0, 54.8300E0, 55.4000E0, 56.4300E0,
Packit 67cb25
      57.0300E0, 58.0000E0, 58.6100E0, 59.5800E0, 60.1100E0,
Packit 67cb25
      61.1000E0, 61.6500E0, 62.5900E0, 63.1200E0, 64.0300E0,
Packit 67cb25
      64.6200E0, 65.4900E0, 66.0300E0, 66.8900E0, 67.4200E0,
Packit 67cb25
      68.2300E0, 68.7700E0, 69.5900E0, 70.1100E0, 70.8600E0,
Packit 67cb25
      71.4300E0, 72.1600E0, 72.7000E0, 73.4000E0, 73.9300E0,
Packit 67cb25
      74.6000E0, 75.1600E0, 75.8200E0, 76.3400E0, 76.9800E0,
Packit 67cb25
      77.4800E0, 78.0800E0, 78.6000E0, 79.1700E0, 79.6200E0,
Packit 67cb25
      79.8800E0, 80.1900E0, 80.6600E0, 81.2200E0, 81.6600E0,
Packit 67cb25
      82.1600E0, 82.5900E0, 83.1400E0, 83.5000E0, 84.0000E0,
Packit 67cb25
      84.4000E0, 84.8900E0, 85.2600E0, 85.7400E0, 86.0700E0,
Packit 67cb25
      86.5400E0, 86.8900E0, 87.3200E0, 87.6500E0, 88.1000E0,
Packit 67cb25
      88.4300E0, 88.8300E0, 89.1200E0, 89.5400E0, 89.8500E0,
Packit 67cb25
      90.2500E0, 90.5500E0, 90.9300E0, 91.2000E0, 91.5500E0,
Packit 67cb25
      92.2000E0
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
static double kirby2_F0[kirby2_N] = {
Packit 67cb25
    9.65E0, 10.74E0, 11.81E0, 12.88E0, 14.06E0,
Packit 67cb25
   15.28E0, 16.63E0, 18.19E0, 19.88E0, 21.84E0,
Packit 67cb25
   24.00E0, 26.25E0, 28.86E0, 31.85E0, 35.79E0,
Packit 67cb25
   40.18E0, 44.74E0, 49.53E0, 53.94E0, 58.29E0,
Packit 67cb25
   62.63E0, 67.03E0, 71.25E0, 75.22E0, 79.33E0,
Packit 67cb25
   83.56E0, 87.75E0, 91.93E0, 96.10E0, 100.28E0,
Packit 67cb25
  104.46E0, 108.66E0, 112.71E0, 116.88E0, 121.33E0,
Packit 67cb25
  125.79E0, 125.79E0, 128.74E0, 130.27E0, 133.33E0,
Packit 67cb25
  134.79E0, 137.93E0, 139.33E0, 142.46E0, 143.90E0,
Packit 67cb25
  146.91E0, 148.51E0, 151.41E0, 153.17E0, 155.97E0,
Packit 67cb25
  157.76E0, 160.56E0, 162.30E0, 165.21E0, 166.90E0,
Packit 67cb25
  169.92E0, 170.32E0, 171.54E0, 173.79E0, 174.57E0,
Packit 67cb25
  176.25E0, 177.34E0, 179.19E0, 181.02E0, 182.08E0,
Packit 67cb25
  183.88E0, 185.75E0, 186.80E0, 188.63E0, 190.45E0,
Packit 67cb25
  191.48E0, 193.35E0, 195.22E0, 196.23E0, 198.05E0,
Packit 67cb25
  199.97E0, 201.06E0, 202.83E0, 204.69E0, 205.86E0,
Packit 67cb25
  207.58E0, 209.50E0, 210.65E0, 212.33E0, 215.43E0,
Packit 67cb25
  217.16E0, 220.21E0, 221.98E0, 225.06E0, 226.79E0,
Packit 67cb25
  229.92E0, 231.69E0, 234.77E0, 236.60E0, 239.63E0,
Packit 67cb25
  241.50E0, 244.48E0, 246.40E0, 249.35E0, 251.32E0,
Packit 67cb25
  254.22E0, 256.24E0, 259.11E0, 261.18E0, 264.02E0,
Packit 67cb25
  266.13E0, 268.94E0, 271.09E0, 273.87E0, 276.08E0,
Packit 67cb25
  278.83E0, 281.08E0, 283.81E0, 286.11E0, 288.81E0,
Packit 67cb25
  291.08E0, 293.75E0, 295.99E0, 298.64E0, 300.84E0,
Packit 67cb25
  302.02E0, 303.48E0, 305.65E0, 308.27E0, 310.41E0,
Packit 67cb25
  313.01E0, 315.12E0, 317.71E0, 319.79E0, 322.36E0,
Packit 67cb25
  324.42E0, 326.98E0, 329.01E0, 331.56E0, 333.56E0,
Packit 67cb25
  336.10E0, 338.08E0, 340.60E0, 342.57E0, 345.08E0,
Packit 67cb25
  347.02E0, 349.52E0, 351.44E0, 353.93E0, 355.83E0,
Packit 67cb25
  358.32E0, 360.20E0, 362.67E0, 364.53E0, 367.00E0,
Packit 67cb25
  371.30E0
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static void
Packit 67cb25
kirby2_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 = 3.9050739624E+00;
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 < kirby2_P; ++i)
Packit 67cb25
    {
Packit 67cb25
      gsl_test_rel(x[i], kirby2_x[i], epsrel, "%s/%s i=%zu",
Packit 67cb25
                   sname, pname, i);
Packit 67cb25
    }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
static int
Packit 67cb25
kirby2_f (const gsl_vector * x, void *params, gsl_vector * f)
Packit 67cb25
{
Packit 67cb25
  double b[kirby2_P];
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < kirby2_P; i++)
Packit 67cb25
    {
Packit 67cb25
      b[i] = gsl_vector_get(x, i);
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  for (i = 0; i < kirby2_N; i++)
Packit 67cb25
    {
Packit 67cb25
      double t = kirby2_F0[i];
Packit 67cb25
      double y = ((b[0] + t* (b[1]  + t * b[2]))
Packit 67cb25
                  / (1 + t*(b[3]  + t *b[4])));
Packit 67cb25
      gsl_vector_set (f, i, kirby2_F1[i] - y);
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
kirby2_df (const gsl_vector * x, void *params, gsl_matrix * df)
Packit 67cb25
{
Packit 67cb25
  double b[kirby2_P];
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < kirby2_P; i++)
Packit 67cb25
    {
Packit 67cb25
      b[i] = gsl_vector_get(x, i);
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  for (i = 0; i < kirby2_N; i++)
Packit 67cb25
    {
Packit 67cb25
      double t = kirby2_F0[i];
Packit 67cb25
      double u = (b[0] + t*(b[1] + t*b[2]));
Packit 67cb25
      double v = (1 + t*(b[3] + t*b[4]));
Packit 67cb25
      gsl_matrix_set (df, i, 0, -1/v);
Packit 67cb25
      gsl_matrix_set (df, i, 1, -t/v);
Packit 67cb25
      gsl_matrix_set (df, i, 2, -t*t/v);
Packit 67cb25
      gsl_matrix_set (df, i, 3, t*u/(v*v));
Packit 67cb25
      gsl_matrix_set (df, i, 4, t*t*u/(v*v));
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
kirby2_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 x5 = gsl_vector_get(x, 4);
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
  double v5 = gsl_vector_get(v, 4);
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < kirby2_N; i++)
Packit 67cb25
    {
Packit 67cb25
      double t = kirby2_F0[i];
Packit 67cb25
      double term1 = 1.0 + t*(x4 + t*x5);
Packit 67cb25
Packit 67cb25
      gsl_vector_set(fvv, i, -2*t/pow(term1, 3.0) *
Packit 67cb25
                             (v4 + t*v5) *
Packit 67cb25
                             (-t*(-v2 + v4*x1 +
Packit 67cb25
                                  t*(-v3 + v5*x1 + v4*x2 + t*v5*x2 + t*(v4+t*v5)*x3)) +
Packit 67cb25
                             t*t*(v2 + t*v3)*(x4 + t*x5) + v1*(1.0 + t*(x4 + t*x5))));
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 kirby2_func =
Packit 67cb25
{
Packit 67cb25
  kirby2_f,
Packit 67cb25
  kirby2_df,
Packit 67cb25
  kirby2_fvv,
Packit 67cb25
  kirby2_N,
Packit 67cb25
  kirby2_P,
Packit 67cb25
  NULL,
Packit 67cb25
  0,
Packit 67cb25
  0,
Packit 67cb25
  0
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static test_fdf_problem kirby2a_problem =
Packit 67cb25
{
Packit 67cb25
  "nist-kirby2a",
Packit 67cb25
  kirby2_x0a,
Packit 67cb25
  NULL,
Packit 67cb25
  kirby2_sigma,
Packit 67cb25
  &kirby2_epsrel,
Packit 67cb25
  &kirby2_checksol,
Packit 67cb25
  &kirby2_func
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static test_fdf_problem kirby2b_problem =
Packit 67cb25
{
Packit 67cb25
  "nist-kirby2b",
Packit 67cb25
  kirby2_x0b,
Packit 67cb25
  NULL,
Packit 67cb25
  kirby2_sigma,
Packit 67cb25
  &kirby2_epsrel,
Packit 67cb25
  &kirby2_checksol,
Packit 67cb25
  &kirby2_func
Packit 67cb25
};