1 SUBROUTINE ROOT
(T
,FT
,B
,C
,RELERR
,ABSERR
,IFLAG
)
3 C ROOT COMPUTES A ROOT OF THE NONLINEAR EQUATION F(X)=0
4 C WHERE F(X) IS A CONTINOUS REAL FUNCTION OF A SINGLE REAL
5 C VARIABLE X. THE METHOD USED IS A COMBINATION OF BISECTION
8 C NORMAL INPUT CONSISTS OF A CONTINUOS FUNCTION F AND AN
9 C INTERVAL (B,C) SUCH THAT F(B)*F(C).LE.0.0. EACH ITERATION
10 C FINDS NEW VALUES OF B AND C SUCH THAT THE INTERVAL(B,C) IS
11 C SHRUNK AND F(B)*F(C).LE.0.0. THE STOPPING CRITERION IS
13 C DABS(B-C).LE.2.0*(RELERR*DABS(B)+ABSERR)
15 C WHERE RELERR=RELATIVE ERROR AND ABSERR=ABSOLUTE ERROR ARE
16 C INPUT QUANTITIES. SET THE FLAG, IFLAG, POSITIVE TO INITIALIZE
17 C THE COMPUTATION. AS B,C AND IFLAG ARE USED FOR BOTH INPUT AND
18 C OUTPUT, THEY MUST BE VARIABLES IN THE CALLING PROGRAM.
20 C IF 0 IS A POSSIBLE ROOT, ONE SHOULD NOT CHOOSE ABSERR=0.0.
22 C THE OUTPUT VALUE OF B IS THE BETTER APPROXIMATION TO A ROOT
23 C AS B AND C ARE ALWAYS REDEFINED SO THAT DABS(F(B)).LE.DABS(F(C)).
25 C TO SOLVE THE EQUATION, ROOT MUST EVALUATE F(X) REPEATEDLY. THIS
26 C IS DONE IN THE CALLING PROGRAM. WHEN AN EVALUATION OF F IS
27 C NEEDED AT T, ROOT RETURNS WITH IFLAG NEGATIVE. EVALUATE FT=F(T)
28 C AND CALL ROOT AGAIN. DO NOT ALTER IFLAG.
30 C WHEN THE COMPUTATION IS COMPLETE, ROOT RETURNS TO THE CALLING
31 C PROGRAM WITH IFLAG POSITIVE=
33 C IFLAG=1 IF F(B)*F(C).LT.0 AND THE STOPPING CRITERION IS MET.
35 C =2 IF A VALUE B IS FOUND SUCH THAT THE COMPUTED VALUE
36 C F(B) IS EXACTLY ZERO. THE INTERVAL (B,C) MAY NOT
37 C SATISFY THE STOPPING CRITERION.
39 C =3 IF DABS(F(B)) EXCEEDS THE INPUT VALUES DABS(F(B)),
40 C DABS(F(C)). IN THIS CASE IT IS LIKELY THAT B IS CLOSE
43 C =4 IF NO ODD ORDER ROOT WAS FOUND IN THE INTERVAL. A
44 C LOCAL MINIMUM MAY HAVE BEEN OBTAINED.
46 C =5 IF TOO MANY FUNCTION EVALUATIONS WERE MADE.
47 C (AS PROGRAMMED, 500 ARE ALLOWED.)
49 C THIS CODE IS A MODIFICATION OF THE CODE ZEROIN WHICH IS COMPLETELY
50 C EXPLAINED AND DOCUMENTED IN THE TEXT NUMERICAL COMPUTING: AN
51 C INTRODUCTION, BY L. F. SHAMPINE AND R. C. ALLEN.
55 DOUBLE PRECISION A
,ABSERR
,ACBS
,ACMB
,AE
,B
,C
,CMB
,D1MACH
,FA
,FB
,
56 1 FC
,FT
,FX
,P
,Q
,RE
,RELERR
,T
,TOL
,U
57 INTEGER IC
,IFLAG
,KOUNT
60 IF(IFLAG
.GE
.0) GO TO 100
62 GO TO (200,300,400), IFLAG
79 FX
=MAX
(ABS
(FB
),ABS
(FC
))
80 1 IF(ABS
(FC
).GE
.ABS
(FB
))GO TO 2
82 C INTERCHANGE B AND C SO THAT ABS(F(B)).LE.ABS(F(C)).
94 C TEST STOPPING CRITERION AND FUNCTION COUNT.
96 IF(ACMB
.LE
.TOL
)GO TO 8
97 IF(KOUNT
.GE
.500)GO TO 12
99 C CALCULATE NEW ITERATE EXPLICITLY AS B+P/Q
100 C WHERE WE ARRANGE P.GE.0. THE IMPLICIT
101 C FORM IS USED TO PREVENT OVERFLOW.
109 C UPDATE A, CHECK IF REDUCTION IN THE SIZE OF BRACKETING
110 C INTERVAL IS SATISFACTORY. IF NOT BISECT UNTIL IT IS.
116 IF(8.0*ACMB
.GE
.ACBS
)GO TO 6
120 C TEST FOR TOO SMALL A CHANGE.
122 4 IF(P
.GT
.ABS
(Q
)*TOL
)GO TO 5
124 C INCREMENT BY TOLERANCE
129 C ROOT OUGHT TO BE BETWEEN B AND (C+B)/2
131 5 IF(P
.GE
.CMB*Q
)GO TO 6
142 C HAVE COMPLETED COMPUTATION FOR NEW ITERATE B.
150 IF(SIGN
(1.0D0
,FB
).NE
.SIGN
(1.0D0
,FC
))GO TO 1
155 C FINISHED. SET IFLAG.
157 8 IF(SIGN
(1.0D0
,FB
).EQ
.SIGN
(1.0D0
,FC
))GO TO 11
158 IF(ABS
(FB
).GT
.FX
)GO TO 10