| 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 | } | 
|---|