/* distGammaI.js
Esta unidade implementa a função gamma incompleta. Deve ser
usada junto com a a unidade "distGlobais.js"
*/
/* ********** FUNCTION GSER(a,x) *****************
Esta função calcula a função gamma incompleta usando uma série de
Potências. A convergência é melhor quando x < a+1.
Ela retorna um objeto da classe "Resultado". Caso a
propriedade "erro" seja true, a mensagem de erro estará na
propriedade "valor". Caso não
haja erro o objeto retornado terá as propriedades:
"valor" contendo o resultado da função, e
"gammln" contendo o resultado da função gammln(a)
Pré-requisitos:
* a classe Resultado
* função gammln(x)
* variáveis globais: ITMAX=100 e EPS=3.0e-7
*/
function gser(a,x){
var R = new Resultado()
R.gammln = gammln(a)
if(x<=0.0){
if(x<0.0) return R.msg('x menor que 0 na rotina gser
')
return R.val(0.0)
} else {
var ap=a
var del = 1.0/a
var sum = del
for(var n=1;n<=ITMAX;n++){
++ap
del *= x/ap
sum += del
if (Math.abs(del) a+1.
Ela retorna um objeto da classe "Resultado". Caso a
propriedade "erro" seja true, a mensagem de erro estará na
propriedade "valor". Caso não
haja erro o objeto retornado terá as propriedades:
"valor" contendo o resultado da função, e
"gammln" contendo o resultado da função gammln(a)
Pré-requisitos:
* a classe Resultado
* função gammln(x)
* variáveis globais: ITMAX=100, EPS=3.0e-7 e FPMIN=1.0e-30
*/
function gcf(a,x){
var del, an, b, c, d, h, i
var R = new Resultado()
R.gammln = gammln(a)
b = x+1.0-a
c = 1.0/FPMIN
d = 1.0/b
h = d
for(i=1; i<=ITMAX; i++){
an = -i*(i-a)
b += 2.0
d = an*d+b
if (Math.abs(d) < FPMIN) d = FPMIN
c = b + an/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 muito grande ou ITMAX muito pequeno em gcf
')
return R.val(Math.exp(-x+a*Math.log(x)-R.gammln)*h)
}// function gcf
/* ************ FUNCTION GAMMP(a,x) ****************************
Esta função calcula a função gamma incompleta usando o melhor
algoritmo em cada situação (gser ou gcf).
Ela retorna um objeto da classe "Resultado". Caso a
propriedade "erro" seja true, a mensagem de erro estará na
propriedade "valor". Caso não haja erro o objeto retornado
terá a propriedades "valor" contendo o resultado da função.
Pré-requisitos:
* a classe Resultado
* a função gser(a,x)
* a função gcf(a,x)
*/
function gammp(a,x){
var R = new Resultado()
var gamma
if(x<0.0 || a <=0.0) return R.msg('Argumentos inválidos na function gammp
')
if(x < (a+1.0)){
gamma = gser(a,x)
if(gamma.erro) return R.msg(gamma.valor)
return R.val(gamma.valor)
} else {
gamma = gcf(a,x)
if(gamma.erro) return R.msg(gamma.valor)
return R.val(1.0-gamma.valor)
}// if
}// function gammp