13 #ifndef eli_mutil_quad_simpson_hpp
14 #define eli_mutil_quad_simpson_hpp
18 #include "eli/code_eli.hpp"
26 template<
typename data__>
37 tolerance=std::sqrt(std::numeric_limits<data__>::epsilon());
43 coarse_value=std::numeric_limits<data__>::quiet_NaN();
44 fine_value=std::numeric_limits<data__>::quiet_NaN();
45 approximate_error=std::numeric_limits<data__>::quiet_NaN();
56 size_t order()
const {
return 4;}
68 template<
typename yit__>
69 data__
operator()(
const data__ &dx, yit__ yb, yit__ ye)
const
75 return static_cast<data__
>(0);
82 return ((*ym1)-(*yb))/dx;
90 rtnval+=4*(*ym1)+2*(*y);
117 rtnval+=5*(*y)/4+2*(*ym1)-(*ym2)/4;
121 rtnval*=dx/
static_cast<data__
>(3);
137 template<
typename xit__,
typename yit__>
140 data__ rtnval(0), delta;
142 yit__ ym1(yb), y(yb), yp1(yb);
150 return static_cast<data__
>(0);
152 return static_cast<data__
>(0);
156 return ((*y)-(*yb))/((*x)-(*xm1));
160 for (; (yp1!=ye) && (y!=ye); ++xm1, ++x, ++xp1, ++ym1, ++y, ++yp1)
162 delta=((*x)-(*xm1))/((*xp1)-(*x));
163 rtnval+=(((*xp1)-(*x))/6)*(1+1/delta)*((delta*(2-delta))*(*yp1)+(1+delta)*(1+delta)*(*y)+(2*delta-1)*(*ym1));
182 delta=((*x)-(*xm1))/((*xp1)-(*x));
183 rtnval+=(((*xp1)-(*x))/6)*(((2+3*delta)/(1+delta))*(*yp1)+(3+1/delta)*(*y)-(1/(delta*(1+delta)))*(*ym1));
199 template<
typename f__>
200 data__
operator()(f__ fun,
const data__ &x0,
const data__ &x1)
const
218 template<
typename f__>
219 data__
operator()(f__ fun,
const data__ &x0,
const data__ &x1,
const data__ &tol,
const size_t &max_depth)
const
242 template<
typename f__>
274 data__
simple(
const data__ &a,
const data__ &b,
const data__ f[])
const
276 return((b-a)/6)*(f[0]+4*f[1]+f[2]);
279 template<
typename f__>
282 data__ xf[5], ff[5], sf1, sf2;
291 xf[1]=(xc[0]+xc[1])/2;
293 xf[3]=(xc[1]+xc[2])/2;
303 sf1=
simple(xf[0], xf[2], &(ff[0]));
304 sf2=
simple(xf[2], xf[4], &(ff[2]));
313 ap1.function_count=0;
314 ap1.tolerance/=ap1.tol_factor;
315 ap1.coarse_value=sf1;
data__ operator()(f__ fun, const data__ &x0, const data__ &x1) const
Definition: simpson.hpp:200
data__ operator()(xit__ x, yit__ yb, yit__ ye) const
Definition: simpson.hpp:138
data__ coarse_value
Definition: simpson.hpp:33
simpson(const simpson< data__ > &)
Definition: simpson.hpp:51
size_t order() const
Definition: simpson.hpp:56
simpson()
Definition: simpson.hpp:50
data__ tolerance
Definition: simpson.hpp:33
adaptive_params()
Definition: simpson.hpp:35
size_t function_count
Definition: simpson.hpp:32
data__ tol_factor
Definition: simpson.hpp:33
Definition: simpson.hpp:30
data__ operator()(f__ fun, const data__ &x0, const data__ &x1, typename simpson< data__ >::adaptive_params &ap) const
Definition: simpson.hpp:243
void internal_recurse(f__ &fun, const data__ xc[], const data__ fc[], typename simpson< data__ >::adaptive_params &ap) const
Definition: simpson.hpp:280
data__ simple(const data__ &a, const data__ &b, const data__ f[]) const
Definition: simpson.hpp:274
data__ operator()(f__ fun, const data__ &x0, const data__ &x1, const data__ &tol, const size_t &max_depth) const
Definition: simpson.hpp:219
size_t recursion_depth
Definition: simpson.hpp:32
data__ operator()(const data__ &dx, yit__ yb, yit__ ye) const
Definition: simpson.hpp:69
~simpson()
Definition: simpson.hpp:52
simpson< data__ > & operator=(const simpson< data__ > &)
Definition: simpson.hpp:54
data__ approximate_error
Definition: simpson.hpp:33
data__ error_factor
Definition: simpson.hpp:33
size_t max_depth
Definition: simpson.hpp:32
Definition: simpson.hpp:27
data__ fine_value
Definition: simpson.hpp:33