public FdmDividendHandler(DividendSchedule schedule, FdmMesher mesher, Date referenceDate, DayCounter dayCounter, int equityDirection) { x_ = new Vector(mesher.layout().dim()[equityDirection]); mesher_ = mesher; equityDirection_ = equityDirection; dividends_ = new List <double>(); dividendDates_ = new List <Date>(); dividendTimes_ = new List <double>(); foreach (Dividend iter in schedule) { dividends_.Add(iter.amount()); dividendDates_.Add(iter.date()); dividendTimes_.Add( dayCounter.yearFraction(referenceDate, iter.date())); } Vector tmp = mesher_.locations(equityDirection); int spacing = mesher_.layout().spacing()[equityDirection]; for (int i = 0; i < x_.size(); ++i) { x_[i] = Math.Exp(tmp[i * spacing]); } }
public FdmDirichletBoundary(FdmMesher mesher, double valueOnBoundary, int direction, Side side) { side_ = side; valueOnBoundary_ = valueOnBoundary; indices_ = new FdmIndicesOnBoundary(mesher.layout(), direction, side).getIndices(); if (side_ == Side.Lower) { xExtreme_ = mesher.locations(direction)[0]; } else if (side_ == Side.Upper) { xExtreme_ = mesher .locations(direction)[mesher.layout().dim()[direction] - 1]; } else { Utils.QL_FAIL("internal error"); } }
public FdmHullWhiteOp(FdmMesher mesher, HullWhite model, int direction) { x_ = mesher.locations(direction); dzMap_ = new TripleBandLinearOp(new FirstDerivativeOp(direction, mesher).mult(-1.0 * x_ * model.a()).add( new SecondDerivativeOp(direction, mesher).mult(0.5 * model.sigma() * model.sigma() * new Vector(mesher.layout().size(), 1.0)))); mapT_ = new TripleBandLinearOp(direction, mesher); direction_ = direction; model_ = model; }
public FdmBlackScholesOp(FdmMesher mesher, GeneralizedBlackScholesProcess bsProcess, double strike, bool localVol = false, double?illegalLocalVolOverwrite = null, int direction = 0) { mesher_ = mesher; rTS_ = bsProcess.riskFreeRate().currentLink(); qTS_ = bsProcess.dividendYield().currentLink(); volTS_ = bsProcess.blackVolatility().currentLink(); localVol_ = (localVol) ? bsProcess.localVolatility().currentLink() : null; x_ = (localVol) ? new Vector(Vector.Exp(mesher.locations(direction))) : null; dxMap_ = new FirstDerivativeOp(direction, mesher); dxxMap_ = new SecondDerivativeOp(direction, mesher); mapT_ = new TripleBandLinearOp(direction, mesher); strike_ = strike; illegalLocalVolOverwrite_ = illegalLocalVolOverwrite; direction_ = direction; }