/src/quantlib/ql/math/integrals/gaussianquadratures.hpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | |
3 | | /* |
4 | | Copyright (C) 2005 Klaus Spanderen |
5 | | Copyright (C) 2005 Gary Kennedy |
6 | | |
7 | | This file is part of QuantLib, a free-software/open-source library |
8 | | for financial quantitative analysts and developers - http://quantlib.org/ |
9 | | |
10 | | QuantLib is free software: you can redistribute it and/or modify it |
11 | | under the terms of the QuantLib license. You should have received a |
12 | | copy of the license along with this program; if not, please email |
13 | | <quantlib-dev@lists.sf.net>. The license is also available online at |
14 | | <http://quantlib.org/license.shtml>. |
15 | | |
16 | | This program is distributed in the hope that it will be useful, but WITHOUT |
17 | | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
18 | | FOR A PARTICULAR PURPOSE. See the license for more details. |
19 | | */ |
20 | | |
21 | | /*! \file gaussianquadratures.hpp |
22 | | \brief Integral of a 1-dimensional function using the Gauss quadratures |
23 | | */ |
24 | | |
25 | | #ifndef quantlib_gaussian_quadratures_hpp |
26 | | #define quantlib_gaussian_quadratures_hpp |
27 | | |
28 | | #include <ql/math/array.hpp> |
29 | | #include <ql/math/integrals/integral.hpp> |
30 | | #include <ql/math/integrals/gaussianorthogonalpolynomial.hpp> |
31 | | |
32 | | namespace QuantLib { |
33 | | class GaussianOrthogonalPolynomial; |
34 | | |
35 | | //! Integral of a 1-dimensional function using the Gauss quadratures method |
36 | | /*! References: |
37 | | Gauss quadratures and orthogonal polynomials |
38 | | |
39 | | G.H. Gloub and J.H. Welsch: Calculation of Gauss quadrature rule. |
40 | | Math. Comput. 23 (1986), 221-230 |
41 | | |
42 | | "Numerical Recipes in C", 2nd edition, |
43 | | Press, Teukolsky, Vetterling, Flannery, |
44 | | |
45 | | \test the correctness of the result is tested by checking it |
46 | | against known good values. |
47 | | */ |
48 | | class GaussianQuadrature { |
49 | | public: |
50 | | GaussianQuadrature(Size n, |
51 | | const GaussianOrthogonalPolynomial& p); |
52 | | |
53 | | #if defined(__GNUC__) && (__GNUC__ >= 7) |
54 | | #pragma GCC diagnostic push |
55 | | #pragma GCC diagnostic ignored "-Wnoexcept-type" |
56 | | #endif |
57 | | |
58 | | template <class F> |
59 | 0 | Real operator()(const F& f) const { |
60 | 0 | Real sum = 0.0; |
61 | 0 | for (Integer i = Integer(order())-1; i >= 0; --i) { |
62 | 0 | sum += w_[i] * f(x_[i]); |
63 | 0 | } |
64 | 0 | return sum; |
65 | 0 | } Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::AnalyticContinuousGeometricAveragePriceAsianHestonEngine::DcfIntegrand>(QuantLib::AnalyticContinuousGeometricAveragePriceAsianHestonEngine::DcfIntegrand const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::AnalyticContinuousGeometricAveragePriceAsianHestonEngine::Integrand>(QuantLib::AnalyticContinuousGeometricAveragePriceAsianHestonEngine::Integrand const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::AnalyticDiscreteGeometricAveragePriceAsianHestonEngine::Integrand>(QuantLib::AnalyticDiscreteGeometricAveragePriceAsianHestonEngine::Integrand const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::LognormalCmsSpreadPricer::integrand_f>(QuantLib::LognormalCmsSpreadPricer::integrand_f const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::operator()<double>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::operator()<double>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::integrate<double>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::integrate<double>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::P12Integrand>(QuantLib::P12Integrand const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::P12HatIntegrand>(QuantLib::P12HatIntegrand const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<15>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<15>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<14>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<14>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<13>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<13>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<12>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<12>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<11>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<11>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<10>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<10>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<9>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<9>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<8>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<8>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<7>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<7>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<6>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<6>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<5>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<5>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<4>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<4>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<3>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<3>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<2>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<2>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussLegendreIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1}>(QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussLegendreIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshevIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1}>(QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshevIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshev2ndIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1}>(QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshev2ndIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1} const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::FdmBatesOp::IntegroIntegrand>(QuantLib::FdmBatesOp::IntegroIntegrand const&) const Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<std::__1::function<double (double)> >(std::__1::function<double (double)> const&) const Unexecuted instantiation: analytichestonengine.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::integrand1>(QuantLib::(anonymous namespace)::integrand1 const&) const Unexecuted instantiation: hestonprocess.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::cdf_nu_ds(QuantLib::HestonProcess const&, double, double, double, double, QuantLib::HestonProcess::Discretization)::$_0>(QuantLib::(anonymous namespace)::cdf_nu_ds(QuantLib::HestonProcess const&, double, double, double, double, QuantLib::HestonProcess::Discretization)::$_0 const&) const Unexecuted instantiation: hestonprocess.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::int_ph(QuantLib::HestonProcess const&, double, double, double, double, double, double)::$_0>(QuantLib::(anonymous namespace)::int_ph(QuantLib::HestonProcess const&, double, double, double, double, double, double)::$_0 const&) const Unexecuted instantiation: defaultdensitystructure.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::t_remapper<QuantLib::DefaultDensityStructure::survivalProbabilityImpl(double) const::$_0> >(QuantLib::(anonymous namespace)::t_remapper<QuantLib::DefaultDensityStructure::survivalProbabilityImpl(double) const::$_0> const&) const Unexecuted instantiation: hazardratestructure.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::remapper<QuantLib::HazardRateStructure::survivalProbabilityImpl(double) const::$_0> >(QuantLib::(anonymous namespace)::remapper<QuantLib::HazardRateStructure::survivalProbabilityImpl(double) const::$_0> const&) const |
66 | | |
67 | | #if defined(__GNUC__) && (__GNUC__ >= 7) |
68 | | #pragma GCC diagnostic pop |
69 | | #endif |
70 | | |
71 | 0 | Size order() const { return x_.size(); } |
72 | 0 | const Array& weights() { return w_; } |
73 | 0 | const Array& x() { return x_; } |
74 | | |
75 | | protected: |
76 | | Array x_, w_; |
77 | | }; |
78 | | |
79 | | class MultiDimGaussianIntegration { |
80 | | public: |
81 | | MultiDimGaussianIntegration( |
82 | | const std::vector<Size>& ns, |
83 | | const std::function<ext::shared_ptr<GaussianQuadrature>(Size)>& genQuad); |
84 | | |
85 | | Real operator()(const std::function<Real(Array)>& f) const; |
86 | | |
87 | 0 | const Array& weights() const { return weights_; } |
88 | 0 | const std::vector<Array>& x() const { return x_; } |
89 | | |
90 | | private: |
91 | | Array weights_; |
92 | | std::vector<Array> x_; |
93 | | }; |
94 | | |
95 | | |
96 | | //! generalized Gauss-Laguerre integration |
97 | | /*! This class performs a 1-dimensional Gauss-Laguerre integration. |
98 | | \f[ |
99 | | \int_{0}^{\inf} f(x) \mathrm{d}x |
100 | | \f] |
101 | | The weighting function is |
102 | | \f[ |
103 | | w(x;s)=x^s \exp{-x} |
104 | | \f] |
105 | | and \f[ s > -1 \f] |
106 | | */ |
107 | | class GaussLaguerreIntegration : public GaussianQuadrature { |
108 | | public: |
109 | | explicit GaussLaguerreIntegration(Size n, Real s = 0.0) |
110 | 0 | : GaussianQuadrature(n, GaussLaguerrePolynomial(s)) {} |
111 | | }; |
112 | | |
113 | | //! generalized Gauss-Hermite integration |
114 | | /*! This class performs a 1-dimensional Gauss-Hermite integration. |
115 | | \f[ |
116 | | \int_{-\inf}^{\inf} f(x) \mathrm{d}x |
117 | | \f] |
118 | | The weighting function is |
119 | | \f[ |
120 | | w(x;\mu)=|x|^{2\mu} \exp{-x*x} |
121 | | \f] |
122 | | and \f[ \mu > -0.5 \f] |
123 | | */ |
124 | | class GaussHermiteIntegration : public GaussianQuadrature { |
125 | | public: |
126 | | explicit GaussHermiteIntegration(Size n, Real mu = 0.0) |
127 | 0 | : GaussianQuadrature(n, GaussHermitePolynomial(mu)) {} |
128 | | }; |
129 | | |
130 | | //! Gauss-Jacobi integration |
131 | | /*! This class performs a 1-dimensional Gauss-Jacobi integration. |
132 | | \f[ |
133 | | \int_{-1}^{1} f(x) \mathrm{d}x |
134 | | \f] |
135 | | The weighting function is |
136 | | \f[ |
137 | | w(x;\alpha,\beta)=(1-x)^\alpha (1+x)^\beta |
138 | | \f] |
139 | | */ |
140 | | class GaussJacobiIntegration : public GaussianQuadrature { |
141 | | public: |
142 | | GaussJacobiIntegration(Size n, Real alpha, Real beta) |
143 | 0 | : GaussianQuadrature(n, GaussJacobiPolynomial(alpha, beta)) {} |
144 | | }; |
145 | | |
146 | | //! Gauss-Hyperbolic integration |
147 | | /*! This class performs a 1-dimensional Gauss-Hyperbolic integration. |
148 | | \f[ |
149 | | \int_{-\inf}^{\inf} f(x) \mathrm{d}x |
150 | | \f] |
151 | | The weighting function is |
152 | | \f[ |
153 | | w(x)=1/cosh(x) |
154 | | \f] |
155 | | */ |
156 | | class GaussHyperbolicIntegration : public GaussianQuadrature { |
157 | | public: |
158 | | explicit GaussHyperbolicIntegration(Size n) |
159 | 0 | : GaussianQuadrature(n, GaussHyperbolicPolynomial()) {} |
160 | | }; |
161 | | |
162 | | //! Gauss-Legendre integration |
163 | | /*! This class performs a 1-dimensional Gauss-Legendre integration. |
164 | | \f[ |
165 | | \int_{-1}^{1} f(x) \mathrm{d}x |
166 | | \f] |
167 | | The weighting function is |
168 | | \f[ |
169 | | w(x)=1 |
170 | | \f] |
171 | | */ |
172 | | class GaussLegendreIntegration : public GaussianQuadrature { |
173 | | public: |
174 | | explicit GaussLegendreIntegration(Size n) |
175 | 0 | : GaussianQuadrature(n, GaussJacobiPolynomial(0.0, 0.0)) {} |
176 | | }; |
177 | | |
178 | | //! Gauss-Chebyshev integration |
179 | | /*! This class performs a 1-dimensional Gauss-Chebyshev integration. |
180 | | \f[ |
181 | | \int_{-1}^{1} f(x) \mathrm{d}x |
182 | | \f] |
183 | | The weighting function is |
184 | | \f[ |
185 | | w(x)=(1-x^2)^{-1/2} |
186 | | \f] |
187 | | */ |
188 | | class GaussChebyshevIntegration : public GaussianQuadrature { |
189 | | public: |
190 | | explicit GaussChebyshevIntegration(Size n) |
191 | 0 | : GaussianQuadrature(n, GaussJacobiPolynomial(-0.5, -0.5)) {} |
192 | | }; |
193 | | |
194 | | //! Gauss-Chebyshev integration (second kind) |
195 | | /*! This class performs a 1-dimensional Gauss-Chebyshev integration. |
196 | | \f[ |
197 | | \int_{-1}^{1} f(x) \mathrm{d}x |
198 | | \f] |
199 | | The weighting function is |
200 | | \f[ |
201 | | w(x)=(1-x^2)^{1/2} |
202 | | \f] |
203 | | */ |
204 | | class GaussChebyshev2ndIntegration : public GaussianQuadrature { |
205 | | public: |
206 | | explicit GaussChebyshev2ndIntegration(Size n) |
207 | 0 | : GaussianQuadrature(n, GaussJacobiPolynomial(0.5, 0.5)) {} |
208 | | }; |
209 | | |
210 | | //! Gauss-Gegenbauer integration |
211 | | /*! This class performs a 1-dimensional Gauss-Gegenbauer integration. |
212 | | \f[ |
213 | | \int_{-1}^{1} f(x) \mathrm{d}x |
214 | | \f] |
215 | | The weighting function is |
216 | | \f[ |
217 | | w(x)=(1-x^2)^{\lambda-1/2} |
218 | | \f] |
219 | | */ |
220 | | class GaussGegenbauerIntegration : public GaussianQuadrature { |
221 | | public: |
222 | | GaussGegenbauerIntegration(Size n, Real lambda) |
223 | | : GaussianQuadrature(n, GaussJacobiPolynomial(lambda-0.5, lambda-0.5)) |
224 | 0 | {} |
225 | | }; |
226 | | |
227 | | |
228 | | namespace detail { |
229 | | template <class Integration> |
230 | | class GaussianQuadratureIntegrator: public Integrator { |
231 | | public: |
232 | | explicit GaussianQuadratureIntegrator(Size n); |
233 | | |
234 | 0 | ext::shared_ptr<Integration> getIntegration() const { return integration_; } Unexecuted instantiation: QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussLegendreIntegration>::getIntegration() const Unexecuted instantiation: QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshevIntegration>::getIntegration() const Unexecuted instantiation: QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshev2ndIntegration>::getIntegration() const |
235 | | |
236 | | private: |
237 | | Real integrate(const std::function<Real (Real)>& f, |
238 | | Real a, |
239 | | Real b) const override; |
240 | | |
241 | | const ext::shared_ptr<Integration> integration_; |
242 | | }; |
243 | | } |
244 | | |
245 | | typedef detail::GaussianQuadratureIntegrator<GaussLegendreIntegration> |
246 | | GaussLegendreIntegrator; |
247 | | |
248 | | typedef detail::GaussianQuadratureIntegrator<GaussChebyshevIntegration> |
249 | | GaussChebyshevIntegrator; |
250 | | |
251 | | typedef detail::GaussianQuadratureIntegrator<GaussChebyshev2ndIntegration> |
252 | | GaussChebyshev2ndIntegrator; |
253 | | |
254 | | //! tabulated Gauss-Legendre quadratures |
255 | | class TabulatedGaussLegendre { |
256 | | public: |
257 | 0 | explicit TabulatedGaussLegendre(Size n = 20) { order(n); } |
258 | | template <class F> |
259 | 0 | Real operator() (const F& f) const { |
260 | 0 | QL_ASSERT(w_ != nullptr, "Null weights"); |
261 | 0 | QL_ASSERT(x_ != nullptr, "Null abscissas"); |
262 | 0 | Size startIdx; |
263 | 0 | Real val; |
264 | |
|
265 | 0 | const Size isOrderOdd = order_ & 1; |
266 | |
|
267 | 0 | if (isOrderOdd) { |
268 | 0 | QL_ASSERT((n_>0), "assume at least 1 point in quadrature"); |
269 | 0 | val = w_[0]*f(x_[0]); |
270 | 0 | startIdx=1; |
271 | 0 | } else { |
272 | 0 | val = 0.0; |
273 | 0 | startIdx=0; |
274 | 0 | } |
275 | | |
276 | 0 | for (Size i=startIdx; i<n_; ++i) { |
277 | 0 | val += w_[i]*f( x_[i]); |
278 | 0 | val += w_[i]*f(-x_[i]); |
279 | 0 | } |
280 | 0 | return val; |
281 | 0 | } Unexecuted instantiation: bivariatenormaldistribution.cpp:double QuantLib::TabulatedGaussLegendre::operator()<QuantLib::(anonymous namespace)::eqn3>(QuantLib::(anonymous namespace)::eqn3 const&) const Unexecuted instantiation: bivariatenormaldistribution.cpp:double QuantLib::TabulatedGaussLegendre::operator()<QuantLib::(anonymous namespace)::eqn6>(QuantLib::(anonymous namespace)::eqn6 const&) const |
282 | | |
283 | | void order(Size); |
284 | 0 | Size order() const { return order_; } |
285 | | |
286 | | private: |
287 | | Size order_; |
288 | | |
289 | | const Real* w_; |
290 | | const Real* x_; |
291 | | Size n_; |
292 | | |
293 | | static const Real w6[3]; |
294 | | static const Real x6[3]; |
295 | | static const Size n6; |
296 | | |
297 | | static const Real w7[4]; |
298 | | static const Real x7[4]; |
299 | | static const Size n7; |
300 | | |
301 | | static const Real w12[6]; |
302 | | static const Real x12[6]; |
303 | | static const Size n12; |
304 | | |
305 | | static const Real w20[10]; |
306 | | static const Real x20[10]; |
307 | | static const Size n20; |
308 | | }; |
309 | | |
310 | | } |
311 | | |
312 | | #endif |