|
a |
|
b/partyMod/src/mvt.f |
|
|
1 |
* |
|
|
2 |
* $Id$ |
|
|
3 |
* |
|
|
4 |
SUBROUTINE MVTDST( N, NU, LOWER, UPPER, INFIN, CORREL, DELTA, |
|
|
5 |
& MAXPTS, ABSEPS, RELEPS, ERROR, VALUE, INFORM ) |
|
|
6 |
* |
|
|
7 |
* A subroutine for computing non-central multivariate t probabilities. |
|
|
8 |
* This subroutine uses an algorithm (QRSVN) described in the paper |
|
|
9 |
* "Comparison of Methods for the Computation of Multivariate |
|
|
10 |
* t-Probabilities", by Alan Genz and Frank Bretz |
|
|
11 |
* J. Comp. Graph. Stat. 11 (2002), pp. 950-971. |
|
|
12 |
* |
|
|
13 |
* Alan Genz |
|
|
14 |
* Department of Mathematics |
|
|
15 |
* Washington State University |
|
|
16 |
* Pullman, WA 99164-3113 |
|
|
17 |
* Email : AlanGenz@wsu.edu |
|
|
18 |
* |
|
|
19 |
* Original source available from |
|
|
20 |
* http://www.math.wsu.edu/faculty/genz/software/fort77/mvtdstpack.f |
|
|
21 |
* |
|
|
22 |
* This is version 28/05/2013 |
|
|
23 |
* |
|
|
24 |
* Parameters |
|
|
25 |
* |
|
|
26 |
* N INTEGER, the number of variables. |
|
|
27 |
* NU INTEGER, the number of degrees of freedom. |
|
|
28 |
* If NU < 1, then an MVN probability is computed. |
|
|
29 |
* LOWER DOUBLE PRECISION, array of lower integration limits. |
|
|
30 |
* UPPER DOUBLE PRECISION, array of upper integration limits. |
|
|
31 |
* INFIN INTEGER, array of integration limits flags: |
|
|
32 |
* if INFIN(I) < 0, Ith limits are (-infinity, infinity); |
|
|
33 |
* if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)]; |
|
|
34 |
* if INFIN(I) = 1, Ith limits are [LOWER(I), infinity); |
|
|
35 |
* if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)]. |
|
|
36 |
* CORREL DOUBLE PRECISION, array of correlation coefficients; |
|
|
37 |
* the correlation coefficient in row I column J of the |
|
|
38 |
* correlation matrixshould be stored in |
|
|
39 |
* CORREL( J + ((I-2)*(I-1))/2 ), for J < I. |
|
|
40 |
* The correlation matrix must be positive semi-definite. |
|
|
41 |
* DELTA DOUBLE PRECISION, array of non-centrality parameters. |
|
|
42 |
* MAXPTS INTEGER, maximum number of function values allowed. This |
|
|
43 |
* parameter can be used to limit the time. A sensible |
|
|
44 |
* strategy is to start with MAXPTS = 1000*N, and then |
|
|
45 |
* increase MAXPTS if ERROR is too large. |
|
|
46 |
* ABSEPS DOUBLE PRECISION absolute error tolerance. |
|
|
47 |
* RELEPS DOUBLE PRECISION relative error tolerance. |
|
|
48 |
* ERROR DOUBLE PRECISION estimated absolute error, |
|
|
49 |
* with 99% confidence level. |
|
|
50 |
* VALUE DOUBLE PRECISION estimated value for the integral |
|
|
51 |
* INFORM INTEGER, termination status parameter: |
|
|
52 |
* if INFORM = 0, normal completion with ERROR < EPS; |
|
|
53 |
* if INFORM = 1, completion with ERROR > EPS and MAXPTS |
|
|
54 |
* function vaules used; increase MAXPTS to |
|
|
55 |
* decrease ERROR; |
|
|
56 |
* if INFORM = 2, N > 1000 or N < 1. |
|
|
57 |
* if INFORM = 3, correlation matrix not positive semi-definite. |
|
|
58 |
* |
|
|
59 |
EXTERNAL MVSUBR |
|
|
60 |
INTEGER N, ND, NU, INFIN(*), MAXPTS, INFORM, IVLS |
|
|
61 |
DOUBLE PRECISION CORREL(*), LOWER(*), UPPER(*), DELTA(*), RELEPS, |
|
|
62 |
& ABSEPS, ERROR, VALUE, E(1), V(1) |
|
|
63 |
COMMON /PTBLCK/IVLS |
|
|
64 |
IVLS = 0 |
|
|
65 |
|
|
|
66 |
IF ( N .GT. 1000 .OR. N .LT. 1 ) THEN |
|
|
67 |
VALUE = 0 |
|
|
68 |
ERROR = 1 |
|
|
69 |
INFORM = 2 |
|
|
70 |
ELSE |
|
|
71 |
CALL MVINTS( N, NU, CORREL, LOWER, UPPER, DELTA, INFIN, |
|
|
72 |
& ND, VALUE, ERROR, INFORM ) |
|
|
73 |
IF ( INFORM .EQ. 0 .AND. ND .GT. 0 ) THEN |
|
|
74 |
* |
|
|
75 |
* Call the lattice rule integration subroutine |
|
|
76 |
* |
|
|
77 |
CALL MVKBRV( ND, IVLS, MAXPTS, 1, MVSUBR, ABSEPS, RELEPS, |
|
|
78 |
& E(1), V, INFORM ) |
|
|
79 |
ERROR = E(1) |
|
|
80 |
VALUE = V(1) |
|
|
81 |
ENDIF |
|
|
82 |
ENDIF |
|
|
83 |
|
|
|
84 |
END |
|
|
85 |
* |
|
|
86 |
SUBROUTINE MVSUBR( N, W, NF, F ) |
|
|
87 |
* |
|
|
88 |
* Integrand subroutine |
|
|
89 |
* |
|
|
90 |
INTEGER N, NF, NUIN, INFIN(*), NL |
|
|
91 |
DOUBLE PRECISION W(*),F(*), LOWER(*),UPPER(*), CORREL(*), DELTA(*) |
|
|
92 |
PARAMETER ( NL = 1000 ) |
|
|
93 |
INTEGER INFI(NL), NU, ND, INFORM, NY |
|
|
94 |
DOUBLE PRECISION COV(NL*(NL+1)/2), A(NL), B(NL), DL(NL), Y(NL) |
|
|
95 |
DOUBLE PRECISION MVCHNV, SNU, R, VL, ER, DI, EI |
|
|
96 |
SAVE NU, SNU, INFI, A, B, DL, COV |
|
|
97 |
IF ( NU .LE. 0 ) THEN |
|
|
98 |
R = 1 |
|
|
99 |
CALL MVVLSB( N+1, W, R, DL,INFI,A,B,COV, Y, DI,EI, NY, F(1) ) |
|
|
100 |
ELSE |
|
|
101 |
R = MVCHNV( NU, W(N) )/SNU |
|
|
102 |
CALL MVVLSB( N , W, R, DL,INFI,A,B,COV, Y, DI,EI, NY, F(1) ) |
|
|
103 |
END IF |
|
|
104 |
RETURN |
|
|
105 |
* |
|
|
106 |
* Entry point for intialization. |
|
|
107 |
* |
|
|
108 |
ENTRY MVINTS( N, NUIN, CORREL, LOWER, UPPER, DELTA, INFIN, |
|
|
109 |
& ND, VL, ER, INFORM ) |
|
|
110 |
* |
|
|
111 |
* Initialization and computation of covariance Cholesky factor. |
|
|
112 |
* |
|
|
113 |
CALL MVSORT( N, LOWER, UPPER, DELTA, CORREL, INFIN, Y, .TRUE., |
|
|
114 |
& ND, A, B, DL, COV, INFI, INFORM ) |
|
|
115 |
NU = NUIN |
|
|
116 |
CALL MVSPCL( ND, NU, A, B, DL, COV, INFI, SNU, VL, ER, INFORM ) |
|
|
117 |
END |
|
|
118 |
* |
|
|
119 |
SUBROUTINE MVSPCL( ND, NU, A,B,DL, COV, INFI, SNU, VL,ER, INFORM ) |
|
|
120 |
* |
|
|
121 |
* Special cases subroutine |
|
|
122 |
* |
|
|
123 |
DOUBLE PRECISION COV(*), A(*), B(*), DL(*), SNU, R, VL, ER |
|
|
124 |
INTEGER ND, NU, INFI(*), INFORM |
|
|
125 |
DOUBLE PRECISION MVBVT, MVSTDT |
|
|
126 |
IF ( INFORM .GT. 0 ) THEN |
|
|
127 |
VL = 0 |
|
|
128 |
ER = 1 |
|
|
129 |
ELSE |
|
|
130 |
* |
|
|
131 |
* Special cases |
|
|
132 |
* |
|
|
133 |
IF ( ND .EQ. 0 ) THEN |
|
|
134 |
ER = 0 |
|
|
135 |
* Code added to fix ND = 0 bug, 24/03/2009 -> |
|
|
136 |
VL = 1 |
|
|
137 |
* <- Code added to fix ND = 0 bug, 24/03/2009 |
|
|
138 |
ELSE IF ( ND.EQ.1 .AND. ( NU.LT.1 .OR. ABS(DL(1)).EQ.0 ) ) THEN |
|
|
139 |
* |
|
|
140 |
* 1-d case for normal or central t |
|
|
141 |
* |
|
|
142 |
VL = 1 |
|
|
143 |
IF ( INFI(1) .NE. 1 ) VL = MVSTDT( NU, B(1) - DL(1) ) |
|
|
144 |
IF ( INFI(1) .NE. 0 ) VL = VL - MVSTDT( NU, A(1) - DL(1) ) |
|
|
145 |
IF ( VL .LT. 0 ) VL = 0 |
|
|
146 |
ER = 2D-16 |
|
|
147 |
ND = 0 |
|
|
148 |
ELSE IF ( ND .EQ. 2 .AND. |
|
|
149 |
& ( NU .LT. 1 .OR. ABS(DL(1))+ABS(DL(2)) .EQ. 0 ) ) THEN |
|
|
150 |
* |
|
|
151 |
* 2-d case for normal or central t |
|
|
152 |
* |
|
|
153 |
IF ( INFI(1) .NE. 0 ) A(1) = A(1) - DL(1) |
|
|
154 |
IF ( INFI(1) .NE. 1 ) B(1) = B(1) - DL(1) |
|
|
155 |
IF ( INFI(2) .NE. 0 ) A(2) = A(2) - DL(2) |
|
|
156 |
IF ( INFI(2) .NE. 1 ) B(2) = B(2) - DL(2) |
|
|
157 |
IF ( ABS( COV(3) ) .GT. 0 ) THEN |
|
|
158 |
* |
|
|
159 |
* 2-d nonsingular case |
|
|
160 |
* |
|
|
161 |
R = SQRT( 1 + COV(2)**2 ) |
|
|
162 |
IF ( INFI(2) .NE. 0 ) A(2) = A(2)/R |
|
|
163 |
IF ( INFI(2) .NE. 1 ) B(2) = B(2)/R |
|
|
164 |
COV(2) = COV(2)/R |
|
|
165 |
VL = MVBVT( NU, A, B, INFI, COV(2) ) |
|
|
166 |
ER = 1D-15 |
|
|
167 |
ELSE |
|
|
168 |
* |
|
|
169 |
* 2-d singular case |
|
|
170 |
* |
|
|
171 |
IF ( INFI(1) .NE. 0 ) THEN |
|
|
172 |
IF ( INFI(2) .NE. 0 ) A(1) = MAX( A(1), A(2) ) |
|
|
173 |
ELSE |
|
|
174 |
IF ( INFI(2) .NE. 0 ) A(1) = A(2) |
|
|
175 |
END IF |
|
|
176 |
IF ( INFI(1) .NE. 1 ) THEN |
|
|
177 |
IF ( INFI(2) .NE. 1 ) B(1) = MIN( B(1), B(2) ) |
|
|
178 |
ELSE |
|
|
179 |
IF ( INFI(2) .NE. 1 ) B(1) = B(2) |
|
|
180 |
END IF |
|
|
181 |
IF ( INFI(1) .NE. INFI(2) ) INFI(1) = 2 |
|
|
182 |
VL = 1 |
|
|
183 |
* A(1), B(1) Bug Fixed, 28/05/2013 |
|
|
184 |
IF ( INFI(1) .NE. 1 ) VL = MVSTDT( NU, B(1) ) |
|
|
185 |
IF ( INFI(1) .NE. 0 ) VL = VL - MVSTDT( NU, A(1) ) |
|
|
186 |
IF ( VL .LT. 0 ) VL = 0 |
|
|
187 |
ER = 2D-16 |
|
|
188 |
END IF |
|
|
189 |
ND = 0 |
|
|
190 |
ELSE |
|
|
191 |
IF ( NU .GT. 0 ) THEN |
|
|
192 |
SNU = SQRT( DBLE(NU) ) |
|
|
193 |
ELSE |
|
|
194 |
ND = ND - 1 |
|
|
195 |
END IF |
|
|
196 |
END IF |
|
|
197 |
END IF |
|
|
198 |
END |
|
|
199 |
* |
|
|
200 |
SUBROUTINE MVVLSB( N,W,R,DL,INFI, A,B,COV, Y, DI,EI, ND, VALUE ) |
|
|
201 |
* |
|
|
202 |
* Integrand subroutine |
|
|
203 |
* |
|
|
204 |
INTEGER N, INFI(*), ND |
|
|
205 |
DOUBLE PRECISION W(*), R, DL(*), A(*), B(*), COV(*), Y(*) |
|
|
206 |
INTEGER I, J, IJ, INFA, INFB |
|
|
207 |
DOUBLE PRECISION SUM, AI, BI, DI, EI, MVPHNV, VALUE |
|
|
208 |
VALUE = 1 |
|
|
209 |
INFA = 0 |
|
|
210 |
INFB = 0 |
|
|
211 |
ND = 0 |
|
|
212 |
IJ = 0 |
|
|
213 |
DO I = 1, N |
|
|
214 |
SUM = DL(I) |
|
|
215 |
DO J = 1, I-1 |
|
|
216 |
IJ = IJ + 1 |
|
|
217 |
IF ( J .LE. ND ) SUM = SUM + COV(IJ)*Y(J) |
|
|
218 |
END DO |
|
|
219 |
IF ( INFI(I) .NE. 0 ) THEN |
|
|
220 |
IF ( INFA .EQ. 1 ) THEN |
|
|
221 |
AI = MAX( AI, R*A(I) - SUM ) |
|
|
222 |
ELSE |
|
|
223 |
AI = R*A(I) - SUM |
|
|
224 |
INFA = 1 |
|
|
225 |
END IF |
|
|
226 |
END IF |
|
|
227 |
IF ( INFI(I) .NE. 1 ) THEN |
|
|
228 |
IF ( INFB .EQ. 1 ) THEN |
|
|
229 |
BI = MIN( BI, R*B(I) - SUM ) |
|
|
230 |
ELSE |
|
|
231 |
BI = R*B(I) - SUM |
|
|
232 |
INFB = 1 |
|
|
233 |
END IF |
|
|
234 |
END IF |
|
|
235 |
IJ = IJ + 1 |
|
|
236 |
IF ( I .EQ. N .OR. COV(IJ+ND+2) .GT. 0 ) THEN |
|
|
237 |
CALL MVLIMS( AI, BI, INFA + INFA + INFB - 1, DI, EI ) |
|
|
238 |
IF ( DI .GE. EI ) THEN |
|
|
239 |
VALUE = 0 |
|
|
240 |
RETURN |
|
|
241 |
ELSE |
|
|
242 |
VALUE = VALUE*( EI - DI ) |
|
|
243 |
ND = ND + 1 |
|
|
244 |
IF ( I .LT. N ) Y(ND) = MVPHNV( DI + W(ND)*( EI - DI ) ) |
|
|
245 |
INFA = 0 |
|
|
246 |
INFB = 0 |
|
|
247 |
END IF |
|
|
248 |
END IF |
|
|
249 |
END DO |
|
|
250 |
END |
|
|
251 |
* |
|
|
252 |
SUBROUTINE MVSORT( N, LOWER, UPPER, DELTA, CORREL, INFIN, Y,PIVOT, |
|
|
253 |
& ND, A, B, DL, COV, INFI, INFORM ) |
|
|
254 |
* |
|
|
255 |
* Subroutine to sort integration limits and determine Cholesky factor. |
|
|
256 |
* |
|
|
257 |
INTEGER N, ND, INFIN(*), INFI(*), INFORM |
|
|
258 |
LOGICAL PIVOT |
|
|
259 |
DOUBLE PRECISION A(*), B(*), DL(*), COV(*), |
|
|
260 |
& LOWER(*), UPPER(*), DELTA(*), CORREL(*), Y(*) |
|
|
261 |
INTEGER I, J, K, L, M, II, IJ, IL, JL, JMIN |
|
|
262 |
DOUBLE PRECISION SUMSQ, AJ, BJ, SUM, EPS, EPSI, D, E |
|
|
263 |
DOUBLE PRECISION CVDIAG, AMIN, BMIN, DEMIN, MVTDNS |
|
|
264 |
PARAMETER ( EPS = 1D-10 ) |
|
|
265 |
INFORM = 0 |
|
|
266 |
IJ = 0 |
|
|
267 |
II = 0 |
|
|
268 |
ND = N |
|
|
269 |
DO I = 1, N |
|
|
270 |
A(I) = 0 |
|
|
271 |
B(I) = 0 |
|
|
272 |
DL(I) = 0 |
|
|
273 |
INFI(I) = INFIN(I) |
|
|
274 |
IF ( INFI(I) .LT. 0 ) THEN |
|
|
275 |
ND = ND - 1 |
|
|
276 |
ELSE |
|
|
277 |
IF ( INFI(I) .NE. 0 ) A(I) = LOWER(I) |
|
|
278 |
IF ( INFI(I) .NE. 1 ) B(I) = UPPER(I) |
|
|
279 |
DL(I) = DELTA(I) |
|
|
280 |
ENDIF |
|
|
281 |
DO J = 1, I-1 |
|
|
282 |
IJ = IJ + 1 |
|
|
283 |
II = II + 1 |
|
|
284 |
COV(IJ) = CORREL(II) |
|
|
285 |
END DO |
|
|
286 |
IJ = IJ + 1 |
|
|
287 |
COV(IJ) = 1 |
|
|
288 |
END DO |
|
|
289 |
* |
|
|
290 |
* First move any doubly infinite limits to innermost positions. |
|
|
291 |
* |
|
|
292 |
IF ( ND .GT. 0 ) THEN |
|
|
293 |
DO I = N, ND + 1, -1 |
|
|
294 |
IF ( INFI(I) .GE. 0 ) THEN |
|
|
295 |
DO J = 1, I-1 |
|
|
296 |
IF ( INFI(J) .LT. 0 ) THEN |
|
|
297 |
CALL MVSWAP( J, I, A, B, DL, INFI, N, COV ) |
|
|
298 |
GO TO 10 |
|
|
299 |
ENDIF |
|
|
300 |
END DO |
|
|
301 |
ENDIF |
|
|
302 |
10 CONTINUE |
|
|
303 |
END DO |
|
|
304 |
* |
|
|
305 |
* Sort remaining limits and determine Cholesky factor. |
|
|
306 |
* |
|
|
307 |
II = 0 |
|
|
308 |
JL = ND |
|
|
309 |
DO I = 1, ND |
|
|
310 |
* |
|
|
311 |
* Determine the integration limits for variable with minimum |
|
|
312 |
* expected probability and interchange that variable with Ith. |
|
|
313 |
* |
|
|
314 |
DEMIN = 1 |
|
|
315 |
JMIN = I |
|
|
316 |
CVDIAG = 0 |
|
|
317 |
IJ = II |
|
|
318 |
EPSI = EPS*I |
|
|
319 |
IF ( .NOT. PIVOT ) JL = I |
|
|
320 |
DO J = I, JL |
|
|
321 |
IF ( COV(IJ+J) .GT. EPSI ) THEN |
|
|
322 |
SUMSQ = SQRT( COV(IJ+J) ) |
|
|
323 |
SUM = DL(J) |
|
|
324 |
DO K = 1, I-1 |
|
|
325 |
SUM = SUM + COV(IJ+K)*Y(K) |
|
|
326 |
END DO |
|
|
327 |
AJ = ( A(J) - SUM )/SUMSQ |
|
|
328 |
BJ = ( B(J) - SUM )/SUMSQ |
|
|
329 |
CALL MVLIMS( AJ, BJ, INFI(J), D, E ) |
|
|
330 |
IF ( DEMIN .GE. E - D ) THEN |
|
|
331 |
JMIN = J |
|
|
332 |
AMIN = AJ |
|
|
333 |
BMIN = BJ |
|
|
334 |
DEMIN = E - D |
|
|
335 |
CVDIAG = SUMSQ |
|
|
336 |
ENDIF |
|
|
337 |
ENDIF |
|
|
338 |
IJ = IJ + J |
|
|
339 |
END DO |
|
|
340 |
IF ( JMIN .GT. I ) THEN |
|
|
341 |
CALL MVSWAP( I, JMIN, A, B, DL, INFI, N, COV ) |
|
|
342 |
END IF |
|
|
343 |
IF ( COV(II+I) .LT. -EPSI ) THEN |
|
|
344 |
INFORM = 3 |
|
|
345 |
END IF |
|
|
346 |
COV(II+I) = CVDIAG |
|
|
347 |
* |
|
|
348 |
* Compute Ith column of Cholesky factor. |
|
|
349 |
* Compute expected value for Ith integration variable and |
|
|
350 |
* scale Ith covariance matrix row and limits. |
|
|
351 |
* |
|
|
352 |
IF ( CVDIAG .GT. 0 ) THEN |
|
|
353 |
IL = II + I |
|
|
354 |
DO L = I+1, ND |
|
|
355 |
COV(IL+I) = COV(IL+I)/CVDIAG |
|
|
356 |
IJ = II + I |
|
|
357 |
DO J = I+1, L |
|
|
358 |
COV(IL+J) = COV(IL+J) - COV(IL+I)*COV(IJ+I) |
|
|
359 |
IJ = IJ + J |
|
|
360 |
END DO |
|
|
361 |
IL = IL + L |
|
|
362 |
END DO |
|
|
363 |
* |
|
|
364 |
* Expected Y = -( density(b) - density(a) )/( b - a ) |
|
|
365 |
* |
|
|
366 |
IF ( DEMIN .GT. EPSI ) THEN |
|
|
367 |
Y(I) = 0 |
|
|
368 |
IF ( INFI(I) .NE. 0 ) Y(I) = MVTDNS( 0, AMIN ) |
|
|
369 |
IF ( INFI(I) .NE. 1 ) Y(I) = Y(I) - MVTDNS( 0, BMIN ) |
|
|
370 |
Y(I) = Y(I)/DEMIN |
|
|
371 |
ELSE |
|
|
372 |
IF ( INFI(I) .EQ. 0 ) Y(I) = BMIN |
|
|
373 |
IF ( INFI(I) .EQ. 1 ) Y(I) = AMIN |
|
|
374 |
IF ( INFI(I) .EQ. 2 ) Y(I) = ( AMIN + BMIN )/2 |
|
|
375 |
END IF |
|
|
376 |
DO J = 1, I |
|
|
377 |
II = II + 1 |
|
|
378 |
COV(II) = COV(II)/CVDIAG |
|
|
379 |
END DO |
|
|
380 |
A(I) = A(I)/CVDIAG |
|
|
381 |
B(I) = B(I)/CVDIAG |
|
|
382 |
DL(I) = DL(I)/CVDIAG |
|
|
383 |
ELSE |
|
|
384 |
IL = II + I |
|
|
385 |
DO L = I+1, ND |
|
|
386 |
COV(IL+I) = 0 |
|
|
387 |
IL = IL + L |
|
|
388 |
END DO |
|
|
389 |
* |
|
|
390 |
* If the covariance matrix diagonal entry is zero, |
|
|
391 |
* permute limits and rows, if necessary. |
|
|
392 |
* |
|
|
393 |
* |
|
|
394 |
DO J = I-1, 1, -1 |
|
|
395 |
IF ( ABS( COV(II+J) ) .GT. EPSI ) THEN |
|
|
396 |
A(I) = A(I)/COV(II+J) |
|
|
397 |
B(I) = B(I)/COV(II+J) |
|
|
398 |
DL(I) = DL(I)/COV(II+J) |
|
|
399 |
IF ( COV(II+J) .LT. 0 ) THEN |
|
|
400 |
CALL MVSSWP( A(I), B(I) ) |
|
|
401 |
IF ( INFI(I) .NE. 2 ) INFI(I) = 1 - INFI(I) |
|
|
402 |
END IF |
|
|
403 |
DO L = 1, J |
|
|
404 |
COV(II+L) = COV(II+L)/COV(II+J) |
|
|
405 |
END DO |
|
|
406 |
DO L = J+1, I-1 |
|
|
407 |
IF( COV((L-1)*L/2+J+1) .GT. 0 ) THEN |
|
|
408 |
IJ = II |
|
|
409 |
DO K = I-1, L, -1 |
|
|
410 |
DO M = 1, K |
|
|
411 |
CALL MVSSWP( COV(IJ-K+M), COV(IJ+M) ) |
|
|
412 |
END DO |
|
|
413 |
CALL MVSSWP( A(K), A(K+1) ) |
|
|
414 |
CALL MVSSWP( B(K), B(K+1) ) |
|
|
415 |
CALL MVSSWP( DL(K), DL(K+1) ) |
|
|
416 |
M = INFI(K) |
|
|
417 |
INFI(K) = INFI(K+1) |
|
|
418 |
INFI(K+1) = M |
|
|
419 |
IJ = IJ - K |
|
|
420 |
END DO |
|
|
421 |
GO TO 20 |
|
|
422 |
END IF |
|
|
423 |
END DO |
|
|
424 |
GO TO 20 |
|
|
425 |
END IF |
|
|
426 |
COV(II+J) = 0 |
|
|
427 |
END DO |
|
|
428 |
20 II = II + I |
|
|
429 |
Y(I) = 0 |
|
|
430 |
END IF |
|
|
431 |
END DO |
|
|
432 |
ENDIF |
|
|
433 |
END |
|
|
434 |
* |
|
|
435 |
DOUBLE PRECISION FUNCTION MVTDNS( NU, X ) |
|
|
436 |
INTEGER NU, I |
|
|
437 |
DOUBLE PRECISION X, PROD, PI, SQTWPI |
|
|
438 |
PARAMETER ( PI = 3.141592653589793D0 ) |
|
|
439 |
PARAMETER ( SQTWPI = 2.506628274631001D0 ) |
|
|
440 |
MVTDNS = 0 |
|
|
441 |
IF ( NU .GT. 0 ) THEN |
|
|
442 |
PROD = 1/SQRT( DBLE(NU) ) |
|
|
443 |
DO I = NU - 2, 1, -2 |
|
|
444 |
PROD = PROD*( I + 1 )/I |
|
|
445 |
END DO |
|
|
446 |
IF ( MOD( NU, 2 ) .EQ. 0 ) THEN |
|
|
447 |
PROD = PROD/2 |
|
|
448 |
ELSE |
|
|
449 |
PROD = PROD/PI |
|
|
450 |
END IF |
|
|
451 |
MVTDNS = PROD/SQRT( 1 + X*X/NU )**( NU + 1 ) |
|
|
452 |
ELSE |
|
|
453 |
IF ( ABS(X) .LT. 10 ) MVTDNS = EXP( -X*X/2 )/SQTWPI |
|
|
454 |
END IF |
|
|
455 |
END |
|
|
456 |
* |
|
|
457 |
SUBROUTINE MVLIMS( A, B, INFIN, LOWER, UPPER ) |
|
|
458 |
DOUBLE PRECISION A, B, LOWER, UPPER, MVPHI |
|
|
459 |
INTEGER INFIN |
|
|
460 |
LOWER = 0 |
|
|
461 |
UPPER = 1 |
|
|
462 |
IF ( INFIN .GE. 0 ) THEN |
|
|
463 |
IF ( INFIN .NE. 0 ) LOWER = MVPHI(A) |
|
|
464 |
IF ( INFIN .NE. 1 ) UPPER = MVPHI(B) |
|
|
465 |
ENDIF |
|
|
466 |
UPPER = MAX( UPPER, LOWER ) |
|
|
467 |
END |
|
|
468 |
* |
|
|
469 |
SUBROUTINE MVSSWP( X, Y ) |
|
|
470 |
DOUBLE PRECISION X, Y, T |
|
|
471 |
T = X |
|
|
472 |
X = Y |
|
|
473 |
Y = T |
|
|
474 |
END |
|
|
475 |
* |
|
|
476 |
SUBROUTINE MVSWAP( P, Q, A, B, D, INFIN, N, C ) |
|
|
477 |
* |
|
|
478 |
* Swaps rows and columns P and Q in situ, with P <= Q. |
|
|
479 |
* |
|
|
480 |
DOUBLE PRECISION A(*), B(*), C(*), D(*) |
|
|
481 |
INTEGER INFIN(*), P, Q, N, I, J, II, JJ |
|
|
482 |
CALL MVSSWP( A(P), A(Q) ) |
|
|
483 |
CALL MVSSWP( B(P), B(Q) ) |
|
|
484 |
CALL MVSSWP( D(P), D(Q) ) |
|
|
485 |
J = INFIN(P) |
|
|
486 |
INFIN(P) = INFIN(Q) |
|
|
487 |
INFIN(Q) = J |
|
|
488 |
JJ = ( P*( P - 1 ) )/2 |
|
|
489 |
II = ( Q*( Q - 1 ) )/2 |
|
|
490 |
CALL MVSSWP( C(JJ+P), C(II+Q) ) |
|
|
491 |
DO J = 1, P-1 |
|
|
492 |
CALL MVSSWP( C(JJ+J), C(II+J) ) |
|
|
493 |
END DO |
|
|
494 |
JJ = JJ + P |
|
|
495 |
DO I = P+1, Q-1 |
|
|
496 |
CALL MVSSWP( C(JJ+P), C(II+I) ) |
|
|
497 |
JJ = JJ + I |
|
|
498 |
END DO |
|
|
499 |
II = II + Q |
|
|
500 |
DO I = Q+1, N |
|
|
501 |
CALL MVSSWP( C(II+P), C(II+Q) ) |
|
|
502 |
II = II + I |
|
|
503 |
END DO |
|
|
504 |
END |
|
|
505 |
* |
|
|
506 |
DOUBLE PRECISION FUNCTION MVPHI(Z) |
|
|
507 |
* |
|
|
508 |
* Normal distribution probabilities accurate to 1d-15. |
|
|
509 |
* Reference: J.L. Schonfelder, Math Comp 32(1978), pp 1232-1240. |
|
|
510 |
* |
|
|
511 |
INTEGER I, IM |
|
|
512 |
DOUBLE PRECISION A(0:43), BM, B, BP, P, RTWO, T, XA, Z |
|
|
513 |
PARAMETER( RTWO = 1.414213562373095048801688724209D0, IM = 24 ) |
|
|
514 |
SAVE A |
|
|
515 |
DATA ( A(I), I = 0, 43 )/ |
|
|
516 |
& 6.10143081923200417926465815756D-1, |
|
|
517 |
& -4.34841272712577471828182820888D-1, |
|
|
518 |
& 1.76351193643605501125840298123D-1, |
|
|
519 |
& -6.0710795609249414860051215825D-2, |
|
|
520 |
& 1.7712068995694114486147141191D-2, |
|
|
521 |
& -4.321119385567293818599864968D-3, |
|
|
522 |
& 8.54216676887098678819832055D-4, |
|
|
523 |
& -1.27155090609162742628893940D-4, |
|
|
524 |
& 1.1248167243671189468847072D-5, 3.13063885421820972630152D-7, |
|
|
525 |
& -2.70988068537762022009086D-7, 3.0737622701407688440959D-8, |
|
|
526 |
& 2.515620384817622937314D-9, -1.028929921320319127590D-9, |
|
|
527 |
& 2.9944052119949939363D-11, 2.6051789687266936290D-11, |
|
|
528 |
& -2.634839924171969386D-12, -6.43404509890636443D-13, |
|
|
529 |
& 1.12457401801663447D-13, 1.7281533389986098D-14, |
|
|
530 |
& -4.264101694942375D-15, -5.45371977880191D-16, |
|
|
531 |
& 1.58697607761671D-16, 2.0899837844334D-17, |
|
|
532 |
& -5.900526869409D-18, -9.41893387554D-19, 2.14977356470D-19, |
|
|
533 |
& 4.6660985008D-20, -7.243011862D-21, -2.387966824D-21, |
|
|
534 |
& 1.91177535D-22, 1.20482568D-22, -6.72377D-25, -5.747997D-24, |
|
|
535 |
& -4.28493D-25, 2.44856D-25, 4.3793D-26, -8.151D-27, -3.089D-27, |
|
|
536 |
& 9.3D-29, 1.74D-28, 1.6D-29, -8.0D-30, -2.0D-30 / |
|
|
537 |
* |
|
|
538 |
XA = ABS(Z)/RTWO |
|
|
539 |
IF ( XA .GT. 100 ) THEN |
|
|
540 |
P = 0 |
|
|
541 |
ELSE |
|
|
542 |
T = ( 8*XA - 30 ) / ( 4*XA + 15 ) |
|
|
543 |
BM = 0 |
|
|
544 |
B = 0 |
|
|
545 |
DO I = IM, 0, -1 |
|
|
546 |
BP = B |
|
|
547 |
B = BM |
|
|
548 |
BM = T*B - BP + A(I) |
|
|
549 |
END DO |
|
|
550 |
P = EXP( -XA*XA )*( BM - BP )/4 |
|
|
551 |
END IF |
|
|
552 |
IF ( Z .GT. 0 ) P = 1 - P |
|
|
553 |
MVPHI = P |
|
|
554 |
END |
|
|
555 |
* |
|
|
556 |
DOUBLE PRECISION FUNCTION MVPHNV(P) |
|
|
557 |
* |
|
|
558 |
* ALGORITHM AS241 APPL. STATIST. (1988) VOL. 37, NO. 3 |
|
|
559 |
* |
|
|
560 |
* Produces the normal deviate Z corresponding to a given lower |
|
|
561 |
* tail area of P. |
|
|
562 |
* |
|
|
563 |
* The hash sums below are the sums of the mantissas of the |
|
|
564 |
* coefficients. They are included for use in checking |
|
|
565 |
* transcription. |
|
|
566 |
* |
|
|
567 |
DOUBLE PRECISION SPLIT1, SPLIT2, CONST1, CONST2, |
|
|
568 |
* A0, A1, A2, A3, A4, A5, A6, A7, B1, B2, B3, B4, B5, B6, B7, |
|
|
569 |
* C0, C1, C2, C3, C4, C5, C6, C7, D1, D2, D3, D4, D5, D6, D7, |
|
|
570 |
* E0, E1, E2, E3, E4, E5, E6, E7, F1, F2, F3, F4, F5, F6, F7, |
|
|
571 |
* P, Q, R |
|
|
572 |
PARAMETER ( SPLIT1 = 0.425, SPLIT2 = 5, |
|
|
573 |
* CONST1 = 0.180625D0, CONST2 = 1.6D0 ) |
|
|
574 |
* |
|
|
575 |
* Coefficients for P close to 0.5 |
|
|
576 |
* |
|
|
577 |
PARAMETER ( |
|
|
578 |
* A0 = 3.38713 28727 96366 6080D0, |
|
|
579 |
* A1 = 1.33141 66789 17843 7745D+2, |
|
|
580 |
* A2 = 1.97159 09503 06551 4427D+3, |
|
|
581 |
* A3 = 1.37316 93765 50946 1125D+4, |
|
|
582 |
* A4 = 4.59219 53931 54987 1457D+4, |
|
|
583 |
* A5 = 6.72657 70927 00870 0853D+4, |
|
|
584 |
* A6 = 3.34305 75583 58812 8105D+4, |
|
|
585 |
* A7 = 2.50908 09287 30122 6727D+3, |
|
|
586 |
* B1 = 4.23133 30701 60091 1252D+1, |
|
|
587 |
* B2 = 6.87187 00749 20579 0830D+2, |
|
|
588 |
* B3 = 5.39419 60214 24751 1077D+3, |
|
|
589 |
* B4 = 2.12137 94301 58659 5867D+4, |
|
|
590 |
* B5 = 3.93078 95800 09271 0610D+4, |
|
|
591 |
* B6 = 2.87290 85735 72194 2674D+4, |
|
|
592 |
* B7 = 5.22649 52788 52854 5610D+3 ) |
|
|
593 |
* HASH SUM AB 55.88319 28806 14901 4439 |
|
|
594 |
* |
|
|
595 |
* Coefficients for P not close to 0, 0.5 or 1. |
|
|
596 |
* |
|
|
597 |
PARAMETER ( |
|
|
598 |
* C0 = 1.42343 71107 49683 57734D0, |
|
|
599 |
* C1 = 4.63033 78461 56545 29590D0, |
|
|
600 |
* C2 = 5.76949 72214 60691 40550D0, |
|
|
601 |
* C3 = 3.64784 83247 63204 60504D0, |
|
|
602 |
* C4 = 1.27045 82524 52368 38258D0, |
|
|
603 |
* C5 = 2.41780 72517 74506 11770D-1, |
|
|
604 |
* C6 = 2.27238 44989 26918 45833D-2, |
|
|
605 |
* C7 = 7.74545 01427 83414 07640D-4, |
|
|
606 |
* D1 = 2.05319 16266 37758 82187D0, |
|
|
607 |
* D2 = 1.67638 48301 83803 84940D0, |
|
|
608 |
* D3 = 6.89767 33498 51000 04550D-1, |
|
|
609 |
* D4 = 1.48103 97642 74800 74590D-1, |
|
|
610 |
* D5 = 1.51986 66563 61645 71966D-2, |
|
|
611 |
* D6 = 5.47593 80849 95344 94600D-4, |
|
|
612 |
* D7 = 1.05075 00716 44416 84324D-9 ) |
|
|
613 |
* HASH SUM CD 49.33206 50330 16102 89036 |
|
|
614 |
* |
|
|
615 |
* Coefficients for P near 0 or 1. |
|
|
616 |
* |
|
|
617 |
PARAMETER ( |
|
|
618 |
* E0 = 6.65790 46435 01103 77720D0, |
|
|
619 |
* E1 = 5.46378 49111 64114 36990D0, |
|
|
620 |
* E2 = 1.78482 65399 17291 33580D0, |
|
|
621 |
* E3 = 2.96560 57182 85048 91230D-1, |
|
|
622 |
* E4 = 2.65321 89526 57612 30930D-2, |
|
|
623 |
* E5 = 1.24266 09473 88078 43860D-3, |
|
|
624 |
* E6 = 2.71155 55687 43487 57815D-5, |
|
|
625 |
* E7 = 2.01033 43992 92288 13265D-7, |
|
|
626 |
* F1 = 5.99832 20655 58879 37690D-1, |
|
|
627 |
* F2 = 1.36929 88092 27358 05310D-1, |
|
|
628 |
* F3 = 1.48753 61290 85061 48525D-2, |
|
|
629 |
* F4 = 7.86869 13114 56132 59100D-4, |
|
|
630 |
* F5 = 1.84631 83175 10054 68180D-5, |
|
|
631 |
* F6 = 1.42151 17583 16445 88870D-7, |
|
|
632 |
* F7 = 2.04426 31033 89939 78564D-15 ) |
|
|
633 |
* HASH SUM EF 47.52583 31754 92896 71629 |
|
|
634 |
* |
|
|
635 |
Q = ( 2*P - 1 )/2 |
|
|
636 |
IF ( ABS(Q) .LE. SPLIT1 ) THEN |
|
|
637 |
R = CONST1 - Q*Q |
|
|
638 |
MVPHNV = Q*( ( ( ((((A7*R + A6)*R + A5)*R + A4)*R + A3) |
|
|
639 |
* *R + A2 )*R + A1 )*R + A0 ) |
|
|
640 |
* /( ( ( ((((B7*R + B6)*R + B5)*R + B4)*R + B3) |
|
|
641 |
* *R + B2 )*R + B1 )*R + 1 ) |
|
|
642 |
ELSE |
|
|
643 |
R = MIN( P, 1 - P ) |
|
|
644 |
IF ( R .GT. 0 ) THEN |
|
|
645 |
R = SQRT( -LOG(R) ) |
|
|
646 |
IF ( R .LE. SPLIT2 ) THEN |
|
|
647 |
R = R - CONST2 |
|
|
648 |
MVPHNV = ( ( ( ((((C7*R + C6)*R + C5)*R + C4)*R + C3) |
|
|
649 |
* *R + C2 )*R + C1 )*R + C0 ) |
|
|
650 |
* /( ( ( ((((D7*R + D6)*R + D5)*R + D4)*R + D3) |
|
|
651 |
* *R + D2 )*R + D1 )*R + 1 ) |
|
|
652 |
ELSE |
|
|
653 |
R = R - SPLIT2 |
|
|
654 |
MVPHNV = ( ( ( ((((E7*R + E6)*R + E5)*R + E4)*R + E3) |
|
|
655 |
* *R + E2 )*R + E1 )*R + E0 ) |
|
|
656 |
* /( ( ( ((((F7*R + F6)*R + F5)*R + F4)*R + F3) |
|
|
657 |
* *R + F2 )*R + F1 )*R + 1 ) |
|
|
658 |
END IF |
|
|
659 |
ELSE |
|
|
660 |
MVPHNV = 9 |
|
|
661 |
END IF |
|
|
662 |
IF ( Q .LT. 0 ) MVPHNV = - MVPHNV |
|
|
663 |
END IF |
|
|
664 |
END |
|
|
665 |
DOUBLE PRECISION FUNCTION MVBVN( LOWER, UPPER, INFIN, CORREL ) |
|
|
666 |
* |
|
|
667 |
* A function for computing bivariate normal probabilities. |
|
|
668 |
* |
|
|
669 |
* Parameters |
|
|
670 |
* |
|
|
671 |
* LOWER REAL, array of lower integration limits. |
|
|
672 |
* UPPER REAL, array of upper integration limits. |
|
|
673 |
* INFIN INTEGER, array of integration limits flags: |
|
|
674 |
* if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)]; |
|
|
675 |
* if INFIN(I) = 1, Ith limits are [LOWER(I), infinity); |
|
|
676 |
* if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)]. |
|
|
677 |
* CORREL REAL, correlation coefficient. |
|
|
678 |
* |
|
|
679 |
DOUBLE PRECISION LOWER(*), UPPER(*), CORREL, MVBVU |
|
|
680 |
INTEGER INFIN(*) |
|
|
681 |
IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 2 ) THEN |
|
|
682 |
MVBVN = MVBVU ( LOWER(1), LOWER(2), CORREL ) |
|
|
683 |
+ - MVBVU ( UPPER(1), LOWER(2), CORREL ) |
|
|
684 |
+ - MVBVU ( LOWER(1), UPPER(2), CORREL ) |
|
|
685 |
+ + MVBVU ( UPPER(1), UPPER(2), CORREL ) |
|
|
686 |
ELSE IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 1 ) THEN |
|
|
687 |
MVBVN = MVBVU ( LOWER(1), LOWER(2), CORREL ) |
|
|
688 |
+ - MVBVU ( UPPER(1), LOWER(2), CORREL ) |
|
|
689 |
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 2 ) THEN |
|
|
690 |
MVBVN = MVBVU ( LOWER(1), LOWER(2), CORREL ) |
|
|
691 |
+ - MVBVU ( LOWER(1), UPPER(2), CORREL ) |
|
|
692 |
ELSE IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 0 ) THEN |
|
|
693 |
MVBVN = MVBVU ( -UPPER(1), -UPPER(2), CORREL ) |
|
|
694 |
+ - MVBVU ( -LOWER(1), -UPPER(2), CORREL ) |
|
|
695 |
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 2 ) THEN |
|
|
696 |
MVBVN = MVBVU ( -UPPER(1), -UPPER(2), CORREL ) |
|
|
697 |
+ - MVBVU ( -UPPER(1), -LOWER(2), CORREL ) |
|
|
698 |
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 0 ) THEN |
|
|
699 |
MVBVN = MVBVU ( LOWER(1), -UPPER(2), -CORREL ) |
|
|
700 |
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 1 ) THEN |
|
|
701 |
MVBVN = MVBVU ( -UPPER(1), LOWER(2), -CORREL ) |
|
|
702 |
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 1 ) THEN |
|
|
703 |
MVBVN = MVBVU ( LOWER(1), LOWER(2), CORREL ) |
|
|
704 |
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 0 ) THEN |
|
|
705 |
MVBVN = MVBVU ( -UPPER(1), -UPPER(2), CORREL ) |
|
|
706 |
ELSE |
|
|
707 |
MVBVN = 1 |
|
|
708 |
END IF |
|
|
709 |
END |
|
|
710 |
DOUBLE PRECISION FUNCTION MVBVU( SH, SK, R ) |
|
|
711 |
* |
|
|
712 |
* A function for computing bivariate normal probabilities; |
|
|
713 |
* developed using |
|
|
714 |
* Drezner, Z. and Wesolowsky, G. O. (1989), |
|
|
715 |
* On the Computation of the Bivariate Normal Integral, |
|
|
716 |
* J. Stat. Comput. Simul.. 35 pp. 101-107. |
|
|
717 |
* with extensive modications for double precisions by |
|
|
718 |
* Alan Genz and Yihong Ge |
|
|
719 |
* Department of Mathematics |
|
|
720 |
* Washington State University |
|
|
721 |
* Pullman, WA 99164-3113 |
|
|
722 |
* Email : alangenz@wsu.edu |
|
|
723 |
* |
|
|
724 |
* BVN - calculate the probability that X is larger than SH and Y is |
|
|
725 |
* larger than SK. |
|
|
726 |
* |
|
|
727 |
* Parameters |
|
|
728 |
* |
|
|
729 |
* SH REAL, integration limit |
|
|
730 |
* SK REAL, integration limit |
|
|
731 |
* R REAL, correlation coefficient |
|
|
732 |
* LG INTEGER, number of Gauss Rule Points and Weights |
|
|
733 |
* |
|
|
734 |
DOUBLE PRECISION BVN, SH, SK, R, ZERO, TWOPI |
|
|
735 |
INTEGER I, LG, NG |
|
|
736 |
PARAMETER ( ZERO = 0, TWOPI = 6.283185307179586D0 ) |
|
|
737 |
DOUBLE PRECISION X(10,3), W(10,3), AS, A, B, C, D, RS, XS |
|
|
738 |
DOUBLE PRECISION MVPHI, SN, ASR, H, K, BS, HS, HK |
|
|
739 |
SAVE X, W |
|
|
740 |
* Gauss Legendre Points and Weights, N = 6 |
|
|
741 |
DATA ( W(I,1), X(I,1), I = 1, 3 ) / |
|
|
742 |
* 0.1713244923791705D+00,-0.9324695142031522D+00, |
|
|
743 |
* 0.3607615730481384D+00,-0.6612093864662647D+00, |
|
|
744 |
* 0.4679139345726904D+00,-0.2386191860831970D+00/ |
|
|
745 |
* Gauss Legendre Points and Weights, N = 12 |
|
|
746 |
DATA ( W(I,2), X(I,2), I = 1, 6 ) / |
|
|
747 |
* 0.4717533638651177D-01,-0.9815606342467191D+00, |
|
|
748 |
* 0.1069393259953183D+00,-0.9041172563704750D+00, |
|
|
749 |
* 0.1600783285433464D+00,-0.7699026741943050D+00, |
|
|
750 |
* 0.2031674267230659D+00,-0.5873179542866171D+00, |
|
|
751 |
* 0.2334925365383547D+00,-0.3678314989981802D+00, |
|
|
752 |
* 0.2491470458134029D+00,-0.1252334085114692D+00/ |
|
|
753 |
* Gauss Legendre Points and Weights, N = 20 |
|
|
754 |
DATA ( W(I,3), X(I,3), I = 1, 10 ) / |
|
|
755 |
* 0.1761400713915212D-01,-0.9931285991850949D+00, |
|
|
756 |
* 0.4060142980038694D-01,-0.9639719272779138D+00, |
|
|
757 |
* 0.6267204833410906D-01,-0.9122344282513259D+00, |
|
|
758 |
* 0.8327674157670475D-01,-0.8391169718222188D+00, |
|
|
759 |
* 0.1019301198172404D+00,-0.7463319064601508D+00, |
|
|
760 |
* 0.1181945319615184D+00,-0.6360536807265150D+00, |
|
|
761 |
* 0.1316886384491766D+00,-0.5108670019508271D+00, |
|
|
762 |
* 0.1420961093183821D+00,-0.3737060887154196D+00, |
|
|
763 |
* 0.1491729864726037D+00,-0.2277858511416451D+00, |
|
|
764 |
* 0.1527533871307259D+00,-0.7652652113349733D-01/ |
|
|
765 |
IF ( ABS(R) .LT. 0.3 ) THEN |
|
|
766 |
NG = 1 |
|
|
767 |
LG = 3 |
|
|
768 |
ELSE IF ( ABS(R) .LT. 0.75 ) THEN |
|
|
769 |
NG = 2 |
|
|
770 |
LG = 6 |
|
|
771 |
ELSE |
|
|
772 |
NG = 3 |
|
|
773 |
LG = 10 |
|
|
774 |
ENDIF |
|
|
775 |
H = SH |
|
|
776 |
K = SK |
|
|
777 |
HK = H*K |
|
|
778 |
BVN = 0 |
|
|
779 |
IF ( ABS(R) .LT. 0.925 ) THEN |
|
|
780 |
HS = ( H*H + K*K )/2 |
|
|
781 |
ASR = ASIN(R) |
|
|
782 |
DO I = 1, LG |
|
|
783 |
SN = SIN(ASR*( X(I,NG)+1 )/2) |
|
|
784 |
BVN = BVN + W(I,NG)*EXP( ( SN*HK - HS )/( 1 - SN*SN ) ) |
|
|
785 |
SN = SIN(ASR*(-X(I,NG)+1 )/2) |
|
|
786 |
BVN = BVN + W(I,NG)*EXP( ( SN*HK - HS )/( 1 - SN*SN ) ) |
|
|
787 |
END DO |
|
|
788 |
BVN = BVN*ASR/(2*TWOPI) + MVPHI(-H)*MVPHI(-K) |
|
|
789 |
ELSE |
|
|
790 |
IF ( R .LT. 0 ) THEN |
|
|
791 |
K = -K |
|
|
792 |
HK = -HK |
|
|
793 |
ENDIF |
|
|
794 |
IF ( ABS(R) .LT. 1 ) THEN |
|
|
795 |
AS = ( 1 - R )*( 1 + R ) |
|
|
796 |
A = SQRT(AS) |
|
|
797 |
BS = ( H - K )**2 |
|
|
798 |
C = ( 4 - HK )/8 |
|
|
799 |
D = ( 12 - HK )/16 |
|
|
800 |
BVN = A*EXP( -(BS/AS + HK)/2 ) |
|
|
801 |
+ *( 1 - C*(BS - AS)*(1 - D*BS/5)/3 + C*D*AS*AS/5 ) |
|
|
802 |
IF ( HK .GT. -160 ) THEN |
|
|
803 |
B = SQRT(BS) |
|
|
804 |
BVN = BVN - EXP(-HK/2)*SQRT(TWOPI)*MVPHI(-B/A)*B |
|
|
805 |
+ *( 1 - C*BS*( 1 - D*BS/5 )/3 ) |
|
|
806 |
ENDIF |
|
|
807 |
A = A/2 |
|
|
808 |
DO I = 1, LG |
|
|
809 |
XS = ( A*(X(I,NG)+1) )**2 |
|
|
810 |
RS = SQRT( 1 - XS ) |
|
|
811 |
BVN = BVN + A*W(I,NG)* |
|
|
812 |
+ ( EXP( -BS/(2*XS) - HK/(1+RS) )/RS |
|
|
813 |
+ - EXP( -(BS/XS+HK)/2 )*( 1 + C*XS*( 1 + D*XS ) ) ) |
|
|
814 |
XS = AS*(-X(I,NG)+1)**2/4 |
|
|
815 |
RS = SQRT( 1 - XS ) |
|
|
816 |
BVN = BVN + A*W(I,NG)*EXP( -(BS/XS + HK)/2 ) |
|
|
817 |
+ *( EXP( -HK*XS/(2*(1+RS)**2) )/RS |
|
|
818 |
+ - ( 1 + C*XS*( 1 + D*XS ) ) ) |
|
|
819 |
END DO |
|
|
820 |
BVN = -BVN/TWOPI |
|
|
821 |
ENDIF |
|
|
822 |
IF ( R .GT. 0 ) THEN |
|
|
823 |
BVN = BVN + MVPHI( -MAX( H, K ) ) |
|
|
824 |
ELSE |
|
|
825 |
BVN = -BVN |
|
|
826 |
IF ( K .GT. H ) THEN |
|
|
827 |
IF ( H .LT. 0 ) THEN |
|
|
828 |
BVN = BVN + MVPHI(K) - MVPHI(H) |
|
|
829 |
ELSE |
|
|
830 |
BVN = BVN + MVPHI(-H) - MVPHI(-K) |
|
|
831 |
ENDIF |
|
|
832 |
ENDIF |
|
|
833 |
ENDIF |
|
|
834 |
ENDIF |
|
|
835 |
MVBVU = BVN |
|
|
836 |
END |
|
|
837 |
* |
|
|
838 |
DOUBLE PRECISION FUNCTION MVSTDT( NU, T ) |
|
|
839 |
* |
|
|
840 |
* Student t Distribution Function |
|
|
841 |
* |
|
|
842 |
* T |
|
|
843 |
* TSTDNT = C I ( 1 + y*y/NU )**( -(NU+1)/2 ) dy |
|
|
844 |
* NU -INF |
|
|
845 |
* |
|
|
846 |
INTEGER NU, J |
|
|
847 |
DOUBLE PRECISION MVPHI, T, CSTHE, SNTHE, POLYN, TT, TS, RN, PI |
|
|
848 |
PARAMETER ( PI = 3.141592653589793D0 ) |
|
|
849 |
IF ( NU .LT. 1 ) THEN |
|
|
850 |
MVSTDT = MVPHI( T ) |
|
|
851 |
ELSE IF ( NU .EQ. 1 ) THEN |
|
|
852 |
MVSTDT = ( 1 + 2*ATAN( T )/PI )/2 |
|
|
853 |
ELSE IF ( NU .EQ. 2) THEN |
|
|
854 |
MVSTDT = ( 1 + T/SQRT( 2 + T*T ))/2 |
|
|
855 |
ELSE |
|
|
856 |
TT = T*T |
|
|
857 |
CSTHE = NU/( NU + TT ) |
|
|
858 |
POLYN = 1 |
|
|
859 |
DO J = NU - 2, 2, -2 |
|
|
860 |
POLYN = 1 + ( J - 1 )*CSTHE*POLYN/J |
|
|
861 |
END DO |
|
|
862 |
IF ( MOD( NU, 2 ) .EQ. 1 ) THEN |
|
|
863 |
RN = NU |
|
|
864 |
TS = T/SQRT(RN) |
|
|
865 |
MVSTDT = ( 1 + 2*( ATAN( TS ) + TS*CSTHE*POLYN )/PI )/2 |
|
|
866 |
ELSE |
|
|
867 |
SNTHE = T/SQRT( NU + TT ) |
|
|
868 |
MVSTDT = ( 1 + SNTHE*POLYN )/2 |
|
|
869 |
END IF |
|
|
870 |
IF ( MVSTDT .LT. 0 ) MVSTDT = 0 |
|
|
871 |
ENDIF |
|
|
872 |
END |
|
|
873 |
* |
|
|
874 |
DOUBLE PRECISION FUNCTION MVBVT( NU, LOWER, UPPER, INFIN, CORREL ) |
|
|
875 |
* |
|
|
876 |
* A function for computing bivariate normal and t probabilities. |
|
|
877 |
* |
|
|
878 |
* Parameters |
|
|
879 |
* |
|
|
880 |
* NU INTEGER degrees of freedom parameter; NU < 1 gives normal case. |
|
|
881 |
* LOWER REAL, array of lower integration limits. |
|
|
882 |
* UPPER REAL, array of upper integration limits. |
|
|
883 |
* INFIN INTEGER, array of integration limits flags: |
|
|
884 |
* if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)]; |
|
|
885 |
* if INFIN(I) = 1, Ith limits are [LOWER(I), infinity); |
|
|
886 |
* if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)]. |
|
|
887 |
* CORREL REAL, correlation coefficient. |
|
|
888 |
* |
|
|
889 |
DOUBLE PRECISION LOWER(*), UPPER(*), CORREL, MVBVN, MVBVTL |
|
|
890 |
INTEGER NU, INFIN(*) |
|
|
891 |
IF ( NU .LT. 1 ) THEN |
|
|
892 |
MVBVT = MVBVN ( LOWER, UPPER, INFIN, CORREL ) |
|
|
893 |
ELSE |
|
|
894 |
IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 2 ) THEN |
|
|
895 |
MVBVT = MVBVTL ( NU, UPPER(1), UPPER(2), CORREL ) |
|
|
896 |
+ - MVBVTL ( NU, UPPER(1), LOWER(2), CORREL ) |
|
|
897 |
+ - MVBVTL ( NU, LOWER(1), UPPER(2), CORREL ) |
|
|
898 |
+ + MVBVTL ( NU, LOWER(1), LOWER(2), CORREL ) |
|
|
899 |
ELSE IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 1 ) THEN |
|
|
900 |
MVBVT = MVBVTL ( NU, -LOWER(1), -LOWER(2), CORREL ) |
|
|
901 |
+ - MVBVTL ( NU, -UPPER(1), -LOWER(2), CORREL ) |
|
|
902 |
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 2 ) THEN |
|
|
903 |
MVBVT = MVBVTL ( NU, -LOWER(1), -LOWER(2), CORREL ) |
|
|
904 |
+ - MVBVTL ( NU, -LOWER(1), -UPPER(2), CORREL ) |
|
|
905 |
ELSE IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 0 ) THEN |
|
|
906 |
MVBVT = MVBVTL ( NU, UPPER(1), UPPER(2), CORREL ) |
|
|
907 |
+ - MVBVTL ( NU, LOWER(1), UPPER(2), CORREL ) |
|
|
908 |
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 2 ) THEN |
|
|
909 |
MVBVT = MVBVTL ( NU, UPPER(1), UPPER(2), CORREL ) |
|
|
910 |
+ - MVBVTL ( NU, UPPER(1), LOWER(2), CORREL ) |
|
|
911 |
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 0 ) THEN |
|
|
912 |
MVBVT = MVBVTL ( NU, -LOWER(1), UPPER(2), -CORREL ) |
|
|
913 |
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 1 ) THEN |
|
|
914 |
MVBVT = MVBVTL ( NU, UPPER(1), -LOWER(2), -CORREL ) |
|
|
915 |
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 1 ) THEN |
|
|
916 |
MVBVT = MVBVTL ( NU, -LOWER(1), -LOWER(2), CORREL ) |
|
|
917 |
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 0 ) THEN |
|
|
918 |
MVBVT = MVBVTL ( NU, UPPER(1), UPPER(2), CORREL ) |
|
|
919 |
ELSE |
|
|
920 |
MVBVT = 1 |
|
|
921 |
END IF |
|
|
922 |
END IF |
|
|
923 |
END |
|
|
924 |
* |
|
|
925 |
DOUBLE PRECISION FUNCTION MVBVTC( NU, L, U, INFIN, RHO ) |
|
|
926 |
* |
|
|
927 |
* A function for computing complementary bivariate normal and t |
|
|
928 |
* probabilities. |
|
|
929 |
* |
|
|
930 |
* Parameters |
|
|
931 |
* |
|
|
932 |
* NU INTEGER degrees of freedom parameter. |
|
|
933 |
* L REAL, array of lower integration limits. |
|
|
934 |
* U REAL, array of upper integration limits. |
|
|
935 |
* INFIN INTEGER, array of integration limits flags: |
|
|
936 |
* if INFIN(1) INFIN(2), then MVBVTC computes |
|
|
937 |
* 0 0 P( X>U(1), Y>U(2) ) |
|
|
938 |
* 1 0 P( X<L(1), Y>U(2) ) |
|
|
939 |
* 0 1 P( X>U(1), Y<L(2) ) |
|
|
940 |
* 1 1 P( X<L(1), Y<L(2) ) |
|
|
941 |
* 2 0 P( X>U(1), Y>U(2) ) + P( X<L(1), Y>U(2) ) |
|
|
942 |
* 2 1 P( X>U(1), Y<L(2) ) + P( X<L(1), Y<L(2) ) |
|
|
943 |
* 0 2 P( X>U(1), Y>U(2) ) + P( X>U(1), Y<L(2) ) |
|
|
944 |
* 1 2 P( X<L(1), Y>U(2) ) + P( X<L(1), Y<L(2) ) |
|
|
945 |
* 2 2 P( X>U(1), Y<L(2) ) + P( X<L(1), Y<L(2) ) |
|
|
946 |
* + P( X>U(1), Y>U(2) ) + P( X<L(1), Y>U(2) ) |
|
|
947 |
* |
|
|
948 |
* RHO REAL, correlation coefficient. |
|
|
949 |
* |
|
|
950 |
DOUBLE PRECISION L(*), U(*), LW(2), UP(2), B, RHO, MVBVT |
|
|
951 |
INTEGER I, NU, INFIN(*), INF(2) |
|
|
952 |
* |
|
|
953 |
DO I = 1, 2 |
|
|
954 |
IF ( MOD( INFIN(I), 2 ) .EQ. 0 ) THEN |
|
|
955 |
INF(I) = 1 |
|
|
956 |
LW(I) = U(I) |
|
|
957 |
ELSE |
|
|
958 |
INF(I) = 0 |
|
|
959 |
UP(I) = L(I) |
|
|
960 |
END IF |
|
|
961 |
END DO |
|
|
962 |
B = MVBVT( NU, LW, UP, INF, RHO ) |
|
|
963 |
DO I = 1, 2 |
|
|
964 |
IF ( INFIN(I) .EQ. 2 ) THEN |
|
|
965 |
INF(I) = 0 |
|
|
966 |
UP(I) = L(I) |
|
|
967 |
B = B + MVBVT( NU, LW, UP, INF, RHO ) |
|
|
968 |
END IF |
|
|
969 |
END DO |
|
|
970 |
IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 2 ) THEN |
|
|
971 |
INF(1) = 1 |
|
|
972 |
LW(1) = U(1) |
|
|
973 |
B = B + MVBVT( NU, LW, UP, INF, RHO ) |
|
|
974 |
END IF |
|
|
975 |
MVBVTC = B |
|
|
976 |
END |
|
|
977 |
* |
|
|
978 |
double precision function mvbvtl( nu, dh, dk, r ) |
|
|
979 |
* |
|
|
980 |
* a function for computing bivariate t probabilities. |
|
|
981 |
* |
|
|
982 |
* Alan Genz |
|
|
983 |
* Department of Mathematics |
|
|
984 |
* Washington State University |
|
|
985 |
* Pullman, Wa 99164-3113 |
|
|
986 |
* Email : alangenz@wsu.edu |
|
|
987 |
* |
|
|
988 |
* this function is based on the method described by |
|
|
989 |
* Dunnett, C.W. and M. Sobel, (1954), |
|
|
990 |
* A bivariate generalization of Student's t-distribution |
|
|
991 |
* with tables for certain special cases, |
|
|
992 |
* Biometrika 41, pp. 153-169. |
|
|
993 |
* |
|
|
994 |
* mvbvtl - calculate the probability that x < dh and y < dk. |
|
|
995 |
* |
|
|
996 |
* parameters |
|
|
997 |
* |
|
|
998 |
* nu number of degrees of freedom |
|
|
999 |
* dh 1st lower integration limit |
|
|
1000 |
* dk 2nd lower integration limit |
|
|
1001 |
* r correlation coefficient |
|
|
1002 |
* |
|
|
1003 |
integer nu, j, hs, ks |
|
|
1004 |
double precision dh, dk, r |
|
|
1005 |
double precision tpi, pi, ors, hrk, krh, bvt, snu |
|
|
1006 |
double precision gmph, gmpk, xnkh, xnhk, qhrk, hkn, hpk, hkrn |
|
|
1007 |
double precision btnckh, btnchk, btpdkh, btpdhk, one |
|
|
1008 |
parameter ( pi = 3.14159265358979323844d0, tpi = 2*pi, one = 1 ) |
|
|
1009 |
snu = sqrt( dble(nu) ) |
|
|
1010 |
ors = 1 - r*r |
|
|
1011 |
hrk = dh - r*dk |
|
|
1012 |
krh = dk - r*dh |
|
|
1013 |
if ( abs(hrk) + ors .gt. 0 ) then |
|
|
1014 |
xnhk = hrk**2/( hrk**2 + ors*( nu + dk**2 ) ) |
|
|
1015 |
xnkh = krh**2/( krh**2 + ors*( nu + dh**2 ) ) |
|
|
1016 |
else |
|
|
1017 |
xnhk = 0 |
|
|
1018 |
xnkh = 0 |
|
|
1019 |
end if |
|
|
1020 |
hs = sign( one, dh - r*dk ) |
|
|
1021 |
ks = sign( one, dk - r*dh ) |
|
|
1022 |
if ( mod( nu, 2 ) .eq. 0 ) then |
|
|
1023 |
bvt = atan2( sqrt(ors), -r )/tpi |
|
|
1024 |
gmph = dh/sqrt( 16*( nu + dh**2 ) ) |
|
|
1025 |
gmpk = dk/sqrt( 16*( nu + dk**2 ) ) |
|
|
1026 |
btnckh = 2*atan2( sqrt( xnkh ), sqrt( 1 - xnkh ) )/pi |
|
|
1027 |
btpdkh = 2*sqrt( xnkh*( 1 - xnkh ) )/pi |
|
|
1028 |
btnchk = 2*atan2( sqrt( xnhk ), sqrt( 1 - xnhk ) )/pi |
|
|
1029 |
btpdhk = 2*sqrt( xnhk*( 1 - xnhk ) )/pi |
|
|
1030 |
do j = 1, nu/2 |
|
|
1031 |
bvt = bvt + gmph*( 1 + ks*btnckh ) |
|
|
1032 |
bvt = bvt + gmpk*( 1 + hs*btnchk ) |
|
|
1033 |
btnckh = btnckh + btpdkh |
|
|
1034 |
btpdkh = 2*j*btpdkh*( 1 - xnkh )/( 2*j + 1 ) |
|
|
1035 |
btnchk = btnchk + btpdhk |
|
|
1036 |
btpdhk = 2*j*btpdhk*( 1 - xnhk )/( 2*j + 1 ) |
|
|
1037 |
gmph = gmph*( 2*j - 1 )/( 2*j*( 1 + dh**2/nu ) ) |
|
|
1038 |
gmpk = gmpk*( 2*j - 1 )/( 2*j*( 1 + dk**2/nu ) ) |
|
|
1039 |
end do |
|
|
1040 |
else |
|
|
1041 |
qhrk = sqrt( dh**2 + dk**2 - 2*r*dh*dk + nu*ors ) |
|
|
1042 |
hkrn = dh*dk + r*nu |
|
|
1043 |
hkn = dh*dk - nu |
|
|
1044 |
hpk = dh + dk |
|
|
1045 |
bvt = atan2(-snu*(hkn*qhrk+hpk*hkrn),hkn*hkrn-nu*hpk*qhrk)/tpi |
|
|
1046 |
if ( bvt .lt. -1d-15 ) bvt = bvt + 1 |
|
|
1047 |
gmph = dh/( tpi*snu*( 1 + dh**2/nu ) ) |
|
|
1048 |
gmpk = dk/( tpi*snu*( 1 + dk**2/nu ) ) |
|
|
1049 |
btnckh = sqrt( xnkh ) |
|
|
1050 |
btpdkh = btnckh |
|
|
1051 |
btnchk = sqrt( xnhk ) |
|
|
1052 |
btpdhk = btnchk |
|
|
1053 |
do j = 1, ( nu - 1 )/2 |
|
|
1054 |
bvt = bvt + gmph*( 1 + ks*btnckh ) |
|
|
1055 |
bvt = bvt + gmpk*( 1 + hs*btnchk ) |
|
|
1056 |
btpdkh = ( 2*j - 1 )*btpdkh*( 1 - xnkh )/( 2*j ) |
|
|
1057 |
btnckh = btnckh + btpdkh |
|
|
1058 |
btpdhk = ( 2*j - 1 )*btpdhk*( 1 - xnhk )/( 2*j ) |
|
|
1059 |
btnchk = btnchk + btpdhk |
|
|
1060 |
gmph = 2*j*gmph/( ( 2*j + 1 )*( 1 + dh**2/nu ) ) |
|
|
1061 |
gmpk = 2*j*gmpk/( ( 2*j + 1 )*( 1 + dk**2/nu ) ) |
|
|
1062 |
end do |
|
|
1063 |
end if |
|
|
1064 |
mvbvtl = bvt |
|
|
1065 |
* |
|
|
1066 |
* end mvbvtl |
|
|
1067 |
* |
|
|
1068 |
end |
|
|
1069 |
* |
|
|
1070 |
DOUBLE PRECISION FUNCTION MVCHNV( N, P ) |
|
|
1071 |
* |
|
|
1072 |
* MVCHNV |
|
|
1073 |
* P = 1 - K I exp(-t*t/2) t**(N-1) dt, for N >= 1. |
|
|
1074 |
* N 0 |
|
|
1075 |
* |
|
|
1076 |
INTEGER I, N, NO |
|
|
1077 |
DOUBLE PRECISION P, TWO, R, RO, LRP, LKN, MVPHNV, MVCHNC |
|
|
1078 |
PARAMETER ( LRP = -.22579135264472743235D0, TWO = 2 ) |
|
|
1079 |
* LRP = LOG( SQRT( 2/PI ) ) |
|
|
1080 |
SAVE NO, LKN |
|
|
1081 |
DATA NO / 0 / |
|
|
1082 |
IF ( N .LE. 1 ) THEN |
|
|
1083 |
R = -MVPHNV( P/2 ) |
|
|
1084 |
ELSE IF ( P .LT. 1 ) THEN |
|
|
1085 |
IF ( N .EQ. 2 ) THEN |
|
|
1086 |
R = SQRT( -2*LOG(P) ) |
|
|
1087 |
ELSE |
|
|
1088 |
IF ( N .NE. NO ) THEN |
|
|
1089 |
NO = N |
|
|
1090 |
LKN = 0 |
|
|
1091 |
DO I = N-2, 2, -2 |
|
|
1092 |
LKN = LKN - LOG( DBLE(I) ) |
|
|
1093 |
END DO |
|
|
1094 |
IF ( MOD( N, 2 ) .EQ. 1 ) LKN = LKN + LRP |
|
|
1095 |
END IF |
|
|
1096 |
IF ( N .GE. -5*LOG(1-P)/4 ) THEN |
|
|
1097 |
R = TWO/( 9*N ) |
|
|
1098 |
R = N*( -MVPHNV(P)*SQRT(R) + 1 - R )**3 |
|
|
1099 |
IF ( R .GT. 2*N+6 ) THEN |
|
|
1100 |
R = 2*( LKN - LOG(P) ) + ( N - 2 )*LOG(R) |
|
|
1101 |
END IF |
|
|
1102 |
ELSE |
|
|
1103 |
R = EXP( ( LOG( (1-P)*N ) - LKN )*TWO/N ) |
|
|
1104 |
END IF |
|
|
1105 |
R = SQRT(R) |
|
|
1106 |
RO = R |
|
|
1107 |
R = MVCHNC( LKN, N, P, R ) |
|
|
1108 |
IF ( ABS( R - RO ) .GT. 1D-6 ) THEN |
|
|
1109 |
RO = R |
|
|
1110 |
R = MVCHNC( LKN, N, P, R ) |
|
|
1111 |
IF ( ABS( R - RO ) .GT. 1D-6 ) R = MVCHNC( LKN, N, P, R ) |
|
|
1112 |
END IF |
|
|
1113 |
END IF |
|
|
1114 |
ELSE |
|
|
1115 |
R = 0 |
|
|
1116 |
END IF |
|
|
1117 |
MVCHNV = R |
|
|
1118 |
END |
|
|
1119 |
* |
|
|
1120 |
DOUBLE PRECISION FUNCTION MVCHNC( LKN, N, P, R ) |
|
|
1121 |
* |
|
|
1122 |
* Third order Schroeder correction to R for MVCHNV |
|
|
1123 |
* |
|
|
1124 |
INTEGER I, N |
|
|
1125 |
DOUBLE PRECISION P, R, LKN, DF, RR, RN, CHI, MVPHI |
|
|
1126 |
DOUBLE PRECISION LRP, TWO, AL, DL, AI, BI, CI, DI, EPS |
|
|
1127 |
PARAMETER ( LRP = -.22579135264472743235D0, TWO = 2, EPS = 1D-14 ) |
|
|
1128 |
* LRP = LOG( SQRT( 2/PI ) ) |
|
|
1129 |
RR = R*R |
|
|
1130 |
IF ( N .LT. 2 ) THEN |
|
|
1131 |
CHI = 2*MVPHI(-R) |
|
|
1132 |
ELSE IF ( N .LT. 100 ) THEN |
|
|
1133 |
* |
|
|
1134 |
* Use standard Chi series |
|
|
1135 |
* |
|
|
1136 |
RN = 1 |
|
|
1137 |
DO I = N - 2, 2, -2 |
|
|
1138 |
RN = 1 + RR*RN/I |
|
|
1139 |
END DO |
|
|
1140 |
RR = RR/2 |
|
|
1141 |
IF ( MOD( N, 2 ) .EQ. 0 ) THEN |
|
|
1142 |
CHI = EXP( LOG( RN ) - RR ) |
|
|
1143 |
ELSE |
|
|
1144 |
CHI = EXP( LRP + LOG( R*RN ) - RR ) + 2*MVPHI(-R) |
|
|
1145 |
ENDIF |
|
|
1146 |
ELSE |
|
|
1147 |
RR = RR/2 |
|
|
1148 |
AL = N/TWO |
|
|
1149 |
CHI = EXP( -RR + AL*LOG(RR) + LKN + LOG(TWO)*( N - 2 )/2 ) |
|
|
1150 |
IF ( RR .LT. AL + 1 ) THEN |
|
|
1151 |
* |
|
|
1152 |
* Use Incomplete Gamma series |
|
|
1153 |
* |
|
|
1154 |
DL = CHI |
|
|
1155 |
DO I = 1, 1000 |
|
|
1156 |
DL = DL*RR/( AL + I ) |
|
|
1157 |
CHI = CHI + DL |
|
|
1158 |
IF ( ABS( DL*RR/( AL + I + 1 - RR ) ) .LT. EPS ) GO TO 10 |
|
|
1159 |
END DO |
|
|
1160 |
10 CHI = 1 - CHI/AL |
|
|
1161 |
ELSE |
|
|
1162 |
* |
|
|
1163 |
* Use Incomplete Gamma continued fraction |
|
|
1164 |
* |
|
|
1165 |
BI = RR + 1 - AL |
|
|
1166 |
CI = 1/EPS |
|
|
1167 |
DI = BI |
|
|
1168 |
CHI = CHI/BI |
|
|
1169 |
DO I = 1, 250 |
|
|
1170 |
AI = I*( AL - I ) |
|
|
1171 |
BI = BI + 2 |
|
|
1172 |
CI = BI + AI/CI |
|
|
1173 |
IF ( CI .EQ. 0 ) CI = EPS |
|
|
1174 |
DI = BI + AI/DI |
|
|
1175 |
IF ( DI .EQ. 0 ) DI = EPS |
|
|
1176 |
DL = CI/DI |
|
|
1177 |
CHI = CHI*DL |
|
|
1178 |
IF ( ABS( DL - 1 ) .LT. EPS ) GO TO 20 |
|
|
1179 |
END DO |
|
|
1180 |
END IF |
|
|
1181 |
END IF |
|
|
1182 |
20 DF = ( P - CHI )/EXP( LKN + ( N - 1 )*LOG(R) - RR ) |
|
|
1183 |
MVCHNC = R - DF*( 1 - DF*( R - ( N - 1 )/R )/2 ) |
|
|
1184 |
END |
|
|
1185 |
* |
|
|
1186 |
SUBROUTINE MVKBRV( NDIM, MINVLS, MAXVLS, NF, FUNSUB, |
|
|
1187 |
& ABSEPS, RELEPS, ABSERR, FINEST, INFORM ) |
|
|
1188 |
* |
|
|
1189 |
* Automatic Multidimensional Integration Subroutine |
|
|
1190 |
* |
|
|
1191 |
* AUTHOR: Alan Genz |
|
|
1192 |
* Department of Mathematics |
|
|
1193 |
* Washington State University |
|
|
1194 |
* Pulman, WA 99164-3113 |
|
|
1195 |
* Email: AlanGenz@wsu.edu |
|
|
1196 |
* |
|
|
1197 |
* Last Change: 12/15/00 |
|
|
1198 |
* |
|
|
1199 |
* MVKBRV computes an approximation to the integral |
|
|
1200 |
* |
|
|
1201 |
* 1 1 1 |
|
|
1202 |
* I I ... I F(X) dx(NDIM)...dx(2)dx(1) |
|
|
1203 |
* 0 0 0 |
|
|
1204 |
* |
|
|
1205 |
* F(X) is a real NF-vector of integrands. |
|
|
1206 |
* |
|
|
1207 |
* It uses randomized Korobov rules. The primary references are |
|
|
1208 |
* "Randomization of Number Theoretic Methods for Multiple Integration" |
|
|
1209 |
* R. Cranley and T.N.L. Patterson, SIAM J Numer Anal, 13, pp. 904-14, |
|
|
1210 |
* and |
|
|
1211 |
* "Optimal Parameters for Multidimensional Integration", |
|
|
1212 |
* P. Keast, SIAM J Numer Anal, 10, pp.831-838. |
|
|
1213 |
* If there are more than 100 variables, the remaining variables are |
|
|
1214 |
* integrated using the rules described in the reference |
|
|
1215 |
* "On a Number-Theoretical Integration Method" |
|
|
1216 |
* H. Niederreiter, Aequationes Mathematicae, 8(1972), pp. 304-11. |
|
|
1217 |
* |
|
|
1218 |
*************** Parameters ******************************************** |
|
|
1219 |
****** Input parameters |
|
|
1220 |
* NDIM Number of variables, must exceed 1, but not exceed 100 |
|
|
1221 |
* MINVLS Integer minimum number of function evaluations allowed. |
|
|
1222 |
* MINVLS must not exceed MAXVLS. If MINVLS < 0 then the |
|
|
1223 |
* routine assumes a previous call has been made with |
|
|
1224 |
* the same integrands and continues that calculation. |
|
|
1225 |
* MAXVLS Integer maximum number of function evaluations allowed. |
|
|
1226 |
* NF Number of integrands, must exceed 1, but not exceed 5000 |
|
|
1227 |
* FUNSUB EXTERNALly declared user defined integrand subroutine. |
|
|
1228 |
* It must have parameters ( NDIM, Z, NF, FUNVLS ), where |
|
|
1229 |
* Z is a real NDIM-vector and FUNVLS is a real NF-vector. |
|
|
1230 |
* |
|
|
1231 |
* ABSEPS Required absolute accuracy. |
|
|
1232 |
* RELEPS Required relative accuracy. |
|
|
1233 |
****** Output parameters |
|
|
1234 |
* MINVLS Actual number of function evaluations used. |
|
|
1235 |
* ABSERR Maximum norm of estimated absolute accuracy of FINEST. |
|
|
1236 |
* FINEST Estimated NF-vector of values of the integrals. |
|
|
1237 |
* INFORM INFORM = 0 for normal exit, when |
|
|
1238 |
* ABSERR <= MAX(ABSEPS, RELEPS*||FINEST||) |
|
|
1239 |
* and |
|
|
1240 |
* INTVLS <= MAXCLS. |
|
|
1241 |
* INFORM = 1 If MAXVLS was too small to obtain the required |
|
|
1242 |
* accuracy. In this case a value FINEST is returned with |
|
|
1243 |
* estimated absolute accuracy ABSERR. |
|
|
1244 |
************************************************************************ |
|
|
1245 |
EXTERNAL FUNSUB |
|
|
1246 |
DOUBLE PRECISION ABSEPS, RELEPS, FINEST(*), ABSERR, ONE |
|
|
1247 |
INTEGER NDIM, NF, MINVLS, MAXVLS, INFORM, NP, PLIM, KLIM, |
|
|
1248 |
& NLIM, FLIM, SAMPLS, I, K, INTVLS, MINSMP, KMX |
|
|
1249 |
PARAMETER ( PLIM = 28, NLIM = 1000, KLIM = 100, FLIM = 5000 ) |
|
|
1250 |
PARAMETER ( MINSMP = 8 ) |
|
|
1251 |
INTEGER P(PLIM), C(PLIM,KLIM-1), PR(NLIM) |
|
|
1252 |
DOUBLE PRECISION DIFINT, FINVAL(FLIM), VARSQR(FLIM), VAREST(FLIM), |
|
|
1253 |
& VARPRD, X(NLIM), R(NLIM), VK(NLIM), VALUES(FLIM), FS(FLIM) |
|
|
1254 |
PARAMETER ( ONE = 1 ) |
|
|
1255 |
SAVE P, C, SAMPLS, NP, VAREST |
|
|
1256 |
INFORM = 1 |
|
|
1257 |
INTVLS = 0 |
|
|
1258 |
VARPRD = 0 |
|
|
1259 |
IF ( MINVLS .GE. 0 ) THEN |
|
|
1260 |
DO K = 1, NF |
|
|
1261 |
FINEST(K) = 0 |
|
|
1262 |
VAREST(K) = 0 |
|
|
1263 |
END DO |
|
|
1264 |
SAMPLS = MINSMP |
|
|
1265 |
DO I = MIN( NDIM, 10 ), PLIM |
|
|
1266 |
NP = I |
|
|
1267 |
IF ( MINVLS .LT. 2*SAMPLS*P(I) ) GO TO 10 |
|
|
1268 |
END DO |
|
|
1269 |
SAMPLS = MAX( MINSMP, MINVLS/( 2*P(NP) ) ) |
|
|
1270 |
ENDIF |
|
|
1271 |
10 VK(1) = ONE/P(NP) |
|
|
1272 |
K = 1 |
|
|
1273 |
DO I = 2, NDIM |
|
|
1274 |
IF ( I .LE. KLIM ) THEN |
|
|
1275 |
K = MOD( C(NP, MIN(NDIM-1,KLIM-1))*DBLE(K), DBLE(P(NP)) ) |
|
|
1276 |
VK(I) = K*VK(1) |
|
|
1277 |
ELSE |
|
|
1278 |
VK(I) = INT( P(NP)*2**( DBLE(I-KLIM)/(NDIM-KLIM+1) ) ) |
|
|
1279 |
VK(I) = MOD( VK(I)/P(NP), ONE ) |
|
|
1280 |
END IF |
|
|
1281 |
END DO |
|
|
1282 |
DO K = 1, NF |
|
|
1283 |
FINVAL(K) = 0 |
|
|
1284 |
VARSQR(K) = 0 |
|
|
1285 |
END DO |
|
|
1286 |
* |
|
|
1287 |
DO I = 1, SAMPLS |
|
|
1288 |
CALL MVKRSV( NDIM,KLIM,VALUES, P(NP),VK, NF,FUNSUB, X,R,PR,FS ) |
|
|
1289 |
DO K = 1, NF |
|
|
1290 |
DIFINT = ( VALUES(K) - FINVAL(K) )/I |
|
|
1291 |
FINVAL(K) = FINVAL(K) + DIFINT |
|
|
1292 |
VARSQR(K) = ( I - 2 )*VARSQR(K)/I + DIFINT**2 |
|
|
1293 |
END DO |
|
|
1294 |
END DO |
|
|
1295 |
* |
|
|
1296 |
INTVLS = INTVLS + 2*SAMPLS*P(NP) |
|
|
1297 |
KMX = 1 |
|
|
1298 |
DO K = 1, NF |
|
|
1299 |
VARPRD = VAREST(K)*VARSQR(K) |
|
|
1300 |
FINEST(K) = FINEST(K) + ( FINVAL(K) - FINEST(K) )/( 1+VARPRD ) |
|
|
1301 |
IF ( VARSQR(K) .GT. 0 ) VAREST(K) = ( 1 + VARPRD )/VARSQR(K) |
|
|
1302 |
IF ( ABS(FINEST(K)) .GT. ABS(FINEST(KMX)) ) KMX = K |
|
|
1303 |
END DO |
|
|
1304 |
ABSERR = 7*SQRT( VARSQR(KMX)/( 1 + VARPRD ) )/2 |
|
|
1305 |
IF ( ABSERR .GT. MAX( ABSEPS, ABS(FINEST(KMX))*RELEPS ) ) THEN |
|
|
1306 |
IF ( NP .LT. PLIM ) THEN |
|
|
1307 |
NP = NP + 1 |
|
|
1308 |
ELSE |
|
|
1309 |
SAMPLS = MIN( 3*SAMPLS/2, ( MAXVLS - INTVLS )/( 2*P(NP) ) ) |
|
|
1310 |
SAMPLS = MAX( MINSMP, SAMPLS ) |
|
|
1311 |
ENDIF |
|
|
1312 |
IF ( INTVLS + 2*SAMPLS*P(NP) .LE. MAXVLS ) GO TO 10 |
|
|
1313 |
ELSE |
|
|
1314 |
INFORM = 0 |
|
|
1315 |
ENDIF |
|
|
1316 |
MINVLS = INTVLS |
|
|
1317 |
* |
|
|
1318 |
* Optimal Parameters for Lattice Rules |
|
|
1319 |
* |
|
|
1320 |
DATA P( 1),(C( 1,I),I = 1,99)/ 31, 12, 2*9, 13, 8*12, 3*3, 12, |
|
|
1321 |
& 2*7, 9*12, 3*3, 12, 2*7, 9*12, 3*3, 12, 2*7, 9*12, 3*3, 12, 2*7, |
|
|
1322 |
& 8*12, 7, 3*3, 3*7, 21*3/ |
|
|
1323 |
DATA P( 2),(C( 2,I),I = 1,99)/ 47, 13, 11, 17, 10, 6*15, |
|
|
1324 |
& 22, 2*15, 3*6, 2*15, 9, 13, 3*2, 13, 2*11, 10, 9*15, 3*6, 2*15, |
|
|
1325 |
& 9, 13, 3*2, 13, 2*11, 10, 9*15, 3*6, 2*15, 9, 13, 3*2, 13, 2*11, |
|
|
1326 |
& 2*10, 8*15, 6, 2, 3, 2, 3, 12*2/ |
|
|
1327 |
DATA P( 3),(C( 3,I),I = 1,99)/ 73, 27, 28, 10, 2*11, 20, |
|
|
1328 |
& 2*11, 28, 2*13, 28, 3*13, 16*14, 2*31, 3*5, 31, 13, 6*11, 7*13, |
|
|
1329 |
& 16*14, 2*31, 3*5, 11, 13, 7*11, 2*13, 11, 13, 4*5, 14, 13, 8*5/ |
|
|
1330 |
DATA P( 4),(C( 4,I),I = 1,99)/ 113, 35, 2*27, 36, 22, 2*29, |
|
|
1331 |
& 20, 45, 3*5, 16*21, 29, 10*17, 12*23, 21, 27, 3*3, 24, 2*27, |
|
|
1332 |
& 17, 3*29, 17, 4*5, 16*21, 3*17, 6, 2*17, 6, 3, 2*6, 5*3/ |
|
|
1333 |
DATA P( 5),(C( 5,I),I = 1,99)/ 173, 64, 66, 2*28, 2*44, 55, |
|
|
1334 |
& 67, 6*10, 2*38, 5*10, 12*49, 2*38, 31, 2*4, 31, 64, 3*4, 64, |
|
|
1335 |
& 6*45, 19*66, 11, 9*66, 45, 11, 7, 3, 3*2, 27, 5, 2*3, 2*5, 7*2/ |
|
|
1336 |
DATA P( 6),(C( 6,I),I = 1,99)/ 263, 111, 42, 54, 118, 20, |
|
|
1337 |
& 2*31, 72, 17, 94, 2*14, 11, 3*14, 94, 4*10, 7*14, 3*11, 7*8, |
|
|
1338 |
& 5*18, 113, 2*62, 2*45, 17*113, 2*63, 53, 63, 15*67, 5*51, 12, |
|
|
1339 |
& 51, 12, 51, 5, 2*3, 2*2, 5/ |
|
|
1340 |
DATA P( 7),(C( 7,I),I = 1,99)/ 397, 163, 154, 83, 43, 82, |
|
|
1341 |
& 92, 150, 59, 2*76, 47, 2*11, 100, 131, 6*116, 9*138, 21*101, |
|
|
1342 |
& 6*116, 5*100, 5*138, 19*101, 8*38, 5*3/ |
|
|
1343 |
DATA P( 8),(C( 8,I),I = 1,99)/ 593, 246, 189, 242, 102, |
|
|
1344 |
& 2*250, 102, 250, 280, 118, 196, 118, 191, 215, 2*121, |
|
|
1345 |
& 12*49, 34*171, 8*161, 17*14, 6*10, 103, 4*10, 5/ |
|
|
1346 |
DATA P( 9),(C( 9,I),I = 1,99)/ 907, 347, 402, 322, 418, |
|
|
1347 |
& 215, 220, 3*339, 337, 218, 4*315, 4*167, 361, 201, 11*124, |
|
|
1348 |
& 2*231, 14*90, 4*48, 23*90, 10*243, 9*283, 16, 283, 16, 2*283/ |
|
|
1349 |
DATA P(10),(C(10,I),I = 1,99)/ 1361, 505, 220, 601, 644, |
|
|
1350 |
& 612, 160, 3*206, 422, 134, 518, 2*134, 518, 652, 382, |
|
|
1351 |
& 206, 158, 441, 179, 441, 56, 2*559, 14*56, 2*101, 56, |
|
|
1352 |
& 8*101, 7*193, 21*101, 17*122, 4*101/ |
|
|
1353 |
DATA P(11),(C(11,I),I = 1,99)/ 2053, 794, 325, 960, 528, |
|
|
1354 |
& 2*247, 338, 366, 847, 2*753, 236, 2*334, 461, 711, 652, |
|
|
1355 |
& 3*381, 652, 7*381, 226, 7*326, 126, 10*326, 2*195, 19*55, |
|
|
1356 |
& 7*195, 11*132, 13*387/ |
|
|
1357 |
DATA P(12),(C(12,I),I = 1,99)/ 3079, 1189, 888, 259, 1082, 725, |
|
|
1358 |
& 811, 636, 965, 2*497, 2*1490, 392, 1291, 2*508, 2*1291, 508, |
|
|
1359 |
& 1291, 2*508, 4*867, 934, 7*867, 9*1284, 4*563, 3*1010, 208, |
|
|
1360 |
& 838, 3*563, 2*759, 564, 2*759, 4*801, 5*759, 8*563, 22*226/ |
|
|
1361 |
DATA P(13),(C(13,I),I = 1,99)/ 4621, 1763, 1018, 1500, 432, |
|
|
1362 |
& 1332, 2203, 126, 2240, 1719, 1284, 878, 1983, 4*266, |
|
|
1363 |
& 2*747, 2*127, 2074, 127, 2074, 1400, 10*1383, 1400, 7*1383, |
|
|
1364 |
& 507, 4*1073, 5*1990, 9*507, 17*1073, 6*22, 1073, 6*452, 318, |
|
|
1365 |
& 4*301, 2*86, 15/ |
|
|
1366 |
DATA P(14),(C(14,I),I = 1,99)/ 6947, 2872, 3233, 1534, 2941, |
|
|
1367 |
& 2910, 393, 1796, 919, 446, 2*919, 1117, 7*103, 2311, 3117, 1101, |
|
|
1368 |
& 2*3117, 5*1101, 8*2503, 7*429, 3*1702, 5*184, 34*105, 13*784/ |
|
|
1369 |
DATA P(15),(C(15,I),I = 1,99)/ 10427, 4309, 3758, 4034, 1963, |
|
|
1370 |
& 730, 642, 1502, 2246, 3834, 1511, 2*1102, 2*1522, 2*3427, |
|
|
1371 |
& 3928, 2*915, 4*3818, 3*4782, 3818, 4782, 2*3818, 7*1327, 9*1387, |
|
|
1372 |
& 13*2339, 18*3148, 3*1776, 3*3354, 925, 2*3354, 5*925, 8*2133/ |
|
|
1373 |
DATA P(16),(C(16,I),I = 1,99)/ 15641, 6610, 6977, 1686, 3819, |
|
|
1374 |
& 2314, 5647, 3953, 3614, 5115, 2*423, 5408, 7426, 2*423, |
|
|
1375 |
& 487, 6227, 2660, 6227, 1221, 3811, 197, 4367, 351, |
|
|
1376 |
& 1281, 1221, 3*351, 7245, 1984, 6*2999, 3995, 4*2063, 1644, |
|
|
1377 |
& 2063, 2077, 3*2512, 4*2077, 19*754, 2*1097, 4*754, 248, 754, |
|
|
1378 |
& 4*1097, 4*222, 754,11*1982/ |
|
|
1379 |
DATA P(17),(C(17,I),I = 1,99)/ 23473, 9861, 3647, 4073, 2535, |
|
|
1380 |
& 3430, 9865, 2830, 9328, 4320, 5913, 10365, 8272, 3706, 6186, |
|
|
1381 |
& 3*7806, 8610, 2563, 2*11558, 9421, 1181, 9421, 3*1181, 9421, |
|
|
1382 |
& 2*1181, 2*10574, 5*3534, 3*2898, 3450, 7*2141, 15*7055, 2831, |
|
|
1383 |
& 24*8204, 3*4688, 8*2831/ |
|
|
1384 |
DATA P(18),(C(18,I),I = 1,99)/ 35221, 10327, 7582, 7124, 8214, |
|
|
1385 |
& 9600, 10271, 10193, 10800, 9086, 2365, 4409, 13812, |
|
|
1386 |
& 5661, 2*9344, 10362, 2*9344, 8585, 11114, 3*13080, 6949, |
|
|
1387 |
& 3*3436, 13213, 2*6130, 2*8159, 11595, 8159, 3436, 18*7096, |
|
|
1388 |
& 4377, 7096, 5*4377, 2*5410, 32*4377, 2*440, 3*1199/ |
|
|
1389 |
DATA P(19),(C(19,I),I = 1,99)/ 52837, 19540, 19926, 11582, |
|
|
1390 |
& 11113, 24585, 8726, 17218, 419, 3*4918, 15701, 17710, |
|
|
1391 |
& 2*4037, 15808, 11401, 19398, 2*25950, 4454, 24987, 11719, |
|
|
1392 |
& 8697, 5*1452, 2*8697, 6436, 21475, 6436, 22913, 6434, 18497, |
|
|
1393 |
& 4*11089, 2*3036, 4*14208, 8*12906, 4*7614, 6*5021, 24*10145, |
|
|
1394 |
& 6*4544, 4*8394/ |
|
|
1395 |
DATA P(20),(C(20,I),I = 1,99)/ 79259, 34566, 9579, 12654, |
|
|
1396 |
& 26856, 37873, 38806, 29501, 17271, 3663, 10763, 18955, |
|
|
1397 |
& 1298, 26560, 2*17132, 2*4753, 8713, 18624, 13082, 6791, |
|
|
1398 |
& 1122, 19363, 34695, 4*18770, 15628, 4*18770, 33766, 6*20837, |
|
|
1399 |
& 5*6545, 14*12138, 5*30483, 19*12138, 9305, 13*11107, 2*9305/ |
|
|
1400 |
DATA P(21),(C(21,I),I = 1,99)/118891, 31929, 49367, 10982, 3527, |
|
|
1401 |
& 27066, 13226, 56010, 18911, 40574, 2*20767, 9686, 2*47603, |
|
|
1402 |
& 2*11736, 41601, 12888, 32948, 30801, 44243, 2*53351, 16016, |
|
|
1403 |
& 2*35086, 32581, 2*2464, 49554, 2*2464, 2*49554, 2464, 81, 27260, |
|
|
1404 |
& 10681, 7*2185, 5*18086, 2*17631, 3*18086, 37335, 3*37774, |
|
|
1405 |
& 13*26401, 12982, 6*40398, 3*3518, 9*37799, 4*4721, 4*7067/ |
|
|
1406 |
DATA P(22),(C(22,I),I = 1,99)/178349, 40701, 69087, 77576, 64590, |
|
|
1407 |
& 39397, 33179, 10858, 38935, 43129, 2*35468, 5279, 2*61518, 27945, |
|
|
1408 |
& 2*70975, 2*86478, 2*20514, 2*73178, 2*43098, 4701, |
|
|
1409 |
& 2*59979, 58556, 69916, 2*15170, 2*4832, 43064, 71685, 4832, |
|
|
1410 |
& 3*15170, 3*27679, 2*60826, 2*6187, 5*4264, 45567, 4*32269, |
|
|
1411 |
& 9*62060, 13*1803, 12*51108, 2*55315, 5*54140, 13134/ |
|
|
1412 |
DATA P(23),(C(23,I),I = 1,99)/267523, 103650, 125480, 59978, |
|
|
1413 |
& 46875, 77172, 83021, 126904, 14541, 56299, 43636, 11655, |
|
|
1414 |
& 52680, 88549, 29804, 101894, 113675, 48040, 113675, |
|
|
1415 |
& 34987, 48308, 97926, 5475, 49449, 6850, 2*62545, 9440, |
|
|
1416 |
& 33242, 9440, 33242, 9440, 33242, 9440, 62850, 3*9440, |
|
|
1417 |
& 3*90308, 9*47904, 7*41143, 5*36114, 24997, 14*65162, 7*47650, |
|
|
1418 |
& 7*40586, 4*38725, 5*88329/ |
|
|
1419 |
DATA P(24),(C(24,I),I = 1,99)/401287, 165843, 90647, 59925, |
|
|
1420 |
& 189541, 67647, 74795, 68365, 167485, 143918, 74912, |
|
|
1421 |
& 167289, 75517, 8148, 172106, 126159,3*35867, 121694, |
|
|
1422 |
& 52171, 95354, 2*113969, 76304, 2*123709, 144615, 123709, |
|
|
1423 |
& 2*64958, 32377, 2*193002, 25023, 40017, 141605, 2*189165, |
|
|
1424 |
& 141605, 2*189165, 3*141605, 189165, 20*127047, 10*127785, |
|
|
1425 |
& 6*80822, 16*131661, 7114, 131661/ |
|
|
1426 |
DATA P(25),(C(25,I),I = 1,99)/601943, 130365, 236711, 110235, |
|
|
1427 |
& 125699, 56483, 93735, 234469, 60549, 1291, 93937, |
|
|
1428 |
& 245291, 196061, 258647, 162489, 176631, 204895, 73353, |
|
|
1429 |
& 172319, 28881, 136787,2*122081, 275993, 64673, 3*211587, |
|
|
1430 |
& 2*282859, 211587, 242821, 3*256865, 122203, 291915, 122203, |
|
|
1431 |
& 2*291915, 122203, 2*25639, 291803, 245397, 284047, |
|
|
1432 |
& 7*245397, 94241, 2*66575, 19*217673, 10*210249, 15*94453/ |
|
|
1433 |
DATA P(26),(C(26,I),I = 1,99)/902933, 333459, 375354, 102417, |
|
|
1434 |
& 383544, 292630, 41147, 374614, 48032, 435453, 281493, 358168, |
|
|
1435 |
& 114121, 346892, 238990, 317313, 164158, 35497, 2*70530, 434839, |
|
|
1436 |
& 3*24754, 393656, 2*118711, 148227, 271087, 355831, 91034, |
|
|
1437 |
& 2*417029, 2*91034, 417029, 91034, 2*299843, 2*413548, 308300, |
|
|
1438 |
& 3*413548, 3*308300, 413548, 5*308300, 4*15311, 2*176255, 6*23613, |
|
|
1439 |
& 172210, 4* 204328, 5*121626, 5*200187, 2*121551, 12*248492, |
|
|
1440 |
& 5*13942/ |
|
|
1441 |
DATA P(27), (C(27,I), I = 1,99)/ 1354471, 500884, 566009, 399251, |
|
|
1442 |
& 652979, 355008, 430235, 328722, 670680, 2*405585, 424646, |
|
|
1443 |
& 2*670180, 641587, 215580, 59048, 633320, 81010, 20789, 2*389250, |
|
|
1444 |
& 2*638764, 2*389250, 398094, 80846, 2*147776, 296177, 2*398094, |
|
|
1445 |
& 2*147776, 396313, 3*578233, 19482, 620706, 187095, 620706, |
|
|
1446 |
& 187095, 126467, 12*241663, 321632, 2*23210, 3*394484, 3*78101, |
|
|
1447 |
& 19*542095, 3*277743, 12*457259/ |
|
|
1448 |
DATA P(28), (C(28,I), I = 1, 99)/ 2031713, 858339, 918142, 501970, |
|
|
1449 |
& 234813, 460565, 31996, 753018, 256150, 199809, 993599, 245149, |
|
|
1450 |
& 794183, 121349, 150619, 376952, 2*809123, 804319, 67352, 969594, |
|
|
1451 |
& 434796, 969594, 804319, 391368, 761041, 754049, 466264, 2*754049, |
|
|
1452 |
& 466264, 2*754049, 282852, 429907, 390017, 276645, 994856, 250142, |
|
|
1453 |
& 144595, 907454, 689648, 4*687580, 978368, 687580, 552742, 105195, |
|
|
1454 |
& 942843, 768249, 4*307142, 7*880619, 11*117185, 11*60731, |
|
|
1455 |
& 4*178309, 8*74373, 3*214965/ |
|
|
1456 |
* |
|
|
1457 |
END |
|
|
1458 |
* |
|
|
1459 |
SUBROUTINE MVKRSV( NDIM,KL,VALUES,PRIME,VK, NF,FUNSUB, X,R,PR,FS ) |
|
|
1460 |
* |
|
|
1461 |
* For lattice rule sums |
|
|
1462 |
* |
|
|
1463 |
INTEGER NDIM, NF, PRIME, KL, K, J, JP, PR(*) |
|
|
1464 |
DOUBLE PRECISION VALUES(*), VK(*), FS(*), X(*), R(*), MVUNI |
|
|
1465 |
DO J = 1, NF |
|
|
1466 |
VALUES(J) = 0 |
|
|
1467 |
END DO |
|
|
1468 |
* |
|
|
1469 |
* Determine random shifts for each variable; scramble lattice rule |
|
|
1470 |
* |
|
|
1471 |
DO J = 1, NDIM |
|
|
1472 |
R(J) = MVUNI() |
|
|
1473 |
IF ( J .LT. KL ) THEN |
|
|
1474 |
JP = 1 + J*R(J) |
|
|
1475 |
IF ( JP .LT. J ) PR(J) = PR(JP) |
|
|
1476 |
PR(JP) = J |
|
|
1477 |
ELSE |
|
|
1478 |
PR(J) = J |
|
|
1479 |
END IF |
|
|
1480 |
END DO |
|
|
1481 |
* |
|
|
1482 |
* Compute latice rule sums |
|
|
1483 |
* |
|
|
1484 |
DO K = 1, PRIME |
|
|
1485 |
DO J = 1, NDIM |
|
|
1486 |
R(J) = R(J) + VK(PR(J)) |
|
|
1487 |
IF ( R(J) .GT. 1 ) R(J) = R(J) - 1 |
|
|
1488 |
X(J) = ABS( 2*R(J) - 1 ) |
|
|
1489 |
END DO |
|
|
1490 |
CALL FUNSUB( NDIM, X, NF, FS ) |
|
|
1491 |
DO J = 1, NF |
|
|
1492 |
VALUES(J) = VALUES(J) + ( FS(J) - VALUES(J) )/( 2*K-1 ) |
|
|
1493 |
END DO |
|
|
1494 |
DO J = 1, NDIM |
|
|
1495 |
X(J) = 1 - X(J) |
|
|
1496 |
END DO |
|
|
1497 |
CALL FUNSUB( NDIM, X, NF, FS ) |
|
|
1498 |
DO J = 1, NF |
|
|
1499 |
VALUES(J) = VALUES(J) + ( FS(J) - VALUES(J) )/( 2*K ) |
|
|
1500 |
END DO |
|
|
1501 |
END DO |
|
|
1502 |
* |
|
|
1503 |
END |
|
|
1504 |
* |
|
|
1505 |
DOUBLE PRECISION FUNCTION MVUNI() |
|
|
1506 |
* |
|
|
1507 |
* Uniform (0,1) random number generator |
|
|
1508 |
* |
|
|
1509 |
* use R's random number generator directly |
|
|
1510 |
* the way `Writing R extentions' advertises. |
|
|
1511 |
* |
|
|
1512 |
DOUBLE PRECISION unifrnd, x |
|
|
1513 |
|
|
|
1514 |
x = unifrnd() |
|
|
1515 |
MVUNI = x |
|
|
1516 |
END |