public static double m1_beta_black(double beta, double mu, double sigma) { var betaMinusOne = beta - 1.0; var betaMinusOneSq = betaMinusOne * betaMinusOne; var sigma2 = sigma * sigma; var sqrt2 = Math.Sqrt(2.0); var sqrtPi = Math.Sqrt(Math.PI); var t = -mu / sigma; var t2 = t * t; var one_over_two_betaMinusOneSq = 0.5 / betaMinusOneSq; var e4 = Math.Exp(-0.5 * t2); var a1 = t + sigma / betaMinusOne; var group1 = -SpecialFunction.exp_x_N_y(-beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq, a1); var a2 = sigma - t; var group2 = SpecialFunction.exp_x_N_y(mu + 0.5 * sigma2, a2); var f0 = -1.0 / (2.0 * sqrtPi); return(f0 * sqrt2 * e4 * beta * sigma - betaMinusOneSq * group1 + group2 - beta * (mu - beta + 2) * (SpecialFunction.cdf_normal(-t) - 1.0)); }
public static double beta_black_trunc(double beta, double mu, double sigma, double x) { var betaMinusOne = beta - 1.0; var betaMinusOneSq = betaMinusOne * betaMinusOne; var sigma2 = sigma * sigma; var sqrt2 = Math.Sqrt(2.0); var sqrtPi = Math.Sqrt(Math.PI); var t = -mu / sigma; var one_over_two_betaMinusOneSq = 0.5 / betaMinusOneSq; var f0 = -1.0 / (2.0 * sqrtPi); if (x < t) { var x2 = x * x; var e2 = Math.Exp(-0.5 * x2); var a4 = x + sigma / betaMinusOne; var group4 = SpecialFunction.exp_x_N_y(-beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq, a4); return(f0 * sqrt2 * e2 * beta * sigma + +betaMinusOneSq * group4 + beta * SpecialFunction.cdf_normal(x) * (mu - beta + 2.0)); } else { var t2 = t * t; var e4 = Math.Exp(-0.5 * t2); var a1 = t + sigma / betaMinusOne; var group1 = -SpecialFunction.exp_x_N_y(-beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq, a1); var a2 = sigma - t; var a3 = x - sigma; var group2 = -SpecialFunction.exp_x_N_y(mu + 0.5 * sigma2, -a2); var group3 = SpecialFunction.exp_x_N_y(mu + 0.5 * sigma2, a3); return(f0 * sqrt2 * e4 * beta * sigma - betaMinusOneSq * group1 + (group2 + group3) - beta * (mu - beta + 2) * (SpecialFunction.cdf_normal(-t) - 1.0)); } }