Index: trunk/npstat/nm/FejerQuadrature.icc =================================================================== --- trunk/npstat/nm/FejerQuadrature.icc (revision 576) +++ trunk/npstat/nm/FejerQuadrature.icc (revision 577) @@ -1,51 +1,51 @@ #include #include namespace npstat { template inline long double FejerQuadrature::integrate( const Functor1& function, const long double left, const long double right) const { if (buf_.size() != npoints_) buf_.resize(npoints_); std::pair* results = &buf_[0]; const long double midpoint = (left + right)/2.0L; const long double unit = (right - left)/2.0L; FcnArg a; long double v; for (unsigned i=0; i(midpoint + unit*a_[i]); v = w_[i]*static_cast(function(a)); results[i].first = std::abs(v); results[i].second = v; } std::sort(buf_.begin(), buf_.end()); v = 0.0L; for (unsigned i=0; i inline std::vector > FejerQuadrature::weightedIntegrationPoints( const Functor& weight, const long double left, const long double right) const { typedef std::pair DDPair; std::vector result; result.reserve(npoints_); const long double midpoint = (left + right)/2.0L; const long double unit = (right - left)/2.0L; for (unsigned i=0; i #include #include namespace npstat { template inline long double GaussLegendreQuadrature::integrate( const Functor1& function, const long double left, const long double right) const { if (buf_.size() != npoints_) buf_.resize(npoints_); std::pair* results = &buf_[0]; const unsigned halfpoints = npoints_/2; const long double midpoint = (left + right)/2.0L; const long double unit = (right - left)/2.0L; FcnArg a; long double v; for (unsigned i=0; i(midpoint + unit*a_[i]); v = w_[i]*static_cast(function(a)); results[2*i].first = std::abs(v); results[2*i].second = v; a = static_cast(midpoint - unit*a_[i]); v = w_[i]*static_cast(function(a)); results[2*i+1].first = std::abs(v); results[2*i+1].second = v; } std::sort(buf_.begin(), buf_.end()); v = 0.0L; for (unsigned i=0; i inline long double GaussLegendreQuadrature::integrate( const Functor1& function, const long double left, const long double right, const unsigned nsplit) const { if (!nsplit) throw std::invalid_argument( "In npstat::GaussLegendreQuadrature::integrate: " "number of subintervals must be positive"); const long double step = (right - left)/nsplit; long double acc = 0.0L; for (unsigned i=0; i inline std::vector > GaussLegendreQuadrature::weightedIntegrationPoints( const Functor& weight, const long double left, const long double right) const { typedef std::pair DDPair; std::vector result; result.reserve(npoints_); const unsigned halfpoints = npoints_/2; const long double midpoint = (left + right)/2.0L; const long double unit = (right - left)/2.0L; for (unsigned i=0; i