IDL Curve Fitting Routines

 

For detail information please refer to the IDL reference manual.
COMFIT - Six common types of gradient-expansion least-square fit
EXPONENTIAL Y = a0 * a1^x + a2
GEOMETRIC Y = a0 * x^a1 + a2
GOMPERTZ Y = a0 * a1^(a2*x) + a3
HYPERBOLIC Y = 1./(a0 + a1*x)
LOGISTIC Y = 1./(a0 * a1^x + a2)
LOGSQUARE Y = a0 + a1*alog10(x) + a2 * alog10(x)^2
CURVEFIT - Least-square fit to an arbitrary non-linear function
GAUSSFIT - Least-square fit to
F(x) = A0*EXP(-((x-A1)/A2)^2/2) + A3 + A4*x + A5*x^2
LADFIT - Least-absolute-deviation fit to Y = A + Bx
LINFIT - Minimize-chi-square error fit to Y = A + Bx
LMFIT - Non-linear least-square fit to n arbitrary non-linear function
POLYFITW - Weighted least-square polynomial fit
POLY_FIT - Least-square polynomial fit
REGRESS - Multiple linear regression fit
SVDFIT - Least-square fit to user-supplied/built-in/legendre polynomial

List of Routines


Routine Descriptions

COMFIT

[Next Routine] [List of Routines]
 NAME:
       COMFIT

 PURPOSE:
       This function fits the paired data {X(i), Y(i)} to one of six common
       types of appoximating models using a gradient-expansion least-squares
       method. The result is a vector containing the model parameters.

 CATEGORY:
       Statistics.

 CALLING SEQUENCE:
       Result = COMFIT(X, Y, A)

 INPUTS:
       X:    An n-element vector of type integer, float or double.

       Y:    An n-element vector of type integer, float or double.

       A:    A vector of initial estimates for each model parameter. The length
             of this vector depends upon the type of model selected.

 KEYWORD PARAMETERS:
       EXPONENTIAL:    If set to a non-zero value, the parameters of the 
                       exponential model are computed. Y = a0  * a1^x + a2.

         GEOMETRIC:    If set to a non-zero value, the parameters of the
                       geometric model are computed.  Y = a0 * x^a1 + a2.
    
          GOMPERTZ:    If set to a non-zero value, the parameters of the
                       Gompertz model are computed.  Y = a0 * a1^(a2*x) + a3.

        HYPERBOLIC:    If set to a non-zero value, the parameters of the
                       hyperbolic model are computed.  Y = 1./(a0 + a1*x)

          LOGISTIC:    If set to a non-zero value, the parameters of the
                       logistic model are computed.  Y = 1./(a0 * a1^x + a2)

         LOGSQUARE:    If set to a non-zero value, the parameters of the
                       logsquare model are computed.
			Y = a0 + a1*alog10(x) + a2 * alog10(x)^2

             SIGMA:    Use this keyword to specify a named variable which 
                       returns a vector of standard deviations for the computed
                       model parameters.
                
           WEIGHTS:    An n-element vector of weights. If the WEIGHTS vector 
                       is not specified, an n-element vector of 1.0s is used.

              YFIT:    Use this keyword to specify a named variable which 
                       returns n-element vector of y-data corresponding to the 
                       computed model parameters.

 EXAMPLE:
       Define two n-element vectors of paired data.
         x = [2.27, 15.01, 34.74, 36.01, 43.65, 50.02, 53.84, 58.30, 62.12, $
             64.66, 71.66, 79.94, 85.67, 114.95]
         y = [5.16, 22.63, 34.36, 34.92, 37.98, 40.22, 41.46, 42.81, 43.91, $
             44.62, 46.44, 48.43, 49.70, 55.31]
       Define a 3-element vector of initial estimates for the logsquare model.
         a = [1.5, 1.5, 1.5]
       Compute the model parameters of the logsquare model, a(0), a(1), & a(2).
         result = comfit(x, y, a, sigma = sigma, yfit = yfit, /logsquare)
       The result should be the 3-element vector:
         [1.42494, 7.21900, 9.18794]

 REFERENCE:
       APPLIED STATISTICS (third edition)
       J. Neter, W. Wasserman, G.A. Whitmore
       ISBN 0-205-10328-6

 MODIFICATION HISTORY:
       Written by:  GGS, RSI, September 1994

(See /usr/local/rsi/idl_5/lib/comfit.pro)


CURVEFIT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       CURVEFIT

 PURPOSE:
       Non-linear least squares fit to a function of an arbitrary 
       number of parameters.  The function may be any non-linear 
       function.  If available, partial derivatives can be calculated by 
       the user function, else this routine will estimate partial derivatives
       with a forward difference approximation.

 CATEGORY:
       E2 - Curve and Surface Fitting.

 CALLING SEQUENCE:
       Result = CURVEFIT(X, Y, Weights, A, SIGMA, FUNCTION_NAME = name, $
                         ITMAX=ITMAX, ITER=ITER, TOL=TOL, /NODERIVATIVE)

 INPUTS:
       X:  A row vector of independent variables.  This routine does
		not manipulate or use values in X, it simply passes X
		to the user-written function.

       Y:  A row vector containing the dependent variable.

  Weights:  A row vector of weights, the same length as Y.
            For no weighting,
                 Weights(i) = 1.0.
            For instrumental (Gaussian) weighting,
                 Weights(i)=1.0/sigma(i)^2
            For statistical (Poisson)  weighting,
                 Weights(i) = 1.0/y(i), etc.

       A:  A vector, with as many elements as the number of terms, that 
           contains the initial estimate for each parameter.  If A is double-
           precision, calculations are performed in double precision, 
           otherwise they are performed in single precision. Fitted parameters
           are returned in A.

 KEYWORDS:
       FUNCTION_NAME:  The name of the function (actually, a procedure) to 
       fit.  If omitted, "FUNCT" is used. The procedure must be written as
       described under RESTRICTIONS, below.

       ITMAX:  Maximum number of iterations. Default = 20.
       ITER:   The actual number of iterations which were performed
       TOL:    The convergence tolerance. The routine returns when the
               relative decrease in chi-squared is less than TOL in an 
               interation. Default = 1.e-3.
       CHI2:   The value of chi-squared on exit (obselete)
     
       CHISQ:   The value of reduced chi-squared on exit
       NODERIVATIVE:   If this keyword is set then the user procedure will not
               be requested to provide partial derivatives. The partial
               derivatives will be estimated in CURVEFIT using forward
               differences. If analytical derivatives are available they
               should always be used.

 OUTPUTS:
       Returns a vector of calculated values.
       A:  A vector of parameters containing fit.

 OPTIONAL OUTPUT PARAMETERS:
       Sigmaa:  A vector of standard deviations for the parameters in A.

 COMMON BLOCKS:
       NONE.

 SIDE EFFECTS:
       None.

 RESTRICTIONS:
       The function to be fit must be defined and called FUNCT,
       unless the FUNCTION_NAME keyword is supplied.  This function,
       (actually written as a procedure) must accept values of
       X (the independent variable), and A (the fitted function's
       parameter values), and return F (the function's value at
       X), and PDER (a 2D array of partial derivatives).
       For an example, see FUNCT in the IDL User's Libaray.
       A call to FUNCT is entered as:
       FUNCT, X, A, F, PDER
 where:
       X = Variable passed into CURVEFIT.  It is the job of the user-written
		function to interpret this variable.
       A = Vector of NTERMS function parameters, input.
       F = Vector of NPOINT values of function, y(i) = funct(x), output.
       PDER = Array, (NPOINT, NTERMS), of partial derivatives of funct.
               PDER(I,J) = DErivative of function at ith point with
               respect to jth parameter.  Optional output parameter.
               PDER should not be calculated if the parameter is not
               supplied in call. If the /NODERIVATIVE keyword is set in the
               call to CURVEFIT then the user routine will never need to
               calculate PDER.

 PROCEDURE:
       Copied from "CURFIT", least squares fit to a non-linear
       function, pages 237-239, Bevington, Data Reduction and Error
       Analysis for the Physical Sciences.  This is adapted from:
	Marquardt, "An Algorithm for Least-Squares Estimation of Nonlinear
	Parameters", J. Soc. Ind. Appl. Math., Vol 11, no. 2, pp. 431-441,
	June, 1963.

       "This method is the Gradient-expansion algorithm which
       combines the best features of the gradient search with
       the method of linearizing the fitting function."

       Iterations are performed until the chi square changes by
       only TOL or until ITMAX iterations have been performed.

       The initial guess of the parameter values should be
       as close to the actual values as possible or the solution
       may not converge.

 EXAMPLE:  Fit a function of the form f(x) = a * exp(b*x) + c to
	sample pairs contained in x and y.
	In this example, a=a(0), b=a(1) and c=a(2).
	The partials are easily computed symbolicaly:
		df/da = exp(b*x), df/db = a * x * exp(b*x), and df/dc = 1.0

		Here is the user-written procedure to return F(x) and
		the partials, given x:
       pro gfunct, x, a, f, pder	; Function + partials
	  bx = exp(a(1) * x)
         f= a(0) * bx + a(2)		;Evaluate the function
         if N_PARAMS() ge 4 then $	;Return partials?
		pder= [[bx], [a(0) * x * bx], [replicate(1.0, N_ELEMENTS(f))]]
       end

         x=findgen(10)			;Define indep & dep variables.
         y=[12.0, 11.0,10.2,9.4,8.7,8.1,7.5,6.9,6.5,6.1]
         Weights=1.0/y			;Weights
         a=[10.0,-0.1,2.0]		;Initial guess
         yfit=curvefit(x,y,Weights,a,sigma,function_name='gfunct')
	  print, 'Function parameters: ', a
         print, yfit
       end

 MODIFICATION HISTORY:
       Written, DMS, RSI, September, 1982.
       Does not iterate if the first guess is good.  DMS, Oct, 1990.
       Added CALL_PROCEDURE to make the function's name a parameter.
              (Nov 1990)
       12/14/92 - modified to reflect the changes in the 1991
            edition of Bevington (eq. II-27) (jiy-suggested by CreaSo)
       Mark Rivers, U of Chicago, Feb. 12, 1995
           - Added following keywords: ITMAX, ITER, TOL, CHI2, NODERIVATIVE
             These make the routine much more generally useful.
           - Removed Oct. 1990 modification so the routine does one iteration
             even if first guess is good. Required to get meaningful output
             for errors. 
           - Added forward difference derivative calculations required for 
             NODERIVATIVE keyword.
           - Fixed a bug: PDER was passed to user's procedure on first call, 
             but was not defined. Thus, user's procedure might not calculate
             it, but the result was then used.

	Steve Penton, RSI, June 1996.
            - Changed SIGMAA to SIGMA to be consistant with other fitting 
              routines.
            - Changed CHI2 to CHISQ to be consistant with other fitting 
              routines.
            - Changed W to Weights to be consistant with other fitting 
              routines.
	     _ Updated docs regarding weighing.
           

(See /usr/local/rsi/idl_5/lib/curvefit.pro)


GAUSSFIT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
	GAUSSFIT

 PURPOSE:
 	Fit the equation y=f(x) where:

 		F(x) = A0*EXP(-z^2/2) + A3 + A4*x + A5*x^2
 			and
		z=(x-A1)/A2

	A0 = height of exp, A1 = center of exp, A2 = sigma (the width).
	A3 = constant term, A4 = linear term, A5 = quadratic term.
	Terms A3, A4, and A5 are optional.
 	The parameters A0, A1, A2, A3 are estimated and then CURVEFIT is 
	called.

 CATEGORY:
	?? - fitting

 CALLING SEQUENCE:
	Result = GAUSSFIT(X, Y [, A])

 INPUTS:
	X:	The independent variable.  X must be a vector.
	Y:	The dependent variable.  Y must have the same number of points
		as X.
 KEYWORD INPUTS:
 KEYWORD INPUTS:
	ESTIMATES = optional starting estimates for the parameters of the 
		equation.  Should contain NTERMS (6 if NTERMS is not
		provided) elements.
	NTERMS = Set NTERMS to 3 to compute the fit: F(x) = A0*EXP(-z^2/2).
	   Set it to 4 to fit:  F(x) = A0*EXP(-z^2/2) + A3
	   Set it to 5 to fit:  F(x) = A0*EXP(-z^2/2) + A3 + A4*x

 OUTPUTS:
	The fitted function is returned.

 OPTIONAL OUTPUT PARAMETERS:
	A:	The coefficients of the fit.  A is a three to six
		element vector as described under PURPOSE.

 COMMON BLOCKS:
	None.

 SIDE EFFECTS:
	None.

 RESTRICTIONS:
	The peak or minimum of the Gaussian must be the largest
	or smallest point in the Y vector.

 PROCEDURE:
	The initial estimates are either calculated by the below procedure
	or passed in by the caller.  Then the function CURVEFIT is called
	to find the least-square fit of the gaussian to the data.

  Initial estimate calculation:
	If the (MAX-AVG) of Y is larger than (AVG-MIN) then it is assumed
	that the line is an emission line, otherwise it is assumed there
	is an absorbtion line.  The estimated center is the MAX or MIN
	element.  The height is (MAX-AVG) or (AVG-MIN) respectively.
	The width is found by searching out from the extrema until
	a point is found less than the 1/e value.

 MODIFICATION HISTORY:
	DMS, RSI, Dec, 1983.
	DMS, RSI, Jun, 1995, Added NTERMS keyword.  Result is now float if 
				Y is not double.
	DMS, RSI, Added ESTIMATES keyword.

(See /usr/local/rsi/idl_5/lib/gaussfit.pro)


LADFIT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       LADFIT

 PURPOSE:
       This function fits the paired data {X(i), Y(i)} to the linear model,
       y = A + Bx, using a "robust" least absolute deviation method. The 
       result is a two-element vector containing the model parameters, A 
       and B.

 CATEGORY:
       Statistics.

 CALLING SEQUENCE:
       Result = LADFIT(X, Y)

 INPUTS:
       X:    An n-element vector of type integer, float or double.

       Y:    An n-element vector of type integer, float or double.

 KEYWORD PARAMETERS:
  ABSDEV:    Use this keyword to specify a named variable which returns the
             mean absolute deviation for each data-point in the y-direction.

  DOUBLE:    If set to a non-zero value, computations are done in double 
             precision arithmetic.

 EXAMPLE:
       Define two n-element vectors of paired data.
         x = [-3.20, 4.49, -1.66, 0.64, -2.43, -0.89, -0.12, 1.41, $
               2.95, 2.18,  3.72, 5.26]
         y = [-7.14, -1.30, -4.26, -1.90, -6.19, -3.98, -2.87, -1.66, $
              -0.78, -2.61,  0.31,  1.74]
       Compute the model parameters, A and B.
         result = ladfit(x, y, absdev = absdev)
       The result should be the two-element vector:
         [-3.15301, 0.930440]
       The keyword parameter should be returned as:
         absdev = 0.636851

 REFERENCE:
       Numerical Recipes, The Art of Scientific Computing (Second Edition)
       Cambridge University Press
       ISBN 0-521-43108-5

 MODIFICATION HISTORY:
       Written by:  GGS, RSI, September 1994
       Modified:    GGS, RSI, July 1995
                    Corrected an infinite loop condition that occured when
                    the X input parameter contained mostly negative data.
       Modified:    GGS, RSI, October 1996
                    If least-absolute-deviation convergence condition is not
                    satisfied, the algorithm switches to a chi-squared model.
                    Modified keyword checking and use of double precision.
       Modified:    GGS, RSI, November 1996
                    Fixed an error in the computation of the median with
                    even-length input data. See EVEN keyword to MEDIAN.

(See /usr/local/rsi/idl_5/lib/ladfit.pro)


LINFIT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       LINFIT

 PURPOSE:
       This function fits the paired data {X(i), Y(i)} to the linear model,
       y = A + Bx, by minimizing the chi-square error statistic. The result
       is a two-element vector containing the model parameters,[A,B].

 CATEGORY:
       Statistics.

 CALLING SEQUENCE:
       Result = LINFIT(X, Y)

 INPUTS:
       X:    An n-element vector of type integer, float or double.

       Y:    An n-element vector of type integer, float or double.

 KEYWORD PARAMETERS:
   CHISQ:    Use this keyword to specify a named variable which returns the
             chi-square error statistic as the sum of squared errors between
             Y(i) and A + BX(i). If individual standard deviations are 
             supplied, then the chi-square error statistic is computed as
             the sum of squared errors divided by the standard deviations.

  DOUBLE:    If set to a non-zero value, computations are done in double 
             precision arithmetic.

    PROB:    Use this keyword to specify a named variable which returns the
             probability that the computed fit would have a value of CHISQR 
             or greater. If PROB is greater than 0.1, the model parameters 
             are "believable". If PROB is less than 0.1, the accuracy of the
             model parameters is questionable.

    SDEV:    An n-element vector of type integer, float or double that 
             specifies the individual standard deviations for {X(i), Y(i)}.

   SIGMA:    Use this keyword to specify a named variable which returns a 
             two-element vector of probable uncertainties for the model par-
             ameters, [SIG_A,SIG_B].

 EXAMPLE:
       Define two n-element vectors of paired data.
         x = [-3.20, 4.49, -1.66, 0.64, -2.43, -0.89, -0.12, 1.41, $
               2.95, 2.18,  3.72, 5.26]
         y = [-7.14, -1.30, -4.26, -1.90, -6.19, -3.98, -2.87, -1.66, $
              -0.78, -2.61,  0.31,  1.74]
       Define a vector of standard deviations with a constant value of 0.85
         sdev = replicate(0.85, n_elements(x))
       Compute the model parameters, A and B.
         result = linfit(x, y, chisq = chisq, prob = prob, sdev = sdev)
       The result should be the two-element vector:
         [-3.44596, 0.867329]
       The keyword parameters should be returned as:
         chisq = 11.4998, prob = 0.319925

 REFERENCE:
       Numerical Recipes, The Art of Scientific Computing (Second Edition)
       Cambridge University Press
       ISBN 0-521-43108-5

 MODIFICATION HISTORY:
       Written by:  GGS, RSI, September 1994
                    LINFIT is based on the routines: fit.c, gammq.c, gser.c,
                    and gcf.c described in section 15.2 of Numerical Recipes,
                    The Art of Scientific Computing (Second Edition), and is
                    used by permission.
         Modified:  SVP, RSI, June 1996
		     Changed SIG_AB to SIGMA to be consistant with the other
		     fitting functions. Changed CHISQR to CHISQ in the docs
                    for the same reason. Note that the chisqr and the SIG_AB
		     keywords are left for backwards compatibility.
         Modified:  GGS, RSI, October 1996
                    Modified keyword checking and use of double precision.
                    Added DOUBLE keyword.

(See /usr/local/rsi/idl_5/lib/linfit.pro)


LMFIT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       LMFIT

 PURPOSE:
       Non-linear least squares fit to a function of an arbitrary 
       number of parameters.  The function may be any non-linear 
       function.  If available, partial derivatives can be calculated by 
       the user function, else this routine will estimate partial derivatives
       with a forward difference approximation.

 CATEGORY:
       E2 - Curve and Surface Fitting.

 CALLING SEQUENCE:
       Result = LMFIT(X, Y, A, FITA=FITA, FUNCTION_NAME = name, ITER=ITER,$
                ITMAX=ITMAX, SIGMA=SIGMA, TOL=TOL, YFIT=YFIT, WEIGHTS=WEIGHTS)
                CONVERGENCE=CONVERGENCE

 INPUTS:
   X:  A row vector of independent variables.  This routine does
       not manipulate or use values in X, it simply passes X
       to the user-written function.

   Y:  A row vector containing the dependent variable.

   A:  A vector that contains the initial estimate for each parameter.  

 WEIGHTS: 
   Set this keyword equal to a vector of fitting weights for Y(i). This 
   vector must be the same length as X and Y.  If instrumental (Gaussian)
   weighting is desired, that is the measurement errors or standard deviations 
   of Y are known (SIGMA), then WEIGHTS should be  set to 1/(SIGMA^2.) 
   Or if statistical (Poisson) weighting is appropriate, set WEIGHTS=1/Y.
   If WEIGHTS is not specified then, no weighting is assumed (WEIGHTS=1.0).

 FITA:
   A vector, with as many elements as A, which contains a Zero for
   each fixed parameter, and a non-zero value for elements of A to 
   fit. If not supplied, all parameters are taken to be non-fixed.

 KEYWORDS:
       FUNCTION_NAME:  The name of the function (actually, a procedure) to 
       fit.  If omitted, "LMFUNCT" is used. The procedure must be written as
       described under RESTRICTIONS, below.

       ALPHA:  The value of the Curvature matrix upon exit.
       CHISQ:  The value of chi-squared on exit
       CONVERGENCE: Returns 1 if the fit converges, 0 if it does
               not meet the convergence criteria in ITMAX iterations,
               or -1 if a singular matrix is encountered.
	COVAR:  The value of the Covariance matrix upon exit.
       DOUBLE: Set this keyword to force the computations to be performed 
               in double precision.
       ITMAX:  Maximum number of iterations. Default = 20.
       ITER:   The actual number of iterations which were performed
       SIGMA:  A vector of standard deviations for the returned parameters.
       TOL:    The convergence tolerance. The routine returns when the
               relative decrease in chi-squared is less than TOL in an 
               interation. Default = 1.e-6.
       YFIT:   The fitted function evaluated at the input X values.

 OUTPUTS:
       Returns a vector of calculated parameters, which are improvements
       upon the initial guesses supplied in A.

 SIDE EFFECTS:
       None.

 RESTRICTIONS:
       The function to be fit must be defined and called LMFUNCT,
       unless the FUNCTION_NAME keyword is supplied.  This function,
       must accept a single value of X (the independent variable), and A 
       (the fitted function's  parameter values), and return  an 
       array whose first (zeroth) element is the evalutated function
       value, and next n_elements(A) elements are the partial derivatives
       with respect to each parameter in A.

       If X is passed in as a double, the returned vector MUST be of
       type double as well. Likewise, if X is a float, the returned
       vector must also be of type float.

       For example, here is the default LMFUNCT in the IDL User's Libaray.
       which is called as : out_array = LMFUNCT( X, A )


	function lmfunct,x,a

         ;Return a vector appropriate for LMFIT
         ;
         ;The function being fit is of the following form:
         ;  F(x) = A(0) * exp( A(1) * X) + A(2) = bx+A(2)
         ;
         ;dF/dA(0) is dF(x)/dA(0) = exp(A(1)*X)
         ;dF/dA(1) is dF(x)/dA(1) = A(0)*X*exp(A(1)*X) = bx * X
         ;dF/dA(2) is dF(x)/dA(2) = 1.0
         ;
         ;return,[[F(x)],[dF/dA(0)],[dF/dA(1)],[dF/dA(2)]]
         ;
         ;Note: returning the required function in this manner
         ;    ensures that if X is double the returned vector
         ;    is also of type double. Other methods, such as
         ;    evaluating size(x) are also valid.

        bx=A(0)*exp(A(1)*X)
        return,[ [bx+A(2)], [exp(A(1)*X)], [bx*X], [1.0] ]
	end
        

 PROCEDURE:
       Based upon "MRQMIN", least squares fit to a non-linear
       function, pages 683-688, Numerical Recipies in C, 2nd Edition,
	Press, Teukolsky, Vettering, and Flannery, 1992.

       "This method is the Gradient-expansion algorithm which
       combines the best features of the gradient search with
       the method of linearizing the fitting function."

       Iterations are performed until three consequtive iterations fail
       to chang the chi square changes by greater than TOL, or until
       ITMAX, but at least ITMIN,  iterations have been  performed.

       The initial guess of the parameter values should be
       as close to the actual values as possible or the solution
       may not converge.

       The function may fail to converge, or it can encounter
       a singular matrix. If this happens, the routine will fail
       with the Numerical Recipes error message:
      

 EXAMPLE:  
        Fit a function of the form:
            f(x)=a(0) * exp(a(1)*x) + a(2) + a(3) * sin(x)

  Define a lmfit return function:

  function myfunct,x,a

       ;Return a vector appropriate for LMFIT

       ;The function being fit is of the following form:
       ;  F(x) = A(0) * exp( A(1) * X) + A(2) + A(3) * sin(x)


       ; dF(x)/dA(0) = exp(A(1)*X)
       ; dF(x)/dA(1) = A(0)*X*exp(A(1)*X) = bx * X
       ; dF(x)/dA(2) = 1.0
       ; dF(x)/dA(3) = sin(x)

        bx=A(0)*exp(A(1)*X)
        return,[[bx+A(2)+A(3)*sin(x)],[exp(A(1)*X)],[bx*X],[1.0],[sin(x)]]
     end

   pro run_lmfunct
         x=findgen(40)/20.		;Define indep & dep variables.
         y=8.8 * exp( -9.9 * X) + 11.11 + 4.9 * sin(x)
         sig=0.05 * y
         a=[10.0,-7.0,9.0,4.0]		;Initial guess
         fita=[1,1,1,1]
         ploterr,x,y,sig
         yfit=lmfit(x,y,a,WEIGHTS=(1/sig^2.),FITA=FITA,$
                  SIGMA=SIGMA,FUNCTION_NAME='myfunct')
         oplot,x,yfit
         for i=0,3 do print,i,a(i),format='("A (",i1,")= ",F6.2)'
  end

 MODIFICATION HISTORY:
       Written, SVP, RSI, June 1996.
           

(See /usr/local/rsi/idl_5/lib/lmfit.pro)


POLYFITW

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
	POLYFITW

 PURPOSE:
	Perform a least-square polynomial fit with optional error estimates.

 CATEGORY:
	Curve fitting.

 CALLING SEQUENCE:
	Result = POLYFITW(X, Y, W, NDegree [, Yfit, Yband, Sigma, A])

 INPUTS:
	    X:	The independent variable vector.

	    Y:	The dependent variable vector.  This vector should be the same 
		length as X.

	    W:	The vector of weights.  This vector should be same length as 
		X and Y.

     NDegree:	The degree of polynomial to fit.

 OUTPUTS:
	POLYFITW returns a vector of coefficients of length NDegree+1.

 OPTIONAL OUTPUT PARAMETERS:
	 Yfit:	The vector of calculated Y's.  Has an error of + or - Yband.

	Yband:	Error estimate for each point = 1 sigma.

	Sigma:	The standard deviation in Y units.

	    A:	Correlation matrix of the coefficients.

 COMMON BLOCKS:
	None.

 SIDE EFFECTS:
	None.

 MODIFICATION HISTORY:
	Written by: 	George Lawrence, LASP, University of Colorado,
			December, 1981.

	Adapted to VAX IDL by: David Stern, Jan, 1982.

	Weights added, April, 1987,  G. Lawrence

(See /usr/local/rsi/idl_5/lib/polyfitw.pro)


POLY_FIT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
	POLY_FIT

 PURPOSE:
	Perform a least-square polynomial fit with optional error estimates.

	This routine uses matrix inversion.  A newer version of this routine,
	SVDFIT, uses Singular Value Decomposition.  The SVD technique is more
	flexible, but slower.

	Another version of this routine, POLYFITW, performs a weighted
	least square fit.

 CATEGORY:
	Curve fitting.

 CALLING SEQUENCE:
	Result = POLY_FIT(X, Y, NDegree [,Yfit, Yband, Sigma, CORRM] )

 INPUTS:
	X:	The independent variable vector.

	Y:	The dependent variable vector, should be same length as x.

     NDegree:	The degree of the polynomial to fit.

 OUTPUTS:
	POLY_FIT returns a vector of coefficients with a length of NDegree+1.

 OPTIONAL OUTPUT PARAMETERS:
	Yfit:	The vector of calculated Y's.  These values have an error 
		of + or - Yband.

	Yband:	Error estimate for each point = 1 sigma

	Sigma:	The standard deviations of the returned coefficients.

	Corrm:	Correlation matrix of the coefficients.

 Keyword Parameters:
	DOUBLE = if set, force computations to be in double precision.
 COMMON BLOCKS:
	None.

 SIDE EFFECTS:
	None.

 MODIFICATION HISTORY:
	Written by: George Lawrence, LASP, University of Colorado,
		December, 1981.

	Adapted to VAX IDL by: David Stern, Jan, 1982.
       Modified:    GGS, RSI, March 1996
                    Corrected a condition which explicitly converted all
                    internal variables to single-precision float.
                    Added support for double-precision inputs.
                    Added a check for singular array inversion.
		     SVP, RSI, June 1996
                     Changed A to Corrm to match IDL5.0 docs.

(See /usr/local/rsi/idl_5/lib/poly_fit.pro)


REGRESS

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
	REGRESS

 PURPOSE:
	Perform a multiple linear regression fit.

	REGRESS fits the function:
		Y[i] = Const + A[0]*X[0,i] + A[1]*X[1,i] + ... + 
                      A[Nterms-1]*X[Nterms-1,i]

 CATEGORY:
       G2 - Correlation and regression analysis.

 CALLING SEQUENCE:
	Result = REGRESS(X, Y, Weights, Yfit, Const, Sigma, Ftest, R, Rmul, Chisq)

 INPUTS:
       X:	The array of independent variable data.  X must 
		be dimensioned as an array of Nterms by Npoints, where 
		there are Nterms coefficients (independent variables) to be 
		found and Npoints of samples.

       Y:	The vector of dependent variable points.  Y must have Npoints 
		elements.

 Weights:	The vector of weights for each equation.  Weights must be a vector
		of Npoints elements.  For instrumental (Gaussian) weighting, 
		W[i] = 1/standard_deviation(Y[i])^2.  For statistical  (Poisson)
		weighting, w[i] = 1./Y[i].  For no weighting, set w[i]=1,
		and also set the RELATIVE_WEIGHT keyword.

 OUTPUTS:
	REGRESS returns a column vector of coefficients that has Nterms 
	elements.

 OPTIONAL OUTPUT PARAMETERS:
	Yfit:	Vector of calculated values of Y with Npoints elements.

      Const:	Constant term. (A0)

	Sigma:	Vector of standard deviations for coefficients.

	Ftest:	The value of F for test of fit.

	Rmul:	The multiple linear correlation coefficient.

	R:	Vector of linear correlation coefficients.

	Rmul:   The multiple linear correlation coefficient.

	Chisq:	Reduced, weighted chi squared.

       Status:  A named variable to receive the status of the INVERT 
                (array inversion) computation. A value of 0 indicates 
                a successful computation. A value of 1 indicates the 
                inversion is invalid due to a singular array. A value 
                of 2 indicates the possibility of an inaccurate result 
                due to the use of a small pivot element.

 KEYWORDS:
 RELATIVE_WEIGHT:  If this keyword is set, the input weights
		(W vector) are assumed to be relative values, and not based
		on known uncertainties in the Y vector.  Set this keyword in 
		the case of no weighting, W[*] = 1.

 PROCEDURE:
	Adapted from the program REGRES, Page 172, 
	Bevington, Data Reduction and Error Analysis for the 
	Physical Sciences, 1969.

 MODIFICATION HISTORY:
	Written, DMS, RSI, September, 1982.
	Added RELATIVE_WEIGHT keyword    W. Landsman   August 1991
       Fixed bug in invert  Bobby Candey 1991 April 22
       Added STATUS argument.  GGS, RSI, August 1996

(See /usr/local/rsi/idl_5/lib/regress.pro)


SVDFIT

[Previous Routine] [List of Routines]
 NAME:
	SVDFIT

 PURPOSE:
	Perform a general least squares fit with optional error estimates.

	This version uses the Numerical Recipies (2nd Edition) function
	SVDFIT.  A user-supplied function or a built-in	polynomial or
	legendre polynomial is fit to the data.

 CATEGORY:
	Curve fitting.

 CALLING SEQUENCE:
	Result = SVDFIT(X, Y, [M])

 INPUTS:
	X:	A vector representing the independent variable.

	Y:	Dependent variable vector.  This vector must be same length 
		as X.

 OPTIONAL INPUTS:

	M:	The number of coefficients in the fitting function.  For 
		polynomials, M is equal to the degree of the polynomial + 1.
               If not specified and the keyword A is set, THEN
		M = N_ELEMENTS(A).

 INPUT KEYWORDS:

	    A:  The inital estimates of the desired coefficients. If M
               is specified, THEN A must be a vector of M elements. 
               If A is specified, THEN the input M can be omitted and
               M=N_ELEMENTS(A). If not specified, the initial value
               of each coefficient is taken to be 1.0. If both M and A are
               specified, them must agree as to the number of paramaters.

	DOUBLE:	Set this keyword to force double precision computations. This
               is helpful in reducing roundoff errors and improves the chances
               of function convergence.

    WEIGHTS:	A vector of weights for Y[i].  This vector must be the same
		length as X and Y.  If this parameter is ommitted, 1's
		(No weighting) are assumed.  The error for each term is
		weighted by Weight[i] when computing the fit.  Gaussian or
		instrumental uncertianties should be weighted as
		Weight = 1/Sigma where Sigma is the measurement 
               error or standard deviations of Y. For Poisson or statistical 
               weighting use Weight=1/Y, since Sigma=sqrt(Y).

 FUNCTION_NAME:
		A string that contains the name of an optional user-supplied 
		basis function with M coefficients. If omitted, polynomials
		are used.

		The function is called: R=SVDFUNCT(X,M)

		where X and M are  scalar values, and the function value is an 
		M element vector evaluated at X with the M basis functions.  
               M is the degree of the polynomial +1 if the basis functions are
               polynomials.  For example, see the function SVDFUNCT or SVDLEG,
               in the IDL User Library:

		For more examples, see Numerical Recipes in C, second Edition,
               page 676-681.

		The basis function for polynomials, is R[j] = x)^j.

	        The function must be able to return R as a FLOAT vector or
               a DOUBLE vector depending on the input type of X.
		
     LEGENDRE: Set this keyword to use the IDL function SVDLEG in the lib
               directory to fit the data to an M element legendre polynomial.
               This keyword overrides the FUNCTION_NAME keyword.

 OUTPUTS:
	SVDFIT returns a vector of the M coefficients fitted to the
	supplied function.

 OPTIONAL OUTPUT PARAMETERS:

	CHISQ:	Sum of squared errors multiplied by weights if weights
		are specified.

	COVAR:	Covariance matrix of the coefficients.

    VARIANCE:	Sigma squared in estimate of each coeff(M).
               That is sqrt(VARIANCE) equals the 1 sigma deviations
               of the returned coefficients.

      SIGMA:   The 1-sigma error estimates of the returned parameters,
               SIGMA=SQRT(VARIANCE).

    SINGULAR:	The number of singular values returned.  This value should
		be 0.  If not, the basis functions do not accurately
		characterize the data.

	YFIT:	Vector of calculated Y's.

 COMMON BLOCKS:
	None.

 SIDE EFFECTS:
	None.

 MODIFICATION HISTORY:
	Adapted from SVDFIT, from the book Numerical Recipes, Press,
	et. al., Page 518.
	minor error corrected April, 1992 (J.Murthy)

	Completely rewritten to use the actual Numerical Recipes routines
	of the 2nd Edition (V.2.06). Added the DOUBLE, SIGMA, A, and
	LEGENDRE keywords. Also changed Weight to Weights to match the
	other fitting routines.

       EXAMPLE:

(See /usr/local/rsi/idl_5/lib/svdfit.pro)