6
#include <gsl/gsl_vector.h>
7
#include <gsl/gsl_blas.h>
9
#if defined(_MSC_VER) //MSVC Compiler
10
#define MY_EXPORT __declspec(dllexport)
20
double * sigma;//weighting data
23
extern "C" MY_EXPORT char *name()
28
extern "C" MY_EXPORT char *function()
30
return "(b + c*x)/(1 + a*x)";
33
extern "C" MY_EXPORT char *parameters()
38
extern "C" MY_EXPORT double function_eval(double x, double *params)
40
return (params[1] + x*params[2])/(1 + x*params[0]);
43
extern "C" MY_EXPORT int function_f (const gsl_vector * x, void *params,
46
size_t n = ((struct data *)params)->n;
47
double *X = ((struct data *)params)->X;
48
double *Y = ((struct data *)params)->Y;
49
double *sigma = ((struct data *)params)->sigma;
51
double a = gsl_vector_get (x, 0);
52
double b = gsl_vector_get (x, 1);
53
double c = gsl_vector_get (x, 2);
56
for (i = 0; i < n; i++)
58
double Yi = (b + c*X[i])/(1 + a*X[i]);
59
gsl_vector_set (f, i, (Yi - Y[i])/sigma[i]);
64
extern "C" MY_EXPORT double function_d (const gsl_vector * x, void *params)
66
size_t n = ((struct data *)params)->n;
67
double *X = ((struct data *)params)->X;
68
double *Y = ((struct data *)params)->Y;
69
double *sigma = ((struct data *)params)->sigma;
71
double a = gsl_vector_get (x, 0);
72
double b = gsl_vector_get (x, 1);
73
double c = gsl_vector_get (x, 2);
77
for (i = 0; i < n; i++)
79
double dYi = (((b + c*X[i])/(1 + a*X[i]))-Y[i])/sigma[i];
86
extern "C" MY_EXPORT int function_df (const gsl_vector * x, void *params,
89
size_t n = ((struct data *)params)->n;
90
double *X = ((struct data *)params)->X;
91
double *sigma = ((struct data *)params)->sigma;
93
double a = gsl_vector_get (x, 0);
94
double b = gsl_vector_get (x, 1);
95
double c = gsl_vector_get (x, 2);
98
for (i = 0; i < n; i++)
100
/* Jacobian matrix J(i,j) = dfi / dxj,
101
where fi = (Yi - Y[i])/sigma[i],
102
Yi = (b + c*X[i])/(1 + a*X[i])
103
and the xj are the parameters (a, b, c) */
107
double e = 1/(1 + a*t);
108
gsl_matrix_set (J, i, 0, -e*e*a*(b+c*t)/s);
109
gsl_matrix_set (J, i, 1, e/s);
110
gsl_matrix_set (J, i, 2, e*t/s);
116
extern "C" MY_EXPORT int function_fdf (const gsl_vector * x, void *params,
117
gsl_vector * f, gsl_matrix * J)
119
function_f (x, params, f);
120
function_df (x, params, J);