% 计算不完全Beta函数.
% 参考文献:
% 何光渝.《Visual Basic 应用数值算法集》[M].北京:科学出版社,170-171,2002.
function Incmp_Beta_Result=IncmpBeta(a,b,X)
[m n]=size(X);
aaa=Gammln(a+b)-Gammln(a)-Gammln(b);
for i=1:m
for j=1:n
if X(i,j)<0 | X(i,j)>1
helpdlg('变量X的取值范围不在0和1之间','错误!');
return
end
if X(i,j)==0 | X(i,j)==1
bt(i,j)=0;
else
bt(i,j)=exp(aaa+a*log(X(i,j))+b*log(1-X(i,j)));
end
end
end
for i=1:m
for j=1:n
if X(i,j)<((a+1)/(a+b+2))
Incmp_Beta_Result(i,j)=bt(i,j)*Betacf(a,b,X(i,j))/a;
else
Incmp_Beta_Result(i,j)=1-bt(i,j)*Betacf(b,a,1-X(i,j))/b;
end
end
end
%//////////////Betacf过程//////////////////////////////
function Betacf_Result=Betacf(a,b,x)
itmax=100;
eps=0.0000003;
am=1;
bm=1;
az=1;
qab=a+b;
qap=a+1;
qam=a-1;
bz=1-qab*x/qap;
for m=1:itmax
em=m;
tem=em+em;
d=em*(b-m)*x/((qam+tem)*(a+tem));
ap=az+d*am;
bp=bz+d*bm;
d=-(a+em)*(qab+em)*x/((a+tem)*(qap+tem));
aap=ap+d*az;
bpp=bp+d*bz;
aold=az;
am=ap/bpp;
bm=bp/bpp;
az=aap/bpp;
bz=1;
if abs(az-aold)<eps*abs(az)
Betacf_Result=az;
break;
end
end
Betacf_Result=az;
%/////////////计算gama函数程序////////////////////////
function Gammln_result=Gammln(xx)
cof(1)=76.18009173;
cof(2)=-86.50532033;
cof(3)=24.01409822;
cof(4)=-1.231739516;
cof(5)=0.00120858003;
cof(6)=-0.00000536382;
stp=2.50662827465;
half=0.5;
one=1.0;
fpf=5.5;
x=xx-one;
tmp=x+fpf;
tmp=(x+half)*log(tmp)-tmp;
ser=one;
for j=1:6
x=x+one;
ser=ser+cof(j)./x;
end
Gammln_result=tmp+log(stp*ser);
%----------programs end here---------------