C*********************************************************************** C * C SECANT METHOD * C * C*********************************************************************** C C C C TO FIND A SOLUTION TO THE EQUATION F(X)=0 C GIVEN INITIAL APPROXIMATIONS PO AND P1: C C INPUT: INITIAL APPROXIMATION P0,P1; TOLERANCE TOL; C MAXIMUM NUMBER OF ITERATIONS N0. C C OUTPUT: APPROXIMATE SOLUTION P OR MESSAGE THAT THE C ALGORITHM FAILS. C REAL P0,F0,P1,F1,P,FP,TOL INTEGER I,N0,FLAG,INP,OUP CHARACTER NAME*14,NAME1*14,AA*1 LOGICAL OK C DEFINE FUNCTION F F(X)=COS(X)-X c OPEN(UNIT=5,FILE='CON',ACCESS='SEQUENTIAL') c OPEN(UNIT=6,FILE='CON',ACCESS='SEQUENTIAL') WRITE(6,*) 'This is the Secant Method.' WRITE(6,*) 'Has the function F been created in the program? ' WRITE(6,*) 'Enter Y or N ' WRITE(6,*) ' ' READ(5,*) AA IF(( AA .EQ. 'Y' ) .OR. ( AA .EQ. 'y' )) THEN OK = .FALSE. 10 IF (OK) GOTO 11 WRITE(6,*) 'Input initial approximations P0 and P1' WRITE(6,*) 'separated by blank ' WRITE(6,*) ' ' READ(5,*) P0,P1 IF (P0.EQ.P1) THEN WRITE(6,*) 'P0 cannot equal P1 ' ELSE OK = .TRUE. ENDIF GOTO 10 11 OK = .FALSE. 12 IF (OK) GOTO 13 WRITE(6,*) 'Input tolerance ' WRITE(6,*) ' ' READ(5,*) TOL IF (TOL.LE.0.0) THEN WRITE(6,*) 'Tolerance must be positive ' WRITE(6,*) ' ' ELSE OK = .TRUE. ENDIF GOTO 12 13 OK = .FALSE. 14 IF (OK) GOTO 15 WRITE(6,*) 'Input maximum number of iterations ' WRITE(6,*) '- no decimal point ' WRITE(6,*) ' ' READ(5,*) N0 IF ( N0 .LE. 0 ) THEN WRITE(6,*) 'Must be positive integer ' WRITE(6,*) ' ' ELSE OK = .TRUE. ENDIF GOTO 14 15 CONTINUE ELSE WRITE(6,*) 'The program will end so that the function F ' WRITE(6,*) 'can be created ' OK = .FALSE. ENDIF IF (.NOT.OK) GOTO 040 WRITE(6,*) 'Select output destinations: ' WRITE(6,*) '1. Screen ' WRITE(6,*) '2. Text file ' WRITE(6,*) 'Enter 1 or 2 ' WRITE(6,*) ' ' READ(5,*) FLAG IF ( FLAG .EQ. 2 ) THEN WRITE(6,*) 'Input the file name in the form - ' WRITE(6,*) 'drive:name.ext' WRITE(6,*) 'with the name contained within quotes' WRITE(6,*) 'as example: ''A:OUTPUT.DTA'' ' WRITE(6,*) ' ' READ(5,*) NAME1 OUP = 3 OPEN(UNIT=OUP,FILE=NAME1,STATUS='NEW') ELSE OUP = 6 ENDIF WRITE(6,*) 'Select amount of output ' WRITE(6,*) '1. Answer only ' WRITE(6,*) '2. All intermediate approximations ' WRITE(6,*) 'Enter 1 or 2 ' WRITE(6,*) ' ' READ(5,*) FLAG WRITE(OUP,*) 'BISECTION METHOD' IF (FLAG.EQ.2) THEN WRITE(OUP,4) 4 FORMAT(3X,'I',14X,'P',13X,'F(P)') ENDIF C STEP 1 I=2 Q0=F(P0) Q1=F(P1) C STEP 2 016 IF ( I .GT. N0 ) GOTO 020 C STEP 3 C COMPUTE P(I) P=P1-Q1*(P1-P0)/(Q1-Q0) FP=F(P) IF (FLAG.EQ.2) THEN WRITE(OUP,5) I,P,FP 5 FORMAT(1X,I3,2X,E15.8,2X,E15.8) ENDIF C STEP 4 IF( ABS(P-P1) .LT. TOL ) THEN WRITE(OUP,2) P,I,TOL GOTO 040 END IF C STEP 5 I=I+1 C STEP 6 C UPDATE P0, Q0, P1, Q1 P0=P1 Q0=Q1 P1=P Q1=FP GOTO 016 020 CONTINUE C STEP 7 C PROCEDURE COMPLETED UNSUCCESSFULLY WRITE(OUP,3) N0 IF(OUP.NE.6) WRITE(6,3) N0 040 CLOSE(UNIT=5) CLOSE(UNIT=OUP) IF(OUP.NE.6) CLOSE(UNIT=6) STOP 1 FORMAT(3(E15.8,1X),I2) 2 FORMAT(1X,'THE APPROXIMATE SOLUTION IS',1X,E15.8,1X, *'AFTER',1X,I2,1X,'ITERATIONS',/,' WITH TOLERANCE',1X,E15.8) 3 FORMAT(1X,'THE METHOD FAILS AFTER',1X,I2,1X,'ITERATIONS') END