Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }