home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / scripts / specfun / betai.m < prev    next >
Text File  |  1996-09-28  |  4KB  |  126 lines

  1. # Copyright (C) 1995 John W. Eaton
  2. # This file is part of Octave.
  3. # Octave is free software; you can redistribute it and/or modify it
  4. # under the terms of the GNU General Public License as published by the
  5. # Free Software Foundation; either version 2, or (at your option) any
  6. # later version.
  7. # Octave is distributed in the hope that it will be useful, but WITHOUT
  8. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  9. # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  10. # for more details.
  11. # You should have received a copy of the GNU General Public License
  12. # along with Octave; see the file COPYING.  If not, write to the Free
  13. # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  14.  
  15. function y = betai(a, b, x)
  16.   
  17. # usage: betai(a, b, x)
  18. #
  19. # Returns the incomplete beta function
  20. #   betai (a, b, x) = BETA(a,b)^(-1) INT_0^x t^(a-1) (1-t)^(b-1) dt.
  21. # If x has more than one component, both a and b must be scalars.
  22. # If x is a scalar, a and b must be of compatible dimensions.
  23.   
  24. # Written by KH (Kurt.Hornik@ci.tuwien.ac.at) on Aug 2, 1994.
  25.  
  26. # Computation is based on the series expansion
  27. #   betai(a, b, x) 
  28. #     = \frac{1}{B(a, b)} x^a 
  29. #         \sum_{k=0}^\infty \frac{(1-b)\cdots(k-b)}{a+k} \frac{x^k}{k!}
  30. # for x <= 1/2.  For x > 1/2, betai(a, b, x) = 1 - betai(b, a, 1-x).
  31.  
  32.   if (nargin <> 3)
  33.     usage (" betai (a, b, x)");
  34.   endif
  35.  
  36.   if !((a > 0) && (b > 0))
  37.     error("betai:  a and b must both be positive.");
  38.   endif
  39.   [nr, nc] = size(x);
  40.   if (min ([nr, nc]) == 0)
  41.     error ("betai:  x must not be empty.");
  42.   endif
  43.   if (any (x < 0) || any (x > 1))
  44.     error ("betai: all entries of x must be in [0,1].");
  45.   endif
  46.  
  47.   if ((nr > 1) || (nc > 1))
  48.     
  49.     if (! (is_scalar (a) && is_scalar (b)))
  50.       error ("betai: if x is not a scalar, a and b must be scalars");
  51.     endif
  52.  
  53.     n = nr * nc;
  54.     x = reshape (x, 1, n);
  55.     y = zeros (1, n);
  56.     c = exp (lgamma (a+b) - lgamma (a) - lgamma (b));
  57.  
  58.     y (find (x == 1)) = ones (1, sum (x == 1));
  59.  
  60. # Now do the series computation.  The error when truncating at term K
  61. # is always less than 2^(-K), hence the following choice of K.
  62.  
  63.     K = ceil (-log (eps) / log (2));
  64.     k = (1:K)';
  65.  
  66.     ind = find ((x > 0) & (x <= 1/2));
  67.     len = length (ind);
  68.     if (len > 0)
  69.       tmp    = cumprod((1 - b./k) * x(ind)) ./ ((a + k) * ones(1, len));
  70.       y(ind) = c * exp(a * log(x(ind))) .* (1/a + sum(tmp));
  71.     endif
  72.     
  73.     ind = find ((x > 1/2) & (x < 1));
  74.     len = length(ind);
  75.     if (len > 0)
  76.       tmp    = cumprod ((1 - a./k) * (1 - x(ind))) ./ ((b + k) * ones(1, len));
  77.       y(ind) = 1 - c * exp (b * log (1-x(ind))) .* (1/b + sum (tmp));
  78.     endif
  79.   
  80.     y = reshape (y, nr, nc);
  81.     
  82.   else
  83.     
  84.     [ra, ca] = size (a);
  85.     [rb, cb] = size (b);
  86.     if (! (ra == rb && ca == cb))
  87.       error ("betai: a and b must have the same size");
  88.     endif
  89.  
  90.     n = ra * ca;
  91.     a = reshape (a, 1, n);
  92.     b = reshape (b, 1, n);
  93.     c = exp (lgamma (a+b) - lgamma (a) - lgamma (b));
  94.     
  95.     if (x == 0)
  96.       y   = zeros (1, n);
  97.     elseif (x == 1)
  98.       y   = ones (1, n);
  99.     else
  100.       K = ceil (-log (eps) / log (2));
  101.       k = (1:K)' * ones (1, n);
  102.       h = ones (K, 1);
  103.       if (x > 0 && x <= 1/2)
  104.     tmp = cumprod ((1 - (h * b) ./ k) * x) ./ ((h * a) + k);
  105.     y   = c .* exp (a * log(x)) .* (1 ./ a + sum (tmp));
  106.       else
  107.     tmp = cumprod ((1 - (h * a) ./ k) * (1-x)) ./ ((h * b) + k);
  108.     y   = 1 - c .* exp (b * log (1-x)) .* (1 ./ b + sum (tmp));
  109.       endif
  110.     endif
  111.   
  112.     y = reshape (y, ra, ca);
  113.     
  114.   endif
  115.  
  116. endfunction
  117.  
  118.  
  119.  
  120.  
  121.  
  122.