annotate scripts/specfun/gammai.m @ 2554:f7e3d23f0a8f

[project @ 1996-11-21 01:41:57 by jwe]
author jwe
date Thu, 21 Nov 1996 01:43:06 +0000
parents 80b982e7f4b1
children 4bb976b250bf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
1 ## Copyright (C) 1995, 1996 Kurt Hornik
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
2 ##
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
3 ## This program is free software; you can redistribute it and/or modify
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
4 ## it under the terms of the GNU General Public License as published by
2313
5ca126254d15 [project @ 1996-07-11 21:25:22 by jwe]
jwe
parents: 2312
diff changeset
5 ## the Free Software Foundation; either version 2, or (at your option)
5ca126254d15 [project @ 1996-07-11 21:25:22 by jwe]
jwe
parents: 2312
diff changeset
6 ## any later version.
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
7 ##
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
8 ## This program is distributed in the hope that it will be useful, but
2313
5ca126254d15 [project @ 1996-07-11 21:25:22 by jwe]
jwe
parents: 2312
diff changeset
9 ## WITHOUT ANY WARRANTY; without even the implied warranty of
5ca126254d15 [project @ 1996-07-11 21:25:22 by jwe]
jwe
parents: 2312
diff changeset
10 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
11 ## General Public License for more details.
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
12 ##
2313
5ca126254d15 [project @ 1996-07-11 21:25:22 by jwe]
jwe
parents: 2312
diff changeset
13 ## You should have received a copy of the GNU General Public License
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
14 ## along with this file. If not, write to the Free Software Foundation,
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
15 ## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1026
9fc405c8c06c [project @ 1995-01-11 21:17:01 by jwe]
jwe
parents: 904
diff changeset
16
2311
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
17 ## usage: gammai (a, x)
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
18 ##
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
19 ## Computes the incomplete gamma function
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
20 ##
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
21 ## gammai(a, x)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
22 ## = (integral from 0 to x of exp(-t) t^(a-1) dt) / gamma(a).
2311
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
23 ##
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
24 ## If a is scalar, then gammai(a, x) is returned for each element of x
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
25 ## and vice versa.
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
26 ##
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
27 ## If neither a nor x is scalar, the sizes of a and x must agree, and
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
28 ## gammai is applied pointwise.
2b5788792cad [project @ 1996-07-11 20:18:38 by jwe]
jwe
parents: 2303
diff changeset
29
2312
204cc7db6f4a [project @ 1996-07-11 21:20:36 by jwe]
jwe
parents: 2311
diff changeset
30 ## Author: KH <Kurt.Hornik@ci.tuwien.ac.at>
204cc7db6f4a [project @ 1996-07-11 21:20:36 by jwe]
jwe
parents: 2311
diff changeset
31 ## Created: 13 August 1994
204cc7db6f4a [project @ 1996-07-11 21:20:36 by jwe]
jwe
parents: 2311
diff changeset
32 ## Adapted-By: jwe
204cc7db6f4a [project @ 1996-07-11 21:20:36 by jwe]
jwe
parents: 2311
diff changeset
33
1026
9fc405c8c06c [project @ 1995-01-11 21:17:01 by jwe]
jwe
parents: 904
diff changeset
34 function y = gammai (a, x)
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
35
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
36 if (nargin != 2)
1026
9fc405c8c06c [project @ 1995-01-11 21:17:01 by jwe]
jwe
parents: 904
diff changeset
37 usage ("gammai (a, x)");
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
38 endif
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
39
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
40 [retval, a, x] = common_size (a, x);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
41 if (retval > 0)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
42 error ("gammai: a and x must be of common size or scalar");
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
43 endif
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
44
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
45 [r, c] = size (x);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
46 s = r * c;
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
47 x = reshape (x, 1, s);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
48 a = reshape (a, 1, s);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
49 y = zeros (1, s);
2325
b5568c31ee2c [project @ 1996-07-15 22:20:21 by jwe]
jwe
parents: 2313
diff changeset
50
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
51 k = find (!(a > 0) | isnan (x));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
52 if any (k)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
53 y(k) = NaN * ones (1, length (k));
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
54 endif
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
55
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
56 k = find ((x == Inf) & (a > 0));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
57 if any (k)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
58 y(k) = ones (1, length (k));
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
59 endif
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
60
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
61 ## For x < a + 1, use summation. The below choice of L should ensure
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
62 ## that the overall error is less than eps ...
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
63 k = find((x > 0) & (x < a + 1));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
64 if any (k)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
65 L = ceil (- max ([a(k), x(k)]) * log (eps));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
66 A = cumprod ((ones (L, 1) * x(k)) ...
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
67 ./ (ones (L, 1) * a(k) + (1 : L)' * ones (1, length (k))));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
68 y(k) = exp (-x(k) + a(k) .* log (x(k))) ...
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
69 .* (1 + sum (A)) ./ gamma (a(k) + 1);
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
70 endif
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
71
2303
5cffc4b8de57 [project @ 1996-06-24 09:15:24 by jwe]
jwe
parents: 1887
diff changeset
72 ## For x >= a + 1, use the continued fraction.
5cffc4b8de57 [project @ 1996-06-24 09:15:24 by jwe]
jwe
parents: 1887
diff changeset
73 ## Note, however, that this converges MUCH slower than the series
5cffc4b8de57 [project @ 1996-06-24 09:15:24 by jwe]
jwe
parents: 1887
diff changeset
74 ## expansion for small a and x not too large!
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
75 k = find ((x >= a + 1) & (x < Inf) & (a > 0));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
76 if any (k)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
77 len = length (k);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
78 u = [zeros (1, len); ones (1, len)];
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
79 v = [ones (1, len); x(k)];
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
80 c_old = 0;
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
81 c_new = v(1, :) ./ v(2, :);
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
82 n = 1;
1026
9fc405c8c06c [project @ 1995-01-11 21:17:01 by jwe]
jwe
parents: 904
diff changeset
83 while (max (abs (c_old ./ c_new - 1)) > 10 * eps)
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
84 c_old = c_new;
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
85 u = v + u .* (ones (2, 1) * (n - a(k)));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
86 v = u .* (ones (2, 1) * x(k)) + n * v;
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
87 c_new = v(1, :) ./ v(2, :);
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
88 n = n + 1;
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
89 endwhile
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
90 y(k) = 1 - exp (-x(k) + a(k) .* log (x(k))) .* c_new ...
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
91 ./ gamma (a(k));
715
6544b83ef9e9 [project @ 1994-09-20 18:40:02 by jwe]
jwe
parents:
diff changeset
92 endif
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
93
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents: 2325
diff changeset
94 y = reshape (y, r, c);
2325
b5568c31ee2c [project @ 1996-07-15 22:20:21 by jwe]
jwe
parents: 2313
diff changeset
95
2554
f7e3d23f0a8f [project @ 1996-11-21 01:41:57 by jwe]
jwe
parents: 2537
diff changeset
96 endfunction