void Fdm2DimSolver::performCalculations() const { Array rhs(initialValues_.size()); std::copy(initialValues_.begin(), initialValues_.end(), rhs.begin()); FdmBackwardSolver(op_, solverDesc_.bcSet, conditions_, schemeDesc_) .rollback(rhs, solverDesc_.maturity, 0.0, solverDesc_.timeSteps, solverDesc_.dampingSteps); std::copy(rhs.begin(), rhs.end(), resultValues_.begin()); interpolation_ = boost::shared_ptr<BicubicSpline> ( new BicubicSpline(x_.begin(), x_.end(), y_.begin(), y_.end(), resultValues_)); }
void Fdm3DimSolver::performCalculations() const { Array rhs(initialValues_.size()); std::copy(initialValues_.begin(), initialValues_.end(), rhs.begin()); FdmBackwardSolver(op_, solverDesc_.bcSet, conditions_, schemeDesc_) .rollback(rhs, solverDesc_.maturity, 0.0, solverDesc_.timeSteps, solverDesc_.dampingSteps); for (Size i=0; i < z_.size(); ++i) { std::copy(rhs.begin()+i *y_.size()*x_.size(), rhs.begin()+(i+1)*y_.size()*x_.size(), resultValues_[i].begin()); interpolation_[i] = boost::make_shared<BicubicSpline>(x_.begin(), x_.end(), y_.begin(), y_.end(), resultValues_[i]); } }
void FdmHestonSolver::performCalculations() const { boost::shared_ptr<FdmHestonOp> map( new FdmHestonOp( mesher_, process_.currentLink(), (!quantoHelper_.empty()) ? quantoHelper_.currentLink() : boost::shared_ptr<FdmQuantoHelper>())); Array rhs(initialValues_.size()); std::copy(initialValues_.begin(), initialValues_.end(), rhs.begin()); FdmBackwardSolver(map, bcSet_, condition_, schemeType_, theta_, mu_) .rollback(rhs, maturity_, 0.0, timeSteps_, dampingSteps_); std::copy(rhs.begin(), rhs.end(), resultValues_.begin()); interpolation_ = boost::shared_ptr<BicubicSpline> ( new BicubicSpline(x_.begin(), x_.end(), v_.begin(), v_.end(), resultValues_)); }
template <Size N> inline void FdmNdimSolver<N>::performCalculations() const { Array rhs(initialValues_.size()); std::copy(initialValues_.begin(), initialValues_.end(), rhs.begin()); FdmBackwardSolver(op_, solverDesc_.bcSet, conditions_, schemeDesc_) .rollback(rhs, solverDesc_.maturity, 0.0, solverDesc_.timeSteps, solverDesc_.dampingSteps); const boost::shared_ptr<FdmLinearOpLayout> layout = solverDesc_.mesher->layout(); const FdmLinearOpIterator endIter = layout->end(); for (FdmLinearOpIterator iter = layout->begin(); iter != endIter; ++iter) { setValue(*f_, iter.coordinates(), rhs[iter.index()]); } interp_ = boost::shared_ptr<MultiCubicSpline<N> >( new MultiCubicSpline<N>(x_, *f_, extrapolation_)); }
void FdmHestonHullWhiteSolver::performCalculations() const { boost::shared_ptr<FdmLinearOpComposite> map( new FdmHestonHullWhiteOp(mesher_, hestonProcess_.currentLink(), hwProcess_.currentLink(), corrEquityShortRate_)); Array rhs(initialValues_.size()); std::copy(initialValues_.begin(), initialValues_.end(), rhs.begin()); FdmBackwardSolver(map, bcSet_, condition_, schemeType_, theta_, mu_) .rollback(rhs, maturity_, 0.0, timeSteps_, dampingSteps_); for (Size i=0; i < r_.size(); ++i) { std::copy(rhs.begin()+i *v_.size()*x_.size(), rhs.begin()+(i+1)*v_.size()*x_.size(), resultValues_[i].begin()); interpolation_[i] = boost::shared_ptr<BicubicSpline> ( new BicubicSpline(x_.begin(), x_.end(), v_.begin(), v_.end(), resultValues_[i])); } }