C TITLE: FIND A NEAR-MINIMAX APPROXIMATION C C THIS PROGRAM CALCULATES A NEAR-MINIMAX APPROXIMATION C TO A GIVEN FUNCTION 'FCN' ON THE INTERVAL [-1,1]. C THE APPROXIMATION IS BASED ON INTERPOLATION AT THE C CHEBYSHEV ZEROS ON [-1,1]. THE PROGRAM THEN C ESTIMATES THE MAXIMUM ERROR BY CALCULATING THE ERROR C AT A LARGE SAMPLE OF EVENLY SPACED POINTS ON [-1,1]. C THE PROGRAM CAN BE EASILY MODIFIED TO PRINT THE C DIVIDED DIFFERENCES AND THE ERRORS. C PARAMETER (MAXN=20) PARAMETER (ZERO=0.0, ONE=1.0, P02=.02) DIMENSION FX(0:MAXN), X(0:MAXN) C C THE FOLLOWING STATEMENT DEFINES THE FUNCTION TO BE C APPROXIMATED. IT CAN ALSO BE SPECIFIED USING A C FUNCTION SUBPROGRAM. FCN(X) = EXP(X) C C INITIALIZE VARIABLES. PI = 4*ATAN(ONE) PRINT *, ' WHAT IS THE DEGREE N?' PRINT *, ' THE DEGREE SHOULD BE .LE. ', MAXN READ *, N H = PI/(2*(N+1)) C C SET UP INTERPOLATION NODES AND CORRESPONDING C FUNCTION VALUES. DO 10 I=0,N X(I) = COS((2*I+1)*H) FX(I) = FCN(X(I)) 10 CONTINUE C C CALCULATE THE DIVIDED DIFFERENCES FOR THE C INTERPOLATION POLYNOMIAL. CALL DIVDIF(N,X,FX) C C CALCULATE THE MAXIMUM INTERPOLATION ERROR AT 101 C EVENLY SPACED POINTS ON [-1,1]. ERRMAX = ZERO DO 20 I=0,100 Z = -ONE + P02*I C USE NESTED MULTIPLICATION TO EVALUATE THE C INTERPOLATION POLYNOMIAL AT Z. P = FX(N) DO 30 J=N-1,0,-1 30 P = FX(J) + (Z - X(J))*P ERROR = FCN(Z) - P ERRMAX = MAX(ABS(ERROR),ERRMAX) 20 CONTINUE C C PRINT MAXIMUM ERROR. PRINT *, ' FOR N =', N PRINT *, ' MAXIMUM ERROR =', ERRMAX STOP END SUBROUTINE DIVDIF(N,X,F) C ----------------- C C INPUT: (1) 'N' DENOTES A POSITIVE INTEGER. C (2) 'X' DENOTES A VECTOR OF POINTS X(0),...,X(N). C (3) 'F' DENOTES A VECTOR OF VALUES OF SOME FUNCTION C EVALUATED AT THE NODES IN X. C OUTPUT: THE VECTOR F IS CONVERTED TO A VECTOR OF DIVIDED C DIFFERENCES: F(I)=F[X(0),...,X(I)], I=0,...,N C C WARNING: NOTE THE FORM OF THE DIMENSION STATEMENT. C DIMENSION X(0:*), F(0:*) C DO 1 I=1,N DO 1 J=N,I,-1 1 F(J) = (F(J) - F(J-1))/(X(J) - X(J-I)) RETURN END