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)); }
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_); }
// 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_); }