Exemple #1
0
            public override double derivative(double stdDev)
            {
#if QL_EXTRA_SAFETY_CHECKS
                QL_REQUIRE(stdDev >= 0.0,
                           "stdDev (" << stdDev << ") must be non-negative");
#endif
                double signedD1 = signedMoneyness_ / stdDev + halfOptionType_ * stdDev;
                return(signedForward_ * N_.derivative(signedD1));
            }
Exemple #2
0
            public override double value(double stdDev)
            {
#if QL_EXTRA_SAFETY_CHECKS
                Utils.QL_REQUIRE(stdDev >= 0.0, () => "stdDev (" + stdDev + ") must be non-negative");
#endif
                if (stdDev.IsEqual(0.0))
                {
                    return(Math.Max(signedForward_ - signedStrike_, 0.0)
                           - undiscountedBlackPrice_);
                }
                double temp     = halfOptionType_ * stdDev;
                double d        = signedMoneyness_ / stdDev;
                double signedD1 = d + temp;
                double signedD2 = d - temp;
                double result   = signedForward_ * N_.value(signedD1)
                                  - signedStrike_ * N_.value(signedD2);
                // numerical inaccuracies can yield a negative answer
                return(Math.Max(0.0, result) - undiscountedBlackPrice_);
            }
Exemple #3
0
        // Returns the new normal vector according to the bump map
        public V3 bumpN(V3 N, float u, float v)
        {
            V3 N_, dM_du, dM_dv;
            V3 dMdu, dMdv;

            float dhdu = 0, dhdv = 0;

            bump_map.Bump(u, v, out dhdu, out dhdv);

            partialM(u, v, out dMdu, out dMdv);

            //M_ = M'
            dM_du = dMdu + k * dhdu * N;

            dM_dv = dMdv + k * dhdv * N;

            N_ = dM_du ^ dM_dv;
            N_.Normalize();
            return(N_);
        }