/* distBetaI.js
Implementa a função beta incompleta.
Pré-requisitos:
distGlobais.js
*/
/* ****************** BETACF(a,b,x) *************************
Calcula a parte da fração contínua da função beta incompleta.
Retorna um objeto da classe "Resultado".
Pré-requisitos:
* Classe Resultado
* Variáveis globais ITMAX=100, EPS=3.0e-7 e FPMIN=1.0e-30
*/
function betacf(a,b,x){
var R = new Resultado()
var m,m2,aa,c,d,del,h,qab,qam,qap
qab=a+b
qap=a+1.0
qam=a-1.0
c=1.0
d=1.0-qab*x/qap
if (Math.abs(d) < FPMIN) d=FPMIN
d=1.0/d
h=d
for(m=1; m<=ITMAX; m++){
m2=2*m
aa=m*(b-m)*x/((qam+m2)*(a+m2))
d=1.0+aa*d
if(Math.abs(d) < FPMIN) d=FPMIN
c=1.0+aa/c
if(Math.abs(c) < FPMIN) c=FPMIN
d=1.0/d
h *= d*c
aa = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2))
d=1.0+aa*d
if(Math.abs(d) < FPMIN) d=FPMIN
c=1.0+aa/c
if(Math.abs(c) < FPMIN) c=FPMIN
d=1.0/d
del=d*c
h *= del
if(Math.abs(del-1.0)ITMAX) return R.msg('a ou b muito grande, ou ITMAX muito pequena em betacf
')
return R.val(h)
}// function betacf
/* **************** FUNCTION BETAI(a,b,x) *********************
Retorna a função beta incompleta. O valor retornado pela
função é um objeto da classe "Resultado". O valor da função
beta incompleta está na propriedade "valor"
Pré-requisitos:
* classe Resultado()
* função betacf(a,b,x)
* função gammln(x)
*/
function betai(a,b,x){
var R = new Resultado()
var bt
if(x < 0.0 || x > 1.0) return R.msg('Valor de x fora da faixa em betai
')
if(x == 0.0 || x == 1.0) bt = 0.0
else bt = Math.exp(gammln(a+b)-gammln(a)-gammln(b)+a*Math.log(x)+b*Math.log(1.0-x))
if(x < (a+1.0)/(a+b+2.0)){
G = betacf(a,b,x)
if(G.erro) return R.msg(G.valor)
R.valor=bt*G.valor/a }
else {
G = betacf(b,a,1.0-x)
if(G.erro) return R.msg(G.errorMsg)
R.valor=1.0-bt*G.valor/b }
return R
}// function betai