GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
dqk15i.f
Go to the documentation of this file.
1 SUBROUTINE dqk15i(F,BOUN,INF,A,B,RESULT,ABSERR,RESABS,RESASC,
2 1 IERR)
3C***BEGIN PROLOGUE DQK15I
4C***DATE WRITTEN 800101 (YYMMDD)
5C***REVISION DATE 830518 (YYMMDD)
6C***CATEGORY NO. H2A3A2,H2A4A2
7C***KEYWORDS 15-POINT TRANSFORMED GAUSS-KRONROD RULES
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 ORIGINAL (INFINITE INTEGRATION RANGE IS MAPPED
11C ONTO THE INTERVAL (0,1) AND (A,B) IS A PART OF (0,1).
12C IT IS THE PURPOSE TO COMPUTE
13C I = INTEGRAL OF TRANSFORMED INTEGRAND OVER (A,B),
14C J = INTEGRAL OF ABS(TRANSFORMED INTEGRAND) OVER (A,B).
15C***DESCRIPTION
16C
17C INTEGRATION RULE
18C STANDARD FORTRAN SUBROUTINE
19C DOUBLE PRECISION VERSION
20C
21C PARAMETERS
22C ON ENTRY
23C F - SUBROUTINE F(X,IERR,RESULT) DEFINING THE INTEGRAND
24C FUNCTION F(X). THE ACTUAL NAME FOR F NEEDS TO BE
25C DECLARED E X T E R N A L IN THE CALLING PROGRAM.
26C
27C BOUN - DOUBLE PRECISION
28C FINITE BOUND OF ORIGINAL INTEGRATION
29C RANGE (SET TO ZERO IF INF = +2)
30C
31C INF - INTEGER
32C IF INF = -1, THE ORIGINAL INTERVAL IS
33C (-INFINITY,BOUND),
34C IF INF = +1, THE ORIGINAL INTERVAL IS
35C (BOUND,+INFINITY),
36C IF INF = +2, THE ORIGINAL INTERVAL IS
37C (-INFINITY,+INFINITY) AND
38C THE INTEGRAL IS COMPUTED AS THE SUM OF TWO
39C INTEGRALS, ONE OVER (-INFINITY,0) AND ONE OVER
40C (0,+INFINITY).
41C
42C A - DOUBLE PRECISION
43C LOWER LIMIT FOR INTEGRATION OVER SUBRANGE
44C OF (0,1)
45C
46C B - DOUBLE PRECISION
47C UPPER LIMIT FOR INTEGRATION OVER SUBRANGE
48C OF (0,1)
49C
50C ON RETURN
51C RESULT - DOUBLE PRECISION
52C APPROXIMATION TO THE INTEGRAL I
53C RESULT IS COMPUTED BY APPLYING THE 15-POINT
54C KRONROD RULE(RESK) OBTAINED BY OPTIMAL ADDITION
55C OF ABSCISSAE TO THE 7-POINT GAUSS RULE(RESG).
56C
57C ABSERR - DOUBLE PRECISION
58C ESTIMATE OF THE MODULUS OF THE ABSOLUTE ERROR,
59C WHICH SHOULD EQUAL OR EXCEED ABS(I-RESULT)
60C
61C RESABS - DOUBLE PRECISION
62C APPROXIMATION TO THE INTEGRAL J
63C
64C RESASC - DOUBLE PRECISION
65C APPROXIMATION TO THE INTEGRAL OF
66C ABS((TRANSFORMED INTEGRAND)-I/(B-A)) OVER (A,B)
67C
68C***REFERENCES (NONE)
69C***ROUTINES CALLED D1MACH
70C***END PROLOGUE DQK15I
71C
72 DOUBLE PRECISION A,ABSC,ABSC1,ABSC2,ABSERR,B,BOUN,CENTR,DABS,DINF,
73 * dmax1,dmin1,d1mach,epmach,fc,fsum,fval1,fval2,fv1,fv2,hlgth,
74 * resabs,resasc,resg,resk,reskh,result,tabsc1,tabsc2,uflow,wg,wgk,
75 * xgk,fvalt
76 INTEGER INF,J
77 EXTERNAL f
78C
79 dimension fv1(7),fv2(7),xgk(8),wgk(8),wg(8)
80C
81C THE ABSCISSAE AND WEIGHTS ARE SUPPLIED FOR THE INTERVAL
82C (-1,1). BECAUSE OF SYMMETRY ONLY THE POSITIVE ABSCISSAE AND
83C THEIR CORRESPONDING WEIGHTS ARE GIVEN.
84C
85C XGK - ABSCISSAE OF THE 15-POINT KRONROD RULE
86C XGK(2), XGK(4), ... ABSCISSAE OF THE 7-POINT
87C GAUSS RULE
88C XGK(1), XGK(3), ... ABSCISSAE WHICH ARE OPTIMALLY
89C ADDED TO THE 7-POINT GAUSS RULE
90C
91C WGK - WEIGHTS OF THE 15-POINT KRONROD RULE
92C
93C WG - WEIGHTS OF THE 7-POINT GAUSS RULE, CORRESPONDING
94C TO THE ABSCISSAE XGK(2), XGK(4), ...
95C WG(1), WG(3), ... ARE SET TO ZERO.
96C
97 DATA wg(1) / 0.0d0 /
98 DATA wg(2) / 0.1294849661 6886969327 0611432679 082d0 /
99 DATA wg(3) / 0.0d0 /
100 DATA wg(4) / 0.2797053914 8927666790 1467771423 780d0 /
101 DATA wg(5) / 0.0d0 /
102 DATA wg(6) / 0.3818300505 0511894495 0369775488 975d0 /
103 DATA wg(7) / 0.0d0 /
104 DATA wg(8) / 0.4179591836 7346938775 5102040816 327d0 /
105C
106 DATA xgk(1) / 0.9914553711 2081263920 6854697526 329d0 /
107 DATA xgk(2) / 0.9491079123 4275852452 6189684047 851d0 /
108 DATA xgk(3) / 0.8648644233 5976907278 9712788640 926d0 /
109 DATA xgk(4) / 0.7415311855 9939443986 3864773280 788d0 /
110 DATA xgk(5) / 0.5860872354 6769113029 4144838258 730d0 /
111 DATA xgk(6) / 0.4058451513 7739716690 6606412076 961d0 /
112 DATA xgk(7) / 0.2077849550 0789846760 0689403773 245d0 /
113 DATA xgk(8) / 0.0000000000 0000000000 0000000000 000d0 /
114C
115 DATA wgk(1) / 0.0229353220 1052922496 3732008058 970d0 /
116 DATA wgk(2) / 0.0630920926 2997855329 0700663189 204d0 /
117 DATA wgk(3) / 0.1047900103 2225018383 9876322541 518d0 /
118 DATA wgk(4) / 0.1406532597 1552591874 5189590510 238d0 /
119 DATA wgk(5) / 0.1690047266 3926790282 6583426598 550d0 /
120 DATA wgk(6) / 0.1903505780 6478540991 3256402421 014d0 /
121 DATA wgk(7) / 0.2044329400 7529889241 4161999234 649d0 /
122 DATA wgk(8) / 0.2094821410 8472782801 2999174891 714d0 /
123C
124C
125C LIST OF MAJOR VARIABLES
126C -----------------------
127C
128C CENTR - MID POINT OF THE INTERVAL
129C HLGTH - HALF-LENGTH OF THE INTERVAL
130C ABSC* - ABSCISSA
131C TABSC* - TRANSFORMED ABSCISSA
132C FVAL* - FUNCTION VALUE
133C RESG - RESULT OF THE 7-POINT GAUSS FORMULA
134C RESK - RESULT OF THE 15-POINT KRONROD FORMULA
135C RESKH - APPROXIMATION TO THE MEAN VALUE OF THE TRANSFORMED
136C INTEGRAND OVER (A,B), I.E. TO I/(B-A)
137C
138C MACHINE DEPENDENT CONSTANTS
139C ---------------------------
140C
141C EPMACH IS THE LARGEST RELATIVE SPACING.
142C UFLOW IS THE SMALLEST POSITIVE MAGNITUDE.
143C
144C***FIRST EXECUTABLE STATEMENT DQK15I
145 epmach = d1mach(4)
146 uflow = d1mach(1)
147 dinf = min0(1,inf)
148C
149 centr = 0.5d+00*(a+b)
150 hlgth = 0.5d+00*(b-a)
151 tabsc1 = boun+dinf*(0.1d+01-centr)/centr
152 ierr = 0
153 CALL f(tabsc1,ierr,fval1)
154 IF (ierr .LT. 0) RETURN
155 IF(inf.EQ.2) THEN
156 CALL f(-tabsc1,ierr,fvalt)
157 IF (ierr .LT. 0) RETURN
158 fval1 = fval1+fvalt
159 ENDIF
160 fc = (fval1/centr)/centr
161C
162C COMPUTE THE 15-POINT KRONROD APPROXIMATION TO
163C THE INTEGRAL, AND ESTIMATE THE ERROR.
164C
165 resg = wg(8)*fc
166 resk = wgk(8)*fc
167 resabs = dabs(resk)
168 DO 10 j=1,7
169 absc = hlgth*xgk(j)
170 absc1 = centr-absc
171 absc2 = centr+absc
172 tabsc1 = boun+dinf*(0.1d+01-absc1)/absc1
173 tabsc2 = boun+dinf*(0.1d+01-absc2)/absc2
174 CALL f(tabsc1,ierr,fval1)
175 IF (ierr .LT. 0) RETURN
176 CALL f(tabsc2,ierr,fval2)
177 IF (ierr .LT. 0) RETURN
178 IF(inf.EQ.2) THEN
179 CALL f(-tabsc1,ierr,fvalt)
180 IF (ierr .LT. 0) RETURN
181 fval1 = fval1+fvalt
182 ENDIF
183 IF(inf.EQ.2) THEN
184 CALL f(-tabsc2,ierr,fvalt)
185 IF (ierr .LT. 0) RETURN
186 fval2 = fval2+fvalt
187 ENDIF
188 fval1 = (fval1/absc1)/absc1
189 fval2 = (fval2/absc2)/absc2
190 fv1(j) = fval1
191 fv2(j) = fval2
192 fsum = fval1+fval2
193 resg = resg+wg(j)*fsum
194 resk = resk+wgk(j)*fsum
195 resabs = resabs+wgk(j)*(dabs(fval1)+dabs(fval2))
196 10 CONTINUE
197 reskh = resk*0.5d+00
198 resasc = wgk(8)*dabs(fc-reskh)
199 DO 20 j=1,7
200 resasc = resasc+wgk(j)*(dabs(fv1(j)-reskh)+dabs(fv2(j)-reskh))
201 20 CONTINUE
202 result = resk*hlgth
203 resasc = resasc*hlgth
204 resabs = resabs*hlgth
205 abserr = dabs((resk-resg)*hlgth)
206 IF(resasc.NE.0.0d+00.AND.abserr.NE.0.d0) abserr = resasc*
207 * dmin1(0.1d+01,(0.2d+03*abserr/resasc)**1.5d+00)
208 IF(resabs.GT.uflow/(0.5d+02*epmach)) abserr = dmax1
209 * ((epmach*0.5d+02)*resabs,abserr)
210 RETURN
211 END
double precision function d1mach(i)
Definition d1mach.f:23
subroutine dqk15i(f, boun, inf, a, b, result, abserr, resabs, resasc, ierr)
Definition dqk15i.f:3