1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2021 Klaus Spanderen
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
<quantlib-dev@lists.sf.net>. The license is also available online at
<http://quantlib.org/license.shtml>.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
*/
#include <ql/math/interpolations/lagrangeinterpolation.hpp>
#include <ql/math/interpolations/chebyshevinterpolation.hpp>
namespace QuantLib {
namespace chebyshev_interpolation_detail {
Array apply(const Array& x, const ext::function<Real(Real)>& f) {
Array t(x.size());
std::transform(std::begin(x), std::end(x), std::begin(t), f);
return t;
}
}
ChebyshevInterpolation::ChebyshevInterpolation(
const Array& y, PointsType pointsType)
: x_(ChebyshevInterpolation::nodes(y.size(), pointsType)), y_(y) {
impl_ = ext::make_shared<detail::LagrangeInterpolationImpl<
Array::const_iterator, Array::const_iterator> >(
std::begin(x_), std::end(x_), std::begin(y_)
);
impl_->update();
}
ChebyshevInterpolation::ChebyshevInterpolation(
Size n, const ext::function<Real(Real)>& f, PointsType pointsType)
: ChebyshevInterpolation(
chebyshev_interpolation_detail::apply(
ChebyshevInterpolation::nodes(n, pointsType), f),
pointsType) {
}
Array ChebyshevInterpolation::nodes() const {
return x_;
}
Array ChebyshevInterpolation::nodes(Size n, PointsType pointsType) {
Array t(n);
switch(pointsType) {
case FirstKind:
for (Size i=0; i < n; ++i)
t[i] = -std::cos((i+0.5)*M_PI/n);
break;
case SecondKind:
for (Size i=0; i < n; ++i)
t[i] = -std::cos(i*M_PI/(n-1));
break;
default:
QL_FAIL("unknonw Chebyshev interpolation points type");
}
return t;
}
void ChebyshevInterpolation::updateY(const Array& y) {
QL_REQUIRE(y.size() == y_.size(),
"interpolation override has the wrong length");
std::copy(y.begin(), y.end(), y_.begin());
}
}
|