コード例 #1
0
        public static double m1_beta_black_b(double beta, double mu, double sigma, ref double beta_b, ref double mu_b, ref double sigma_b, double res_b)
        {
            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 b1                   = -beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq;
            var dmgroup1_db1         = 0.0;
            var dmgroup1_da1         = 0.0;
            var group1               = -SpecialFunction.exp_x_N_y_b(b1, a1, ref dmgroup1_db1, ref dmgroup1_da1, 1.0);
            var a2                   = sigma - t;
            var muOneHalfS2          = mu + 0.5 * sigma2;
            var dgroup2_dmuOneHalfS2 = 0.0;
            var dgroup2_da2          = 0.0;
            var group2               = SpecialFunction.exp_x_N_y_b(muOneHalfS2, a2, ref dgroup2_dmuOneHalfS2, ref dgroup2_da2, 1.0);
            var f0                   = -1.0 / (2.0 * sqrtPi);
            var dnmt_dmt             = 0.0;
            var nmt                  = SpecialFunction.cdf_normal_b(-t, ref dnmt_dmt, 1.0);
            var res                  = f0 * sqrt2 * e4 * beta * sigma
                                       - betaMinusOneSq * group1
                                       + group2
                                       - beta * (mu - beta + 2) * (nmt - 1.0);
            var e4_b = res_b * f0 * sqrt2 * beta * sigma;

            beta_b  += res_b * f0 * sqrt2 * e4 * sigma;
            beta_b  += -res_b * (mu - 2.0 * beta + 2.0) * (nmt - 1.0);
            sigma_b += res_b * f0 * sqrt2 * e4 * beta;
            var betaMinusOneSq_b = -res_b * group1;
            var group1_b         = -res_b * betaMinusOneSq;
            var group2_b         = res_b;

            mu_b += -res_b * beta * (nmt - 1.0);
            var nmt_b         = -res_b * beta * (mu - beta + 2);
            var t_b           = -nmt_b * dnmt_dmt;
            var a2_b          = group2_b * dgroup2_da2;
            var muOneHalfS2_b = group2_b * dgroup2_dmuOneHalfS2;

            mu_b    += muOneHalfS2_b;
            sigma_b += muOneHalfS2_b * sigma;
            sigma_b += a2_b;
            t_b     += -a2_b;
            var b1_b = -group1_b * dmgroup1_db1;
            var a1_b = -group1_b * dmgroup1_da1;

            beta_b           += -b1_b * mu / betaMinusOneSq;
            mu_b             += b1_b * (-beta / betaMinusOneSq + 2.0 * one_over_two_betaMinusOneSq);
            sigma_b          += b1_b * 2.0 * sigma * one_over_two_betaMinusOneSq;
            betaMinusOneSq_b += b1_b * beta * mu / betaMinusOneSq / betaMinusOneSq;
            var one_over_two_betaMinusOneSq_b = b1_b * (sigma2 + 2.0 * mu);

            t_b += a1_b;
            var betaMinusOne_b = -a1_b * sigma / betaMinusOne / betaMinusOne;

            sigma_b += a1_b / betaMinusOne;
            var t2_b = -0.5 * e4_b * e4;

            betaMinusOneSq_b += -one_over_two_betaMinusOneSq_b * 0.5 / betaMinusOneSq / betaMinusOneSq;
            t_b            += t2_b * 2.0 * t;
            mu_b           += -t_b / sigma;
            sigma_b        += t_b * mu / sigma / sigma;
            betaMinusOne_b += betaMinusOneSq_b * 2.0 * betaMinusOne;
            beta_b         += betaMinusOne_b;
            return(res);
        }
コード例 #2
0
        public static double beta_black_trunc_b(double beta, double mu, double sigma, double x, ref double beta_b, ref double mu_b, ref double sigma_b, ref double x_b, double res_b)
        {
            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);
            var res              = 0.0;
            var betaMinusOne_b   = 0.0;
            var betaMinusOneSq_b = 0.0;
            var one_over_two_betaMinusOneSq_b = 0.0;
            var x2_b = 0.0;
            var t_b  = 0.0;

            if (x < t)
            {
                var x2           = x * x;
                var ar2          = -0.5 * x2;
                var e2           = Math.Exp(ar2);
                var a4           = x + sigma / betaMinusOne;
                var ar4          = -beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq;
                var dgroup4_dar4 = 0.0;
                var dgroup4_da4  = 0.0;
                var group4       = SpecialFunction.exp_x_N_y_b(ar4, a4, ref dgroup4_dar4, ref dgroup4_da4, 1.0);
                var dNx_dx       = 0.0;
                var Nx           = SpecialFunction.cdf_normal_b(x, ref dNx_dx, 1.0);
                res = f0 * sqrt2 * e2 * beta * sigma
                      + betaMinusOneSq * group4
                      + beta * Nx * (mu - beta + 2.0);
                var e2_b = res_b * f0 * sqrt2 * beta * sigma;
                beta_b           += res_b * (f0 * sqrt2 * e2 * sigma + Nx * (mu - 2.0 * beta + 2.0));
                sigma_b          += res_b * f0 * sqrt2 * e2 * beta;
                betaMinusOneSq_b += res_b * group4;
                var group4_b = res_b * betaMinusOneSq;
                var Nx_b     = res_b * beta * (mu - beta + 2.0);
                mu_b += res_b * beta * Nx;
                x_b  += Nx_b * dNx_dx;
                var ar4_b = group4_b * dgroup4_dar4;
                var a4_b  = group4_b * dgroup4_da4;
                beta_b           += ar4_b * (-mu / betaMinusOneSq);
                mu_b             += ar4_b * (-beta / betaMinusOneSq + 2.0 * one_over_two_betaMinusOneSq);
                betaMinusOneSq_b += ar4_b * (beta * mu / betaMinusOneSq / betaMinusOneSq);
                sigma_b          += ar4_b * 2.0 * sigma * one_over_two_betaMinusOneSq;
                one_over_two_betaMinusOneSq_b += ar4_b * (sigma2 + 2.0 * mu);
                x_b            += a4_b;
                sigma_b        += a4_b / betaMinusOne;
                betaMinusOne_b += a4_b * (-sigma / betaMinusOne / betaMinusOne);
                var ar2_b = e2_b * e2;
                x2_b += -0.5 * ar2_b;
                x_b  += x2_b * 2.0 * x;
            }
            else
            {
                var t2            = t * t;
                var ar4           = -0.5 * t2;
                var e4            = Math.Exp(ar4);
                var a1            = t + sigma / betaMinusOne;
                var ar1           = -beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq;
                var dmgroup1_dar1 = 0.0;
                var dmgroup1_da1  = 0.0;
                var group1        = -SpecialFunction.exp_x_N_y_b(ar1, a1, ref dmgroup1_dar1, ref dmgroup1_da1, 1.0);
                var a2            = t - sigma;
                var a3            = x - sigma;
                var ar2           = mu + 0.5 * sigma2;
                var dmgroup2_dar2 = 0.0;
                var dmgroup2_da2  = 0.0;
                var group2        = -SpecialFunction.exp_x_N_y_b(ar2, a2, ref dmgroup2_dar2, ref dmgroup2_da2, 1.0);
                var dgroup3_dar2  = 0.0;
                var dgroup3_da3   = 0.0;
                var group3        = SpecialFunction.exp_x_N_y_b(ar2, a3, ref dgroup3_dar2, ref dgroup3_da3, 1.0);
                var dnmt_dmt      = 0.0;
                var nmt           = SpecialFunction.cdf_normal_b(-t, ref dnmt_dmt, 1.0);
                res = f0 * sqrt2 * e4 * beta * sigma
                      - betaMinusOneSq * group1
                      + group2 + group3
                      - beta * (mu - beta + 2) * (nmt - 1.0);
                var e4_b = res_b * f0 * sqrt2 * beta * sigma;
                beta_b           += res_b * (f0 * sqrt2 * e4 * sigma - (mu - 2.0 * beta + 2.0) * (nmt - 1.0));
                sigma_b          += res_b * f0 * sqrt2 * e4 * beta;
                betaMinusOneSq_b += -res_b * group1;
                var group1_b = -res_b * betaMinusOneSq;
                var group2_b = res_b;
                var group3_b = res_b;
                mu_b += -res_b * beta * (nmt - 1.0);
                var nmt_b = res_b * -beta * (mu - beta + 2);
                t_b += -nmt_b * dnmt_dmt;
                var ar2_b = group3_b * dgroup3_dar2;
                var a3_b  = group3_b * dgroup3_da3;
                var a2_b  = -group2_b * dmgroup2_da2;
                ar2_b   += -group2_b * dmgroup2_dar2;
                mu_b    += ar2_b;
                sigma_b += ar2_b * sigma;
                x_b     += a3_b;
                sigma_b += -a3_b;
                sigma_b += -a2_b;
                t_b     += a2_b;
                var ar1_b = -group1_b * dmgroup1_dar1;
                var a1_b  = -group1_b * dmgroup1_da1;
                beta_b           += ar1_b * (-mu / betaMinusOneSq);
                mu_b             += ar1_b * (-beta / betaMinusOneSq + 2.0 * one_over_two_betaMinusOneSq);
                betaMinusOneSq_b += ar1_b * (beta * mu / betaMinusOneSq / betaMinusOneSq);
                sigma_b          += ar1_b * 2.0 * sigma * one_over_two_betaMinusOneSq;
                one_over_two_betaMinusOneSq_b += ar1_b * (sigma2 + 2.0 * mu);
                t_b            += a1_b;
                sigma_b        += a1_b / betaMinusOne;
                betaMinusOne_b += -a1_b * sigma / betaMinusOne / betaMinusOne;
                var ar4_b = e4_b * e4;
                var t2_b  = -0.5 * ar4_b;
                t_b += t2_b * 2.0 * t;
            }
            betaMinusOneSq_b += -one_over_two_betaMinusOneSq_b * 0.5 / betaMinusOneSq / betaMinusOneSq;
            mu_b             += -t_b / sigma;
            sigma_b          += t_b * mu / sigma / sigma;
            betaMinusOne_b   += betaMinusOneSq_b * 2.0 * betaMinusOne;
            beta_b           += betaMinusOne_b;
            return(res);
        }