/* License: LGPL Ref: Copied from this11/misc-2011/A1/wishart/Prog $OpenXM: OpenXM/src/hgm/mh/src/rk.c,v 1.3 2013/02/20 01:06:38 takayama Exp $ */ #include #include #include #include extern int MH_RANK; extern int MH_M; char *MH_Gfname; char *MH_Dfname; extern int MH_Mg; extern double *MH_Beta; extern double *MH_Ng; extern double MH_X0g; extern int MH_RawName; double MH_Hg = 0.001; static FILE *Gf=NULL; static FILE *Df =NULL; int MH_P95=0; int MH_Verbose=0; static mypower(int x,int n) { int a,i; a = 1; for (i=0; i0?(xxn)); x += h) { if (Df) show_v(x,y, MH_RANK); if (Gf) fprintf(Gf,"%lf %le\n",x,y[0]); /* Output 95% point */ if (MH_P95) { if ((MH_P95==1) && (y[0] >= 0.95)) { printf("x=%le, y[0]=%lf\n",x,y[0]); MH_P95=2; }else if ((MH_P95==2) && (y[0] >=0.9500000001)) { printf("x=%le, y[0]=%lf\n",x,y[0]); MH_P95=0; } } mh_rf(x, y, MH_RANK, temp, MH_RANK); for (i = 0; i < MH_RANK; i++) k1[i] = h * temp[i]; for (i = 0; i < MH_RANK; i++) ty[i] = y[i] + 0.5 * k1[i]; mh_rf(x + 0.5 * h, ty, MH_RANK, temp, MH_RANK); for (i = 0; i < MH_RANK; i++) k2[i] = h * temp[i]; for (i = 0; i < MH_RANK; i++) ty[i] = y[i] + 0.5 * k2[i]; mh_rf(x + 0.5 * h, ty, MH_RANK, temp, MH_RANK); for (i = 0; i < MH_RANK; i++) k3[i] = h * temp[i]; for (i = 0; i < MH_RANK; i++) ty[i] = y[i] + k3[i]; mh_rf(x + h, ty, MH_RANK, temp, MH_RANK); for (i = 0; i < MH_RANK; i++) k4[i] = h * temp[i]; for (i = 0; i < MH_RANK; i++) y[i] = y[i] + 1.0/6.0 * k1[i] + 1.0/3.0 * k2[i] + 1.0/3.0 * k3[i] + 1.0/6.0 * k4[i]; } printf("x=%lf, y[0]=%lg\n",x,y[0]); if (Df) fclose(Df); if (Gf) fclose(Gf); return x; }