示例#1
0
                public static double StudentDistribution(int k, double t)
                {
                    if (Math.Abs(t - 0) < Eps)
                    {
                        return(.5);
                    }
                    if (t < -2)
                    {
                        return(.5 * IncompleteBeta.IncompleteBetaValue(.5 * k, .5, k / (k + t * t)));
                    }

                    var x = t < 0 ? -t : t;

                    double rk = k;
                    var    z  = 1 + x * x / rk;
                    double tz;
                    double f;
                    double p;
                    int    j;

                    if (k % 2 != 0)
                    {
                        var x_sqk = x / Math.Sqrt(rk);
                        p = Math.Atan(x_sqk);
                        if (k > 1)
                        {
                            f  = 1;
                            tz = 1;
                            j  = 3;
                            while (j <= k - 2 & tz / f > Eps)
                            {
                                tz *= (j - 1) / (z * j);
                                f  += tz;
                                j  += 2;
                            }
                            p += f * x_sqk / z;
                        }
                        p *= 2 / Consts.pi;
                    }
                    else
                    {
                        f = tz = 1;
                        j = 2;
                        while (j <= k - 2 & tz / f > Eps)
                        {
                            tz *= (j - 1) / (z * j);
                            f  += tz;
                            j  += 2;
                        }
                        p = f * x / Math.Sqrt(z * rk);
                    }

                    return(.5 + .5 * (t < 0 ? -p : p));
                }