Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- !DECLARE MODULE TO PASS THE PARAMETER TO THE EXTERNAL FUNCTION
- MODULE FUN_PARAMETER
- REAL T
- END MODULE
- !THE EXTERNAL FUNCTION (THE INTEGRAND)
- REAL FUNCTION FUN(Z)
- USE FUN_PARAMETER
- FUN=1/(EXP(1.0)**(1.9 * Z**2) + T)
- RETURN
- END
- USE FUN_PARAMETER
- EXTERNAL FUN
- INTEGER NOFUN, ER, L
- REAL FUN,A,B,RELERR,ABSERR,RESULT,ERREST,FLAG, F_K, EPS
- REAL POINTS(7), FS(7), C(7), D(7), E(7), SEVALS(6), F_KS(6)
- REAL LPOLYNOMIAL_VALUES(6)
- !CALCULATE THE INTEGRAL
- PI=4.D0*DATAN (1.D0)
- A=0.0
- B=1
- RELERR=1.E-06
- ABSERR=0.0
- T=-0.5
- DO I=1, 7
- T=T+0.5
- FS(I)=T
- CALL QUANC8(FUN,A,B,ABSERR,RELERR,RESULT, ERREST,NOFUN,FLAG)
- POINTS(I)=RESULT
- END DO
- !OBTAIN COEFFICIENTS OF THE SPLINE FUNCTION FOR 0.5<=F<=1.5
- CALL SPLINE(7, FS, POINTS, C, D, E)
- !OBTAIN APPROXIMATE VALUES FOR F=0.55+0.1*K (K=0...9) USING THE SPLINE FUNCTION
- K=0
- DO I=1,6
- F_K=0.25+0.5*K
- F_KS(I)=F_K
- SEVALS(I)=SEVAL(7, F_K, FS, POINTS, C, D, E)
- K=K+1
- END DO
- !OBTAIN APPROXIMATE VALUES FOR F=0.55+0.1*K (K=0...9) USING THE LAGRANGE POLYNOMIAL
- K=0
- DO L=1,6
- F_K=0.25+0.5*K
- F_KS(L)=F_K
- CALL LAGRANGE_POLINOMIAL(F_KS(L), FS, POINTS, Q)
- LPOLYNOMIAL_VALUES(L)=Q
- K=K+1
- END DO
- PRINT *, "F_KS AND CORRESPONDING VALUES OF THE LAGRANGE POLYNOMIAL"
- PRINT 102, (F_KS(I), LPOLYNOMIAL_VALUES(I), I=1,6)
- PRINT *, "F_KS AND CORRESPONDING VALUES OF THE SPLINE FUNCTION"
- PRINT 102, (F_KS(I), SEVALS(I), I=1,6)
- PRINT *, "COEFFICIENTS OF THE SPLINE FUNCTION"
- PRINT 101,(C(I),D(I),E(I),I=1,7)
- PRINT *, "INTEGRAL VALUES:"
- PRINT 101, POINTS
- PRINT *, "F VALUES:"
- PRINT 101, FS
- PRINT 1,RESULT,ERREST,NOFUN,FLAG
- STOP
- 1 FORMAT(10X,'RESULT=',E14.7,3X,'ERREST=',E12.5/11X,'NOFUN=',I8,11X,'FLAG=',F10.3)
- 101 FORMAT(5X,3E16.7)
- 102 FORMAT(5X,2E16.7)
- CONTAINS
- SUBROUTINE LAGRANGE_POLINOMIAL(F_KS, FS, POINTS, Q)
- REAL Q
- REAL WKX(7), WKXK(7), FS(7), POINTS(7), F_KS(7)
- Q=0
- WKX(:)=1
- WKXK(:)=1
- DO I=1, 7
- DO J=1, 7
- IF (I/=J) THEN
- WKX(I)=WKX(I)*(F_K-FS(J))
- WKXK(I)=WKXK(I)*(FS(I)-FS(J))
- END IF
- END DO
- IF (WKXK(I)/=0) THEN
- Q=Q+((WKX(I)/WKXK(I))*POINTS(I))
- END IF
- END DO
- END SUBROUTINE
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement