Exemplo n.º 1
0
Disposable<Array> FdmExtOUJumpOp::integro(const Array& r) const {
    Array integral(r.size());
    const boost::shared_ptr<FdmLinearOpLayout> layout = mesher_->layout();
    const Size extraDims=layout->size()/(layout->dim()[0]*layout->dim()[1]);

    std::vector<Array>  y(extraDims, Array(layout->dim()[1]));
    std::vector<Matrix> f(extraDims,
                          Matrix(layout->dim()[1], layout->dim()[0]));

    const FdmLinearOpIterator endIter = layout->end();
    for (FdmLinearOpIterator iter = layout->begin(); iter != endIter;
            ++iter) {
        const Size i = iter.coordinates()[0];
        const Size j = iter.coordinates()[1];
        const Size k = iter.index() / (layout->dim()[0]*layout->dim()[1]);

        y[k][j]    = mesher_->location(iter, 1);
        f[k][j][i] = r[iter.index()];
    }
    std::vector<std::vector<boost::shared_ptr<LinearInterpolation> > >
    interpl(extraDims, std::vector<
            boost::shared_ptr<LinearInterpolation> >(f[0].columns()));

    for (Size k=0; k < extraDims; ++k) {
        for (Size i=0; i < f[k].columns(); ++i) {
            interpl[k][i] = boost::shared_ptr<LinearInterpolation>(
                                new LinearInterpolation(y[k].begin(), y[k].end(),
                                        f[k].column_begin(i)));
        }
    }

    const Real eta = process_->eta();

    for (FdmLinearOpIterator iter=layout->begin(); iter!=endIter; ++iter) {
        const Size i = iter.coordinates()[0];
        const Size j = iter.coordinates()[1];
        const Size k = iter.index() / (layout->dim()[0]*layout->dim()[1]);

        integral[iter.index()] = gaussLaguerreIntegration_(
                                     IntegroIntegrand(interpl[k][i], bcSet_, y[k][j], eta));
    }

    return process_->jumpIntensity()*(integral-r);
}
Exemplo n.º 2
0
    Disposable<Array> FdmBatesOp::integro(const Array& r) const {
        const shared_ptr<FdmLinearOpLayout> layout = mesher_->layout();
        
        QL_REQUIRE(layout->dim().size() == 2, "invalid layout dimension");

        Array x(layout->dim()[0]);
        Matrix f(layout->dim()[1], layout->dim()[0]);
        
        const FdmLinearOpIterator endIter = layout->end();
        for (FdmLinearOpIterator iter = layout->begin(); iter != endIter;
            ++iter) {
            const Size i = iter.coordinates()[0];
            const Size j = iter.coordinates()[1];
            
            x[i]    = mesher_->location(iter, 0);
            f[j][i] = r[iter.index()];
            
        }
        std::vector<shared_ptr<LinearInterpolation> > interpl(f.rows());
        for (Size i=0; i < f.rows(); ++i) {
            interpl[i] = shared_ptr<LinearInterpolation>(
                new LinearInterpolation(x.begin(), x.end(), f.row_begin(i)));
        }
        
        Array integral(r.size());
        for (FdmLinearOpIterator iter=layout->begin(); iter!=endIter; ++iter) {
            const Size i = iter.coordinates()[0];
            const Size j = iter.coordinates()[1];

            integral[iter.index()] = M_1_SQRTPI* 
                gaussHermiteIntegration_(
                      IntegroIntegrand(interpl[j], bcSet_, x[i], delta_, nu_));
        }

        return lambda_*(integral-r);
    }