/* expfit.c -- model functions for exponential + background */ struct data { size_t n; double * t; double * y; }; int gaussian_f (const gsl_vector * x, void *data, gsl_vector * f) { size_t n = ((struct data *)data)->n; double *t = ((struct data *)data)->t; double *y = ((struct data *)data)->y; double A1 = gsl_vector_get(x, 0); double mu1 = gsl_vector_get(x, 1); double sigma1 = gsl_vector_get(x, 2); double A2 = gsl_vector_get(x, 3); double mu2 = gsl_vector_get(x, 4); double sigma2 = gsl_vector_get(x, 5); double A3 = gsl_vector_get(x, 6); double mu3 = gsl_vector_get(x, 7); double sigma3 = gsl_vector_get(x, 8); size_t i; for (i = 0; i < n; ++i) { double ti = t[i]; double yi = y[i]; double term1 = (ti - mu1) / sigma1; double term2 = (ti - mu2) / sigma2; double term3 = (ti - mu3) / sigma3; double fi = 0.0; fi += A1 * exp(-0.5*term1*term1); fi += A2 * exp(-0.5*term2*term2); fi += A3 * exp(-0.5*term3*term3); gsl_vector_set(f, i, fi - yi); } return GSL_SUCCESS; }