|
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 |
};
|