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