C CENSUS DATA ANALYSIS WITH THE SVD C FROM SECTION 8.1 C From the book "Numerical Methods and Software" C by D. Kahaner, C. Moler, S. Nash C Prentice Hall 1988 INTEGER LDX,N,P,LDU,LDV,JOB,INFO,I,J,JB PARAMETER(LDX=8,N=8,P=3,LDU=N,LDV=P,JOB=11) REAL POP(N),Y(N),X(LDX,P),S(P),E(P),U(LDU,LDU),V(LDV,P),W(N) REAL C(P),YEAR,POP80,TOL,RELERR,SUM,R,RSQ,RI C C C CONTAINS COEFFICIENTS OF POLYNOMIAL C(1)*1+C(2)*T+C(3)*T*T C T=YEAR (1900 ETC.) C DATA POP/ * 75.994575, * 91.972266, * 105.710620, * 122.775046, * 131.669275, * 150.697361, * 179.323175, * 203.235298/ C DO 1 I=1,8 C Y(I)=(1935.0-1900*(I-1.))/1935.0 Y(I)=1900.0+(I-1)*10 X(I,1)=1.0 X(I,2)=Y(I) X(I,3)=Y(I)**2 1 CONTINUE C CALL SSVDC(X,LDX,N,P,S,E,U,LDU,V,LDV,W,JOB,INFO) C NOTE: X IS DESTROYED BY ABOVE CALL!!! C C WRITE SINGULAR VALUES (DESCENDING ORDER) WRITE(*,*) 'SINGULAR VALUES ARE: ' WRITE(*,*) (S(I),I=1,P) DO 2 I=1,P C(I)=0.0 2 CONTINUE C C RELERR REFLECTS NUMBER OF ACCURATE DIGITS IN DATA C E.G. 6 DIGITS ==> RELERR=1.E-6, ETC. C MAKING RELERR LARGER INCREASES RESIDUALS RELERR=1.E-6 TOL=RELERR*S(1) C C MULTIPLY U-TRANS * POP, AND SOLVE FOR COEFFICIENTS C(I) C DO 60 J=1,P IF(S(J).LE.TOL)GO TO 60 SUM=0.0 DO 40 I=1,N SUM=SUM+U(I,J)*POP(I) 40 CONTINUE SUM=SUM/S(J) DO 50 I=1,P C(I)=C(I)+SUM*V(I,J) 50 CONTINUE 60 CONTINUE C WRITE(*,*) 'COEFFICIENTS (ASSUMING DATA GOOD TO 6 DIGITS) ARE:' WRITE(*,*) (C(I),I=1,P) C C EVALUATE MODEL (HORNER'S RULE) AND RESIDUALS AT YEAR =1900,...,1980 C RSQ=0.0 DO 75 I=1,9 YEAR=1900.0+(I-1)*10.0 POP80=0.0 DO 70 JB=1,P J=P+1-JB POP80=YEAR*POP80+C(J) 70 CONTINUE IF(I.LT.9) THEN RI=POP(I)-POP80 RSQ=RSQ+RI*RI WRITE(*,'(A,I6,A,3F10.2)') * ' FOR YEAR',IFIX(YEAR),' POP ESTM, MEAS, AND RESIDUAL ARE ' * ,POP80,POP(I),RI ELSE WRITE(*,'(A,I6,A,F10.3)') * ' FOR YEAR',IFIX(YEAR),' POP ESTMATE IS ',POP80 ENDIF 75 CONTINUE C R=SQRT(RSQ) WRITE(*,*)'SQUARE ROOT OF RESIDUAL SUM OF SQUARES IS: ',R C END