Viewing contents of file '../idllib/astron/contrib/freudenreich/quarticfit.pro'
FUNCTION QUARTICFIT,X,Y,Z, W, YFIT
;
;+
; NAME:
;      QUARTICFIT
;
; PURPOSE:
;      Fit a general quadratic surface: Z=a+bX+cX^2+dXY+eY+fY^2
;
; CALLING SEQUENCE:
;      coefficients = QUARTICFIT( X,Y,Z,W, YFIT )
; INPUT:
;      X = independent variable vector, may be in double precision
;      Y = independent variable vector, may be in double precision
;      Z = dependent variable vector, may be in double precision
;      W = weights (IF EQUAL, SET W=0.)
;
; RETURNS:
;      The coefficients of the fit, in the order given above.
;
; OPTIONAL OUTPUT:
;      YFIT = the calculated fit at points (X,Y)
;
; SIDE-EFFECTS:
;      Sometimes nausea and dizziness, if taken in large doses.
;
; AUTHOR:
;      H.T. Freudenreich, HSTX, 5/19/93
;-

N=N_ELEMENTS(Z)
X2=X*X  & Y2=Y*Y  & XY=X*Y

; Accumulate sums:

IF N_ELEMENTS(W) LT 7 THEN BEGIN
;  No weights!
   S=N*1.             & SX=TOTAL(X)        & SY=TOTAL(Y)        & SZ=TOTAL(Z)
   SXY=TOTAL(XY)      & SXZ=TOTAL(X*Z)     & SYZ=TOTAL(Y*Z)
   SX2=TOTAL(X2)      & SY2=TOTAL(Y2) 
   SX3=TOTAL(X2*X)    & SY3=TOTAL(Y2*Y)
   SX4=TOTAL(X2^2)    & SY4=TOTAL(Y2^2)
   SX2Y=TOTAL(X2*Y)   & SY2X=TOTAL(Y2*X)
   SX3Y=TOTAL(X2*XY)  & SY3X=TOTAL(Y2*XY)  & SX2Y2=TOTAL(X2*Y2)
   SZ=TOTAL(Z)        & SXZ=TOTAL(X*Z)     & SX2Z=TOTAL(X2*Z)   & SYZ=TOTAL(Y*Z)
   SXYZ=TOTAL(XY*Z)   & SY2Z=TOTAL(Y2*Z)
ENDIF ELSE BEGIN
;  Weights included!
   S=TOTAL(W)           & SX=TOTAL(W*X)      & SY=TOTAL(W*Y)     & SZ=TOTAL(W*Z)
   SXY=TOTAL(W*XY)      & SXZ=TOTAL(W*X*Z)   & SYZ=TOTAL(W*Y*Z)
   SX2=TOTAL(W*X2)      & SY2=TOTAL(W*Y2) 
   SX3=TOTAL(W*X2*X)    & SY3=TOTAL(W*Y2*Y)
   SX4=TOTAL(W*X2^2)    & SY4=TOTAL(W*Y2^2)
   SX2Y=TOTAL(W*X2*Y)   & SY2X=TOTAL(W*Y2*X)
   SX3Y=TOTAL(W*X2*XY)  & SY3X=TOTAL(W*Y2*XY) & SX2Y2=TOTAL(W*X2*Y2)
   SXYZ=TOTAL(W*XY*Z)   & SY2Z=TOTAL(W*Y2*Z)
   SZ =TOTAL(W*Z)       & SXZ=TOTAL(W*X*Z)    & SX2Z=TOTAL(W*X2*Z) 
   SYZ=TOTAL(W*Y*Z)
ENDELSE

M=[ [S,  SX,  SX2,  SXY,  SY,  SY2], $
    [SX, SX2, SX3,  SX2Y, SXY, SY2X], $
    [SX2,SX3, SX4,  SX3Y, SX2Y,SX2Y2],$
    [SXY,SX2Y,SX3Y, SX2Y2,SY2X,SY3X],$
    [SY, SXY, SX2Y, SY2X, SY2, SY3],$
    [SY2,SY2X,SX2Y2,SY3X, SY3, SY4]  ]

IM=INVERT(M,STATUS)
IF STATUS NE 0 THEN BEGIN
   PRINT,'QUARTICFIT: Unable to INVERT matrix'
   R=0.
   RETURN,R
ENDIF

U=[SZ,SXZ,SX2Z,SXYZ,SYZ,SY2Z]

R=IM#U

IF N_PARAMS(0) GT 4 THEN YFIT=R(0)+R(1)*X+R(2)*X2+R(3)*XY+R(4)*Y+R(5)*Y2

RETURN,R
END