annotate scripts/specfun/gammai.m @ 904:3470f1e25a79

[project @ 1994-11-09 21:22:15 by jwe]
author jwe
date Wed, 09 Nov 1994 21:22:15 +0000
parents 6544b83ef9e9
children 9fc405c8c06c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
1 function y = gammai(a, x)
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
2
904
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
3 # usage: gammai(a, x)
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
4 #
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
5 # Computes the incomplete gamma function
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
6 # gammai(a, x)
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
7 # = (integral from 0 to x of exp(-t) t^(a-1) dt) / gamma(a).
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
8 # If a is scalar, then gammai(a, x) is returned for each element of x
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
9 # and vice versa.
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
10 # If neither a nor x is scalar, the sizes of a and x must agree, and
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
11 # gammai is applied pointwise.
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
12
904
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
13 # Written by KH (Kurt.Hornik@ci.tuwien.ac.at) on Aug 13, 1994
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
14 # Copyright Dept of Probability Theory and Statistics TU Wien
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
15
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
16 if (nargin != 2)
904
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
17 usage (" gammai(a, x)");
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
18 endif
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
19
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
20 [r_a, c_a] = size(a);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
21 [r_x, c_x] = size(x);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
22 e_a = r_a * c_a;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
23 e_x = r_x * c_x;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
24
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
25 # The following code is rather ugly. We want the function to work
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
26 # whenever a and x have the same size or a or x is scalar.
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
27 # We do this by reducing the latter cases to the former.
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
28
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
29 if ((e_a == 0) || (e_x == 0))
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
30 error("gammai: both a and x must be nonempty");
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
31 endif
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
32 if ((r_a == r_x) && (c_a == c_x))
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
33 n = e_a;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
34 a = reshape(a, 1, n);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
35 x = reshape(x, 1, n);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
36 r_y = r_a;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
37 c_y = c_a;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
38 elseif (e_a == 1)
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
39 n = e_x;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
40 a = a * ones(1, n);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
41 x = reshape(x, 1, n);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
42 r_y = r_x;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
43 c_y = c_x;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
44 elseif (e_x == 1)
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
45 n = e_a;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
46 a = reshape(a, 1, n);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
47 x = x * ones(1, n);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
48 r_y = r_a;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
49 c_y = c_a;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
50 else
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
51 error("gammai: a and x must have the same size if neither is scalar");
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
52 endif
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
53
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
54 # Now we can do sanity checking ...
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
55
904
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
56 if (any (a <= 0) || any (a == Inf))
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
57 error ("gammai: all entries of a must be positive anf finite");
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
58 endif
904
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
59 if (any (x < 0))
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
60 error ("gammai: all entries of x must be nonnegative");
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
61 endif
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
62
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
63 y = zeros(1, n);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
64
904
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
65 # For x < a + 1, use summation. The below choice of k should ensure
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
66 # that the overall error is less than eps ...
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
67
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
68 S = find((x > 0) & (x < a + 1));
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
69 s = length(S);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
70 if (s > 0)
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
71 k = ceil(- max([a(S), x(S)]) * log(eps));
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
72 K = (1:k)';
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
73 M = ones(k, 1);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
74 A = cumprod((M * x(S)) ./ (M * a(S) + K * ones(1, s)));
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
75 y(S) = exp(-x(S) + a(S) .* log(x(S))) .* (1 + sum(A)) ./ gamma(a(S)+1);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
76 endif
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
77
904
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
78 # For x >= a + 1, use the continued fraction.
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
79 # Note, however, that this converges MUCH slower than the series
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
80 # expansion for small a and x not too large!
3470f1e25a79 [project @ 1994-11-09 21:22:15 by jwe]
jwe
parents: 715
diff changeset
81
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
82 S = find((x >= a + 1) & (x < Inf));
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
83 s = length(S);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
84 if (s > 0)
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
85 u = [zeros(1, s); ones(1, s)];
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
86 v = [ones(1, s); x(S)];
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
87 c_old = 0;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
88 c_new = v(1,:) ./ v(2,:);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
89 n = 1;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
90 while (max(abs(c_old ./ c_new - 1)) > 10 * eps)
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
91 c_old = c_new;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
92 u = v + u .* (ones(2, 1) * (n - a(S)));
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
93 v = u .* (ones(2, 1) * x(S)) + n * v;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
94 c_new = v(1,:) ./ v(2,:);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
95 n = n + 1;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
96 endwhile
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
97 y(S) = 1 - exp(-x(S) + a(S) .* log(x(S))) .* c_new ./ gamma(a(S));
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
98 endif
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
99
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
100 y(find(x == Inf)) = ones(1, sum(x == Inf));
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
101
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
102 y = reshape(y, r_y, c_y);
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
103
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
104 endfunction