GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
dqelg.f
Go to the documentation of this file.
1 SUBROUTINE dqelg(N,EPSTAB,RESULT,ABSERR,RES3LA,NRES)
2C***BEGIN PROLOGUE DQELG
3C***REFER TO DQAGIE,DQAGOE,DQAGPE,DQAGSE
4C***ROUTINES CALLED D1MACH
5C***REVISION DATE 830518 (YYMMDD)
6C***KEYWORDS EPSILON ALGORITHM, CONVERGENCE ACCELERATION,
7C EXTRAPOLATION
8C***AUTHOR PIESSENS,ROBERT,APPL. MATH. & PROGR. DIV. - K.U.LEUVEN
9C DE DONCKER,ELISE,APPL. MATH & PROGR. DIV. - K.U.LEUVEN
10C***PURPOSE THE ROUTINE DETERMINES THE LIMIT OF A GIVEN SEQUENCE OF
11C APPROXIMATIONS, BY MEANS OF THE EPSILON ALGORITHM OF
12C P.WYNN. AN ESTIMATE OF THE ABSOLUTE ERROR IS ALSO GIVEN.
13C THE CONDENSED EPSILON TABLE IS COMPUTED. ONLY THOSE
14C ELEMENTS NEEDED FOR THE COMPUTATION OF THE NEXT DIAGONAL
15C ARE PRESERVED.
16C***DESCRIPTION
17C
18C EPSILON ALGORITHM
19C STANDARD FORTRAN SUBROUTINE
20C DOUBLE PRECISION VERSION
21C
22C PARAMETERS
23C N - INTEGER
24C EPSTAB(N) CONTAINS THE NEW ELEMENT IN THE
25C FIRST COLUMN OF THE EPSILON TABLE.
26C
27C EPSTAB - DOUBLE PRECISION
28C VECTOR OF DIMENSION 52 CONTAINING THE ELEMENTS
29C OF THE TWO LOWER DIAGONALS OF THE TRIANGULAR
30C EPSILON TABLE. THE ELEMENTS ARE NUMBERED
31C STARTING AT THE RIGHT-HAND CORNER OF THE
32C TRIANGLE.
33C
34C RESULT - DOUBLE PRECISION
35C RESULTING APPROXIMATION TO THE INTEGRAL
36C
37C ABSERR - DOUBLE PRECISION
38C ESTIMATE OF THE ABSOLUTE ERROR COMPUTED FROM
39C RESULT AND THE 3 PREVIOUS RESULTS
40C
41C RES3LA - DOUBLE PRECISION
42C VECTOR OF DIMENSION 3 CONTAINING THE LAST 3
43C RESULTS
44C
45C NRES - INTEGER
46C NUMBER OF CALLS TO THE ROUTINE
47C (SHOULD BE ZERO AT FIRST CALL)
48C
49C***END PROLOGUE DQELG
50C
51 DOUBLE PRECISION ABSERR,DABS,DELTA1,DELTA2,DELTA3,DMAX1,D1MACH,
52 * EPMACH,EPSINF,EPSTAB,ERROR,ERR1,ERR2,ERR3,E0,E1,E1ABS,E2,E3,
53 * OFLOW,RES,RESULT,RES3LA,SS,TOL1,TOL2,TOL3
54 INTEGER I,IB,IB2,IE,INDX,K1,K2,K3,LIMEXP,N,NEWELM,NRES,NUM
55 dimension epstab(52),res3la(3)
56C
57C LIST OF MAJOR VARIABLES
58C -----------------------
59C
60C E0 - THE 4 ELEMENTS ON WHICH THE COMPUTATION OF A NEW
61C E1 ELEMENT IN THE EPSILON TABLE IS BASED
62C E2
63C E3 E0
64C E3 E1 NEW
65C E2
66C NEWELM - NUMBER OF ELEMENTS TO BE COMPUTED IN THE NEW
67C DIAGONAL
68C ERROR - ERROR = ABS(E1-E0)+ABS(E2-E1)+ABS(NEW-E2)
69C RESULT - THE ELEMENT IN THE NEW DIAGONAL WITH LEAST VALUE
70C OF ERROR
71C
72C MACHINE DEPENDENT CONSTANTS
73C ---------------------------
74C
75C EPMACH IS THE LARGEST RELATIVE SPACING.
76C OFLOW IS THE LARGEST POSITIVE MAGNITUDE.
77C LIMEXP IS THE MAXIMUM NUMBER OF ELEMENTS THE EPSILON
78C TABLE CAN CONTAIN. IF THIS NUMBER IS REACHED, THE UPPER
79C DIAGONAL OF THE EPSILON TABLE IS DELETED.
80C
81C***FIRST EXECUTABLE STATEMENT DQELG
82 epmach = d1mach(4)
83 oflow = d1mach(2)
84 nres = nres+1
85 abserr = oflow
86 result = epstab(n)
87 IF(n.LT.3) GO TO 100
88 limexp = 50
89 epstab(n+2) = epstab(n)
90 newelm = (n-1)/2
91 epstab(n) = oflow
92 num = n
93 k1 = n
94 DO 40 i = 1,newelm
95 k2 = k1-1
96 k3 = k1-2
97 res = epstab(k1+2)
98 e0 = epstab(k3)
99 e1 = epstab(k2)
100 e2 = res
101 e1abs = dabs(e1)
102 delta2 = e2-e1
103 err2 = dabs(delta2)
104 tol2 = dmax1(dabs(e2),e1abs)*epmach
105 delta3 = e1-e0
106 err3 = dabs(delta3)
107 tol3 = dmax1(e1abs,dabs(e0))*epmach
108 IF(err2.GT.tol2.OR.err3.GT.tol3) GO TO 10
109C
110C IF E0, E1 AND E2 ARE EQUAL TO WITHIN MACHINE
111C ACCURACY, CONVERGENCE IS ASSUMED.
112C RESULT = E2
113C ABSERR = ABS(E1-E0)+ABS(E2-E1)
114C
115 result = res
116 abserr = err2+err3
117C ***JUMP OUT OF DO-LOOP
118 GO TO 100
119 10 e3 = epstab(k1)
120 epstab(k1) = e1
121 delta1 = e1-e3
122 err1 = dabs(delta1)
123 tol1 = dmax1(e1abs,dabs(e3))*epmach
124C
125C IF TWO ELEMENTS ARE VERY CLOSE TO EACH OTHER, OMIT
126C A PART OF THE TABLE BY ADJUSTING THE VALUE OF N
127C
128 IF(err1.LE.tol1.OR.err2.LE.tol2.OR.err3.LE.tol3) GO TO 20
129 ss = 0.1d+01/delta1+0.1d+01/delta2-0.1d+01/delta3
130 epsinf = dabs(ss*e1)
131C
132C TEST TO DETECT IRREGULAR BEHAVIOUR IN THE TABLE, AND
133C EVENTUALLY OMIT A PART OF THE TABLE ADJUSTING THE VALUE
134C OF N.
135C
136 IF(epsinf.GT.0.1d-03) GO TO 30
137 20 n = i+i-1
138C ***JUMP OUT OF DO-LOOP
139 GO TO 50
140C
141C COMPUTE A NEW ELEMENT AND EVENTUALLY ADJUST
142C THE VALUE OF RESULT.
143C
144 30 res = e1+0.1d+01/ss
145 epstab(k1) = res
146 k1 = k1-2
147 error = err2+dabs(res-e2)+err3
148 IF(error.GT.abserr) GO TO 40
149 abserr = error
150 result = res
151 40 CONTINUE
152C
153C SHIFT THE TABLE.
154C
155 50 IF(n.EQ.limexp) n = 2*(limexp/2)-1
156 ib = 1
157 IF((num/2)*2.EQ.num) ib = 2
158 ie = newelm+1
159 DO 60 i=1,ie
160 ib2 = ib+2
161 epstab(ib) = epstab(ib2)
162 ib = ib2
163 60 CONTINUE
164 IF(num.EQ.n) GO TO 80
165 indx = num-n+1
166 DO 70 i = 1,n
167 epstab(i)= epstab(indx)
168 indx = indx+1
169 70 CONTINUE
170 80 IF(nres.GE.4) GO TO 90
171 res3la(nres) = result
172 abserr = oflow
173 GO TO 100
174C
175C COMPUTE ERROR ESTIMATE
176C
177 90 abserr = dabs(result-res3la(3))+dabs(result-res3la(2))
178 * +dabs(result-res3la(1))
179 res3la(1) = res3la(2)
180 res3la(2) = res3la(3)
181 res3la(3) = result
182 100 abserr = dmax1(abserr,0.5d+01*epmach*dabs(result))
183 RETURN
184 END
subroutine dqelg(n, epstab, result, abserr, res3la, nres)
Definition dqelg.f:2