/// <summary> /// Truncated N(0, 1) to (x1, x2), where P(X <= x1) = trim and P(X <= x2) = 1 - trim /// </summary> /// <param name="trim">tail probability</param> /// <returns>approximately (E[X^2] = 1) / Et[X^2]</returns> private static double InflationFactor(double trim) { var norm = new Normal(); // N(0, 1) double a = norm.InverseCumulativeDistribution(1 - trim); double step = 2 * a / 10000; double[] x1s = Helper.Seq(-a + step / 2, a - step / 2, 10000); // Truncated N(0, 1) to P(X <= x) = trim and P(X <= x) = 1 - trim double eX2 = 0.0; foreach (double x1 in x1s) { eX2 += (x1 * x1) * norm.Density(x1); } eX2 = eX2 * step / (1 - 2 * trim); // eX2 now approximates Et[X^2]: E[X^2] of the truncated N(0, 1) return 1 / eX2; // approx (E[X^2] = 1) / Et[X^2] // == 1 / (1 + (-a * dnorm(-a) - a * dnorm(a)) / (1 - 2*trim) - ((dnorm(-1) - dnorm(a)) / (1 - 2* trim))^2) // According to http://en.wikipedia.org/wiki/Truncated_normal_distribution }