-
-
Notifications
You must be signed in to change notification settings - Fork 300
/
quadrature.jl
88 lines (72 loc) · 2.42 KB
/
quadrature.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
function qnwbeta(n::Int, a::T, b::S) where {T <: Real, S <: Real}
a -= 1
b -= 1
maxit = 25
x = zeros(n)
w = zeros(n)
for i=1:n
if i == 1
an = a / n
bn = b / n
r1 = (1 + a) * (2.78 / (4 + n * n) + 0.768an / n)
r2 = 1 + 1.48 * an + 0.96bn + 0.452an*an + 0.83an*bn
z = 1 - r1 / r2
elseif i == 2
r1 = (4.1 + a) / ((1 + a) * (1 + 0.156a))
r2 = 1 + 0.06 * (n - 8) * (1 + 0.12a) / n
r3 = 1 + 0.012b * (1 + 0.25 * abs(a)) / n
z = z - (1 - z) * r1 * r2 * r3
elseif i == 3
r1 = (1.67 + 0.28a) / (1 + 0.37a)
r2 = 1 + 0.22 * (n - 8) / n
r3 = 1 + 8 * b / ((6.28 + b) * n * n)
z = z - (x[1] - z) * r1 * r2 * r3
elseif i == n - 1
r1 = (1 + 0.235b) / (0.766 + 0.119b)
r2 = 1 / (1 + 0.639 * (n - 4) / (1 + 0.71 * (n - 4)))
r3 = 1 / (1 + 20a / ((7.5+ a ) * n * n))
z = z + (z - x[n-3]) * r1 * r2 * r3
elseif i == n
r1 = (1 + 0.37b) / (1.67 + 0.28b)
r2 = 1 / (1 + 0.22 * (n - 8) / n)
r3 = 1 / (1 + 8 * a / ((6.28+ a ) * n * n))
z = z + (z - x[n-2]) * r1 * r2 * r3
else
z = 3 * x[i-1] - 3 * x[i-2] + x[i-3]
end
ab = a + b
for its = 1:maxit
temp = 2 + ab
p1 = (a - b + temp * z) / 2
p2 = 1
for j=2:n
p3 = p2
p2 = p1
temp = 2 * j + ab
aa = 2 * j * (j + ab) * (temp - 2)
bb = (temp - 1) * (a * a - b * b + temp * (temp - 2) * z)
c = 2 * (j - 1 + a) * (j - 1 + b) * temp
p1 = (bb * p2 - c * p3) / aa
end
pp = (n * (a - b - temp * z) * p1 +
2 * (n + a) * (n + b) * p2) / (temp * (1 - z * z))
z1 = z
z = z1 - p1 ./ pp
if abs(z - z1) < 3e-14 break end
end
if its >= maxit
error("Failure to converge in qnwbeta1")
end
x[i] = z
w[i] = temp / (pp * p2)
end
x = (1 - x) ./ 2
w = w * exp(gammaln(a + n) +
gammaln(b + n) -
gammaln(n + 1) -
gammaln(n + ab + 1))
w = w / (2 * exp(gammaln(a + 1) +
gammaln(b + 1) -
gammaln(ab + 2)))
return x, w
end