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