/// <summary> /// ベータ関数B(x,y)の値を求めます /// B(x,y)=∫[0,1]{t^(x-1) * (1-t)^(y-1)}dt /// </summary> /// <param name="x">ベータ関数のパラメーターx</param> /// <param name="y">ベータ関数のパラメーターy</param> /// <param name="numOfSeparation">積分の区切り数</param> /// <returns>ベータ関数B(x,y)の値</returns> public static double Beta(double x, double y, int numOfSeparation = 1000) { //y_nを先に計算する var yn = new double[2 * numOfSeparation + 1]; foreach (var i in Enumerable.Range(0, yn.Length)) { yn[i] = BetaFunctionOfIntegral((double)i / (double)numOfSeparation / 2.0, x, y); } //積分する関数 var func = new Func <double, double>((double t) => { var index = (int)(t * 2 * numOfSeparation); return(yn[index]); }); //シンプソンの公式で積分する double g = 0.0; foreach (var i in Enumerable.Range(0, numOfSeparation)) { var ti = (double)i / (double)numOfSeparation; g += SimpsonsRule.SimpsonsRuleFunction(func, ti, 1.0 / (double)numOfSeparation); } return(g); }
/// <summary> /// ベータ分布の累積分布関数 /// </summary> /// <param name="x">確率変数</param> /// <param name="shape1">ベータ関数B(α,β)のパラメーターα</param> /// <param name="shape2">ベータ関数B(α,β)のパラメーターβ</param> /// <param name="numOfSeparation">積分の区切り数</param> /// <returns>ベータ分布の累積分布関数の値</returns> public static double PBeta(double x, double shape1, double shape2, int numOfSeparation = 1000) { //確率密度関数を計算する var dn = _cache.GetDBetaArray(shape1, shape2, numOfSeparation); //積分する関数 var func = new Func <double, double>((double p) => { var index = (int)(p * 2 * numOfSeparation); return(dn[index]); }); //シンプソンの公式で積分する double g = 0.0; foreach (var i in Enumerable.Range(0, (int)((double)numOfSeparation * x))) { var ti = (double)i / (double)numOfSeparation; g += SimpsonsRule.SimpsonsRuleFunction(func, ti, 1.0 / (double)numOfSeparation); } return(g); }