function [ value, ifault ] = betanc ( x, a, b, lambda ) %*****************************************************************************80 % %% BETANC computes the tail of the noncentral Beta distribution. % % Discussion: % % This routine returns the cumulative probability of X for the non-central % Beta distribution with parameters A, B and non-centrality LAMBDA. % % Note that if LAMBDA = 0, the standard Beta distribution is defined. % % Licensing: % % This code is distributed under the GNU LGPL license. % % Modified: % % 25 January 2008 % % Author: % % Original FORTRAN77 version by Russell Lenth. % MATLAB version by John Burkardt. % % Reference: % % Russell Lenth, % Algorithm AS 226: % Computing Noncentral Beta Probabilities, % Applied Statistics, % Volume 36, Number 2, 1987, pages 241-244. % % H Frick, % Algorithm AS R84: % A Remark on Algorithm AS 226: % Computing Noncentral Beta Probabilities, % Applied Statistics, % Volume 39, Number 2, 1990, pages 311-312. % % Parameters: % % Input, real X, the value defining the cumulative % probability lower tail. Normally, 0 <= X <= 1, but any value % is allowed. % % Input, real A, B, the parameters of the distribution. % 0 < A, 0 < B. % % Input, real LAMBDA, the noncentrality parameter % of the distribution. 0 <= LAMBDA. The program can produce reasonably % accurate results for values of LAMBDA up to about 100. % % Output, real VALUE, the cumulative probability % of X. % % Output, integer IFAULT, error flag. % 0, no error occurred. % nonzero, an error occurred. % errmax = 1.0E-07; itrmax = 150; ualpha = 5.0; ifault = 0; if ( lambda < 0.0 | a <= 0.0 | b <= 0.0 ) ifault = 2; value = -1.0; return end if ( x <= 0.0 ) value = 0.0; return end if ( 1.0 <= x ) value = 1.0; return end c = 0.5 * lambda; % % Initialize the series. % beta = alngam ( a ) ... + alngam ( b ) ... - alngam ( a + b ); temp = betain ( x, a, b, beta ); gx = exp ( a * log ( x ) + b * log ( 1.0 - x ) - beta - log ( a ) ); q = exp ( - c ); xj = 0.0; ax = q * temp; sumq = 1.0 - q; value = ax; % % Recur over subsequent terms until convergence is achieved. % ifault = 1; while ( 1 ) xj = xj + 1.0; temp = temp - gx; gx = x * ( a + b + xj - 1.0 ) * gx / ( a + xj ); q = q * c / xj; sumq = sumq - q; ax = temp * q; value = value + ax; % % Check for convergence and act accordingly. % errbd = abs ( ( temp - gx ) * sumq ); if ( errbd <= errmax ) ifault = 0; break end if ( itrmax < xj ) break end end return end