1 | #include <stdio.h>
|
---|
2 | #include <stdlib.h>
|
---|
3 | #include <math.h>
|
---|
4 |
|
---|
5 | /********************************************************************/
|
---|
6 | /* fonction de fit "f(x;h,x0,sig,c) = h*exp(-0.5*((x-x0)/sig)^2)+c" */
|
---|
7 | /* avec nvar=1 npar=4 */
|
---|
8 | /* x = x[0] */
|
---|
9 | /* p[0]=h, p[1]=x0, p[2]=sig, p[3]=c */
|
---|
10 | /********************************************************************/
|
---|
11 | double gauss1(double const* x,double const* p)
|
---|
12 | {
|
---|
13 | double xc;
|
---|
14 | xc = (x[0]-p[1])/p[2]; xc *= -xc/2.;
|
---|
15 | return((xc>=-80.) ? p[0]*exp(xc)+p[3] : p[3]);
|
---|
16 | }
|
---|
17 |
|
---|
18 | /* la definition de cette fonction n'est pas obligatoire */
|
---|
19 | /* dp[0] = df(x;h,x0,sig,c)/dh, dp[1] = etc... */
|
---|
20 | double gauss1_der(double const* x,double const* p,double* dp)
|
---|
21 | {
|
---|
22 | double xc,xc2,e,f;
|
---|
23 | xc = (x[0]-p[1])/p[2];
|
---|
24 | xc2 = xc*xc;
|
---|
25 | e = -xc2/2.;
|
---|
26 | if(e>=-80.) e = exp(e); else e = 0.;
|
---|
27 | f = p[0]*e;
|
---|
28 | dp[0] = e;
|
---|
29 | dp[1] = xc / p[2] *f;
|
---|
30 | dp[2] = xc2 / p[2] *f;
|
---|
31 | dp[3] = 1.;
|
---|
32 | return(f+p[3]);
|
---|
33 | }
|
---|
34 |
|
---|
35 | /********************************************************/
|
---|
36 | /* fonction de fit gaussienne 2D avec correlation */
|
---|
37 | /* f(x,y;h,x0,y0,sx,sy,rho,c) = */
|
---|
38 | /* h * exp{ -0.5*[ (x-x0)^2/sx^2 + (y-y0)^2/s^2 */
|
---|
39 | /* -2*rho*(x-x0)*(y-y0)/(sx*sy) ]} */
|
---|
40 | /* avec nvar=2 npar=7 */
|
---|
41 | /* x = x[0] et y=x[2] */
|
---|
42 | /* p[0]=h, p[1]=x0, p[2]=y0 */
|
---|
43 | /* p[3]=sx, p[4]=sy, p[5]=rho, p[6]=fond */
|
---|
44 | /********************************************************/
|
---|
45 | double gauss2(double const* x,double const* p)
|
---|
46 | {
|
---|
47 | double ax,ay,a;
|
---|
48 | ax = (x[0]-p[1])/p[3];
|
---|
49 | ay = (x[1]-p[2])/p[4];
|
---|
50 | a = -(ax*ax+ay*ay-2.*p[5]*ax*ay)/2.;
|
---|
51 | return((a>=-80.) ? p[0]*exp(a)+p[6] : p[6]);
|
---|
52 | }
|
---|
53 |
|
---|
54 | /* la definition de cette fonction n'est pas obligatoire */
|
---|
55 | /* dp[0] = f(x,y;h,x0,y0,sx,sy,rho,c)/dh, dp[1] = etc... */
|
---|
56 | double gauss2_der(double const* x,double const* p,double* dp)
|
---|
57 | {
|
---|
58 | double ax,ay,a,p0ea;
|
---|
59 | ax = (x[0]-p[1])/p[3];
|
---|
60 | ay = (x[1]-p[2])/p[4];
|
---|
61 | a = -(ax*ax+ay*ay-2.*p[5]*ax*ay)/2.;
|
---|
62 | p0ea = (a>=-80.) ? exp(a) : 0.;
|
---|
63 | dp[0] = p0ea;
|
---|
64 | p0ea *= p[0];
|
---|
65 | dp[1] = (ax-p[5]*ay)/p[3] *p0ea;
|
---|
66 | dp[2] = (ay-p[5]*ax)/p[4] *p0ea;
|
---|
67 | dp[3] = ax*dp[1];
|
---|
68 | dp[4] = ay*dp[2];
|
---|
69 | dp[5] = ax*ay *p0ea;
|
---|
70 | dp[6] = 1.;
|
---|
71 | return(p0ea+p[6]);
|
---|
72 | }
|
---|