SUBROUTINE POLYFT(X,Y,SIG,N,ORDER,A,YFIT,ISTAT) * * Module number: HRS/FOS utility * * Module name: polyft * * Keyphrase: * ---------- * least squares polynomial fit * * Description: * ------------ * This routine does a least squares polynomial fit * to input data y versus x. The Numerical recipe * routine LFIT is used to minimize chi squared. * * FORTRAN name: polyft.for * * Keywords of accessed files and tables: * -------------------------------------- * none * * Subroutines Called: * ------------------- * SDAS: * umsput * Others: * LFIT * * History: * -------- * Version Date Author Description * 1 Oct. 87 D. Lindler Designed and coded *------------------------------------------------------------------------------- C C INPUT PARAMETERS C C X - X VECTOR (REAL*8) C Y - Y VECTOR (REAL*8) C SIG - STANDARD DEVIATION VECTOR FOR Y (REAL*8) C N - NUMBER OF POINTS IN X AND Y C ORDER - ORDER OF THE POLYNOMIAL (INTEGER) C C OUTPUT PARAMETERS C C A - FITTED POLYNOMIAL COEFFICIENTS (REAL*8) C YFIT - VECTOR OF FITTED VALUES (REAL*8) C ISTAT - ERROR STATUS (INTEGER) C------------------------------------------------------------------------------ C INCLUDE FILE FOR THE IRAF77 FORTRAN INTERFACE TO THE IRAF VOS C C C FILE I/O ACCESS MODES C INTEGER RDONLY PARAMETER (RDONLY = 1) INTEGER RDWRIT PARAMETER (RDWRIT = 2) INTEGER WRONLY PARAMETER (WRONLY = 3) INTEGER APPEND PARAMETER (APPEND = 4) C C CODES FOR DATA TYPES C INTEGER TYBOOL PARAMETER (TYBOOL = 1) INTEGER TYCHAR PARAMETER (TYCHAR = 2) INTEGER TYINT PARAMETER (TYINT = 4) INTEGER TYREAL PARAMETER (TYREAL = 6) INTEGER TYDOUB PARAMETER (TYDOUB = 7) C C UMSPUT DESTINATIONS -- CB, DAO, 4-SEP-87 C INTEGER STDOUT PARAMETER (STDOUT = 1) INTEGER STDERR PARAMETER (STDERR = 2) C C UHDAS HEADER PARM TYPES -- CB, DAO, 5-SEP-87 C INTEGER GENHDR PARAMETER (GENHDR = 0) INTEGER IMSPEC PARAMETER (IMSPEC = 1) C C THIS SECTION IS FOR PARAMETERS RELEVANT TO TABLE I/O. C C THESE MAY BE SET BY UTPPTI AND/OR READ BY UTPGTI: C C LENGTH OF ROW (UNIT = SIZE OF REAL) INTEGER TBRLEN PARAMETER (TBRLEN = 1) C INCREASE ROW LENGTH INTEGER TBIRLN PARAMETER (TBIRLN = 2) C NUMBER OF ROWS TO ALLOCATE INTEGER TBALLR PARAMETER (TBALLR = 3) C INCREASE ALLOC NUM OF ROWS INTEGER TBIALR PARAMETER (TBIALR = 4) C WHICH TYPE OF TABLE? (ROW OR COLUMN) INTEGER TBWTYP PARAMETER (TBWTYP = 5) C MAXIMUM NUMBER OF USER PARAMETERS INTEGER TBMXPR PARAMETER (TBMXPR = 6) C MAXIMUM NUMBER OF COLUMNS INTEGER TBMXCL PARAMETER (TBMXCL = 7) C TYPE = ROW-ORDERED TABLE INTEGER TBTYPR PARAMETER (TBTYPR = 11) C TYPE = COLUMN-ORDERED TABLE INTEGER TBTYPC PARAMETER (TBTYPC = 12) C C THESE MAY BE READ BY UTPGTI BUT MAY NOT BE SET: C C NUMBER OF ROWS WRITTEN TO INTEGER TBNROW PARAMETER (TBNROW = 21) C C END IRAF77.INC DOUBLE PRECISION X(1),Y(1),SIG(1),A(1),YFIT(1) INTEGER N,ORDER,ISTAT C C LOCAL VARIABLES C DOUBLE PRECISION COVAR(10,10),CHISQ INTEGER LISTA(10) INTEGER I,J C C DATA DECLARATIONS C EXTERNAL POLY1 DATA LISTA/1,2,3,4,5,6,7,8,9,10/ C C CHECK INPUT PARAMETERS FOR VALIDITY C ISTAT=0 IF (ORDER.GT.(N-1))THEN CALL UMSPUT('Too few points to perform polynomial fit', * STDERR+STDOUT,0,ISTAT) ISTAT=1 GO TO 999 ENDIF IF(ORDER.GT.9)THEN CALL UMSPUT('Maximum order of polynomial is 9', * STDERR+STDOUT,0,ISTAT) ISTAT=1 GO TO 999 ENDIF C C PERFORM FIT C CALL LFIT(X,Y,SIG,N,A,ORDER+1,LISTA,ORDER+1,COVAR, * 10,CHISQ,POLY1,ISTAT) IF(ISTAT.NE.0)THEN CALL UMSPUT('Unable to perform polynomial fit', * STDERR+STDOUT,0,ISTAT) ISTAT=1 GO TO 999 ENDIF C C COMPUTE YFIT C DO 10 I=1,N YFIT(I)=A(1) IF(ORDER.GT.0) THEN DO 5 J=1,ORDER YFIT(I)=YFIT(I)+A(J+1)*X(I)**J 5 CONTINUE ENDIF 10 CONTINUE ISTAT=0 999 RETURN END