#include #include #include #undef NJ #define NJ 9 #undef NPT #define NPT ((1<= 1.0 || a <= 0.0 || b <= 0.0 ) return ; if( f1 == NULL && flogx == NULL && flog1x == NULL ) return ; dx = xcut / NPT ; for( ii=1 ; ii <= NPT ; ii++ ){ x = ii*dx ; /* fprintf(stderr,"ii=%d dx=%g a1=%g b1=%g x=%g\n",ii,dx,a1,b1,x) ; */ xab[ii] = pow(x,a1) * pow(1.0-x,b1) ; xabx[ii] = xab[ii] * log(x) ; xab1x[ii] = xab[ii] * log(1.0-x) ; /* fprintf(stderr,"ii=%d x=%g xab=%g xabx=%g xab1x=%g a1=%g b1=%g dx=%g\n", ii,x,xab[ii],xabx[ii],xab1x[ii],a1,b1,dx) ; */ } for( nn=NPT,istep=1,jj=NJ ; jj >= 0 ; jj--,istep*=2,nn/=2 ){ s1 = sx = s1x = 0.0 ; for( ii=istep ; ii <= NPT ; ii+=istep ){ s1 += xab[ii] ; sx += xabx[ii] ; s1x += xab1x[ii] ; } dx = xcut / nn ; as1[jj] = s1*dx ; asx[jj] = sx*dx ; as1x[jj] = s1x*dx ; } #undef AITKEN #define AITKEN(x,y,z) ((x) - ((y)-(x))*((y)-(x)) / (((z)-(y))-((y)-(x))) ) for( jj=0 ; jj <= NJ-2 ; jj++ ){ bs1[jj] = AITKEN( as1[jj] , as1[jj+1] , as1[jj+2] ) ; bsx[jj] = AITKEN( asx[jj] , asx[jj+1] , asx[jj+2] ) ; bs1x[jj] = AITKEN( as1x[jj] , as1x[jj+1] , as1x[jj+2] ) ; } for( jj=0 ; jj <= NJ-4 ; jj++ ){ cs1[jj] = AITKEN( bs1[jj] , bs1[jj+1] , bs1[jj+2] ) ; csx[jj] = AITKEN( bsx[jj] , bsx[jj+1] , bsx[jj+2] ) ; cs1x[jj] = AITKEN( bs1x[jj] , bs1x[jj+1] , bs1x[jj+2] ) ; } #define DMP(tbl,jt) \ do{ fprintf(stderr," table " #tbl ":") ; \ for( jj=0 ; jj <= jt ; jj++ ) fprintf(stderr," %12.5g",tbl[jj]) ; \ fprintf(stderr,"\n") ; } while(0) fprintf(stderr,"ibeta(xc=%g,a=%g,b=%g)\n",xcut,a,b) ; DMP(as1,NJ) ; DMP(bs1,NJ-2) ; DMP(cs1,NJ-4) ; DMP(asx,NJ) ; DMP(bsx,NJ-2) ; DMP(csx,NJ-4) ; DMP(as1x,NJ) ; DMP(bs1x,NJ-2) ; DMP(cs1x,NJ-4) ; if( f1 != NULL ) *f1 = cs1[NJ-4] ; if( flogx != NULL ) *flogx = csx[NJ-4] ; if( flog1x != NULL ) *flog1x = cs1x[NJ-4] ; return ; } int main( int argc , char * argv[] ) { double xcut , a , b , f1,f2,f3 ; if( argc < 4 ) exit(0) ; xcut = strtod(argv[1],NULL) ; a = strtod(argv[2],NULL) ; b = strtod(argv[3],NULL) ; ibeta( xcut,a,b , &f1,&f2,&f3 ) ; exit(0) ; }