/usr/share/gnudatalanguage/astrolib/gaussian.pro is in gdl-astrolib 2018.02.16+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | function gaussian, xi, parms, pderiv, DOUBLE=double
;+
; NAME:
; GAUSSIAN
; PURPOSE:
; Compute the 1-d Gaussian function and optionally the derivative
; EXPLANATION:
; Compute the 1-D Gaussian function and optionally the derivative
; at an array of points.
;
; CALLING SEQUENCE:
; y = gaussian( xi, parms,[ pderiv ])
;
; INPUTS:
; xi = array, independent variable of Gaussian function.
;
; parms = parameters of Gaussian, 2, 3 or 4 element array:
; parms[0] = maximum value (factor) of Gaussian,
; parms[1] = mean value (center) of Gaussian,
; parms[2] = standard deviation (sigma) of Gaussian.
; (if parms has only 2 elements then sigma taken from previous
; call to gaussian(), which is stored in a common block).
; parms[3] = optional, constant offset added to Gaussian.
; OUTPUT:
; y - Function returns array of Gaussian evaluated at xi. Values will
; be floating pt. (even if xi is double) unless the /DOUBLE keyword
; is set.
;
; OPTIONAL INPUT:
; /DOUBLE - set this keyword to return double precision for both
; the function values and (optionally) the partial derivatives.
; OPTIONAL OUTPUT:
; pderiv = [N,3] or [N,4] output array of partial derivatives,
; computed only if parameter is present in call.
;
; pderiv[*,i] = partial derivative at all xi absisca values
; with respect to parms[i], i=0,1,2,[3].
;
;
; EXAMPLE:
; Evaulate a Gaussian centered at x=0, with sigma=1, and a peak value
; of 10 at the points 0.5 and 1.5. Also compute the derivative
;
; IDL> f = gaussian( [0.5,1.5], [10,0,1], DERIV )
; ==> f= [8.825,3.25]. DERIV will be a 2 x 3 array containing the
; numerical derivative at the two points with respect to the 3 parameters.
;
; COMMON BLOCKS:
; None
; HISTORY:
; Written, Frank Varosi NASA/GSFC 1992.
; Converted to IDL V5.0 W. Landsman September 1997
; Use machar() for machine precision, added /DOUBLE keyword,
; add optional constant 4th parameter W. Landsman November 2001
;-
On_error,2
common gaussian, sigma
if N_params() LT 2 then begin
print,'Syntax - y = GAUSSIAN( xi, parms,[ pderiv, /DOUBLE ])'
print,' parms[0] = maximum value (factor) of Gaussian'
print,' parms[1] = mean value (center) of Gaussian'
print,' parms[2] = standard deviation (sigma) of Gaussian'
print,' parms[3] = optional constant to be added to Gaussian'
return, -1
endif
common gaussian, sigma
Nparmg = N_elements( parms )
npts = N_elements(xi)
ptype = size(parms,/type)
if (ptype LE 3) or (ptype GE 12) then parms = float(parms)
if (Nparmg GE 3) then sigma = parms[2]
double = keyword_set(DOUBLE)
if double then $ ;Double precision?
gauss = dblarr( npts ) else $
gauss = fltarr( npts )
z = ( xi - parms[1] )/sigma
zz = z*z
; Get smallest value expressible on computer. Set lower values to 0 to avoid
; floating underflow
minexp = alog((machar(DOUBLE=double)).xmin)
w = where( zz LT -2*minexp, nw )
if (nw GT 0) then gauss[w] = exp( -zz[w] / 2 )
if N_params() GE 3 then begin
if double then $
pderiv = dblarr( npts, Nparmg ) else $
pderiv = fltarr( npts, Nparmg )
fsig = parms[0] / sigma
pderiv[0,0] = gauss
pderiv[0,1] = gauss * z * fsig
if (Nparmg GE 3) then pderiv[0,2] = gauss * zz * fsig
if (Nparmg GE 4) then pderiv[0,3] = replicate(1, npts)
endif
if Nparmg LT 4 then return, parms[0] * gauss else $
return, parms[0] * gauss + parms[3]
end
|