|
Packit |
67cb25 |
#define osborne_N 33
|
|
Packit |
67cb25 |
#define osborne_P 5
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define osborne_NTRIES 3
|
|
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 |
const double osborne_x[osborne_P] = {
|
|
Packit |
67cb25 |
3.754100521058740e-01,
|
|
Packit |
67cb25 |
-99999.0,
|
|
Packit |
67cb25 |
-99999.0,
|
|
Packit |
67cb25 |
-99999.0,
|
|
Packit |
67cb25 |
-99999.0 };
|
|
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 |
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 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static gsl_multifit_function_fdf osborne_func =
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
&osborne_f,
|
|
Packit |
67cb25 |
&osborne_df,
|
|
Packit |
67cb25 |
NULL,
|
|
Packit |
67cb25 |
osborne_N,
|
|
Packit |
67cb25 |
osborne_P,
|
|
Packit |
67cb25 |
NULL,
|
|
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 |
&osborne_epsrel,
|
|
Packit |
67cb25 |
osborne_NTRIES,
|
|
Packit |
67cb25 |
&osborne_checksol,
|
|
Packit |
67cb25 |
&osborne_func
|
|
Packit |
67cb25 |
};
|