~valavanisalex/ubuntu/maverick/scidavis/fix-604811

« back to all changes in this revision

Viewing changes to fitPlugins/exp_saturation/exp_saturation.c

  • Committer: Bazaar Package Importer
  • Author(s): Ruben Molina
  • Date: 2009-09-06 11:34:04 UTC
  • Revision ID: james.westby@ubuntu.com-20090906113404-4awaey82l3686w4q
Tags: upstream-0.2.3
ImportĀ upstreamĀ versionĀ 0.2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <gsl/gsl_vector.h>
 
2
#include <gsl/gsl_matrix.h>
 
3
#include <math.h>
 
4
 
 
5
struct data {
 
6
        size_t n;
 
7
        size_t p;
 
8
        double * X;
 
9
        double * Y;
 
10
        double * sigma;
 
11
};
 
12
 
 
13
char * name() { return "ExponentialSaturation"; }
 
14
 
 
15
char * function() { return "b1*(1-exp(-b2*x))"; }
 
16
 
 
17
char * parameters() { return "b1,b2"; }
 
18
 
 
19
double function_eval(double x, double * params)
 
20
{
 
21
        return params[0]*(1-exp(-params[1]*x));
 
22
}
 
23
 
 
24
int function_f(const gsl_vector * params, void * void_data, gsl_vector * f)
 
25
{
 
26
        struct data * d = (struct data*) void_data;
 
27
        double b1 = gsl_vector_get(params, 0);
 
28
        double b2 = gsl_vector_get(params, 1);
 
29
        size_t i;
 
30
        for (i=0; i<d->n; i++)
 
31
                gsl_vector_set(f, i, (b1*(1-exp(-b2*d->X[i])) - d->Y[i])/d->sigma[i]);
 
32
        return GSL_SUCCESS;
 
33
}
 
34
 
 
35
int function_df(const gsl_vector * params, void * void_data, gsl_matrix *J)
 
36
{
 
37
        struct data * d = (struct data*) void_data;
 
38
        double b1 = gsl_vector_get(params, 0);
 
39
        double b2 = gsl_vector_get(params, 1);
 
40
        size_t i;
 
41
        for (i=0; i<d->n; i++) {
 
42
                double x = d->X[i];
 
43
                gsl_matrix_set(J, i, 0, (1-exp(-b2*x)));
 
44
                gsl_matrix_set(J, i, 1, b1*x*exp(-b2*x));
 
45
        }
 
46
        return GSL_SUCCESS;
 
47
}
 
48
 
 
49
int function_fdf(const gsl_vector * params, void * void_data, gsl_vector * f, gsl_matrix * J)
 
50
{
 
51
        function_f(params, void_data, f);
 
52
        function_df(params, void_data, J);
 
53
        return GSL_SUCCESS;
 
54
}
 
55
 
 
56
double function_d(const gsl_vector * params, void * void_data)
 
57
{
 
58
        struct data * d = (struct data*) void_data;
 
59
        gsl_vector * f = gsl_vector_alloc(d->n);
 
60
        double result = 0;
 
61
        size_t i;
 
62
 
 
63
        function_f(params, void_data, f);
 
64
        for (i=0; i<d->n; i++)
 
65
                result += pow(gsl_vector_get(f, i), 2);
 
66
 
 
67
        gsl_vector_free(f);
 
68
        return result;
 
69
}
 
70