1 # ifndef CPPAD_UTILITY_ROMBERG_MUL_HPP
2 # define CPPAD_UTILITY_ROMBERG_MUL_HPP
174 template <
class Fun,
class FloatVector>
182 SliceLast( Fun *F_,
size_t last_,
const FloatVector &x_ )
185 for(i = 0; i <
last; i++)
194 template <
class Fun,
class SizeVector,
class FloatVector,
class Float>
210 const FloatVector &a_ ,
211 const FloatVector &b_ ,
212 const SizeVector &n_ ,
213 const SizeVector &p_ )
214 :
F(F_) ,
last(last_),
a(a_) ,
b(b_) ,
n(n_) ,
p(p_)
220 S,
a[
last],
b[last],
n[last],
p[last], e
237 template <
class Fun,
class SizeVector,
class FloatVector,
size_t m>
245 const FloatVector &a ,
246 const FloatVector &b ,
247 const SizeVector &n ,
248 const SizeVector &p ,
256 Float > IntegrateOne;
258 IntegrateOne Fm1(&F, m-1, a, b, n, p);
268 r = RombergMulM1(Fm1, a, b, n, p, e);
273 for(i = 0; i < m-1; i++)
274 { prod *= (b[i] - a[i]);
275 for(j = 0; j < (n[i] - 1); j++)
278 assert( Fm1.GetEcount() == (pow2+1) );
280 e = e + Fm1.GetEsum() * prod /
Float(
double(Fm1.GetEcount()) );
286 template <
class Fun,
class SizeVector,
class FloatVector>
292 const FloatVector &a ,
293 const FloatVector &b ,
294 const SizeVector &n ,
295 const SizeVector &p ,
302 Float > IntegrateOne;
305 CheckSimpleVector<Float, FloatVector>();
308 CheckNumericType<Float>();
310 IntegrateOne F0(&F, 0, a, b, n, p);
317 assert( F0.GetEcount() == 1 );
FloatVector::value_type Float
SliceLast(Fun *F_, size_t last_, const FloatVector &x_)
double operator()(const Float &xlast)
Float operator()(const FloatVector &x)
Float operator()(Fun &F, const FloatVector &a, const FloatVector &b, const SizeVector &n, const SizeVector &p, Float &e)
Float RombergOne(Fun &F, const Float &a, const Float &b, size_t n, size_t p, Float &e)
FloatVector::value_type Float
IntegrateLast(Fun *F_, size_t last_, const FloatVector &a_, const FloatVector &b_, const SizeVector &n_, const SizeVector &p_)
FloatVector::value_type Float