/usr/share/gnudatalanguage/astrolib/flegendre.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 | function flegendre,x,m
;+
; NAME:
; FLEGENDRE
; PURPOSE:
; Compute the first M terms in a Legendre polynomial expansion.
; EXPLANATION:
; Meant to be used as a supplied function to SVDFIT.
;
; This procedure became partially obsolete in IDL V5.0 with the
; introduction of the /LEGENDRE keyword to SVDFIT and the associated
; SVDLEG function. However, note that, unlike SVDLEG, FLEGENDRE works
; on vector values of X.
; CALLING SEQUENCE:
; result = FLEGENDRE( X, M)
;
; INPUTS:
; X - the value of the independent variable, scalar or vector
; M - number of term of the Legendre expansion to compute, integer scalar
;
; OUTPUTS:
; result - (N,M) array, where N is the number of elements in X and M
; is the order. Contains the value of each Legendre term for
; each value of X
; EXAMPLE:
; (1) If x = 2.88 and M = 3 then
; IDL> print, flegendre(x,3) ==> [1.00, 2.88, 11.9416]
;
; This result can be checked by explicitly computing the first 3 Legendre
; terms, 1.0, x, 0.5*( 3*x^2 -1)
;
; (2) Find the coefficients to an M term Legendre polynomial that gives
; the best least-squares fit to a dataset (x,y)
; IDL> coeff = SVDFIT( x,y,M,func='flegendre')
;
; The coefficients can then be supplied to the function POLYLEG to
; compute the best YFIT values for any X.
; METHOD:
; The recurrence relation for the Legendre polynomials is used to compute
; each term. Compare with the function FLEG in "Numerical Recipes"
; by Press et al. (1992), p. 674
;
; REVISION HISTORY:
; Written Wayne Landsman Hughes STX April 1995
; Converted to IDL V5.0 W. Landsman September 1997
;-
On_Error,2
if N_params() LT 2 then begin
print,'Syntax - result = FLEGENDRE( x, m)'
return,0
endif
if m LT 1 then message, $
'ERROR - Order of Legendre polynomial must be at least 1'
N = N_elements(x)
size_x = size(x)
leg = make_array(n, m, type = size_x[size_x[0]+1] > 4)
leg[0,0] = replicate( 1., n)
if m GE 2 then leg[0,1] = x
if m GE 3 then begin
twox = 2.*x
f2 = x
d = 1.
for j=2,m-1 do begin
f1 = d
f2 = f2 + 2.*x
d = d+1.
leg[0,j] = ( f2*leg[*,j-1] - f1*leg[*,j-2] )/d
endfor
endif
return, leg
end
|