struct Quadrature{ Int n; virtual Doub next() = 0; }; template struct Trapzd : Quadrature { Doub a,b,s; T &func; Trapzd() {}; Trapzd(T &funcc, const Doub aa, const Doub bb) : func(funcc), a(aa), b(bb) {n=0;} Doub next() { Doub x,tnm,sum,del; Int it,j; n++; if (n == 1) { return (s=0.5*(b-a)*(func(a)+func(b))); } else { for (it=1,j=1;j Doub qtrap(T &func, const Doub a, const Doub b, const Doub eps=1.0e-10) { const Int JMAX=20; Doub s,olds=0.0; Trapzd t(func,a,b); for (Int j=0;j 5) if (abs(s-olds) < eps*abs(olds) || (s == 0.0 && olds == 0.0)) return s; olds=s; } throw("Too many steps in routine qtrap"); } template Doub qsimp(T &func, const Doub a, const Doub b, const Doub eps=1.0e-10) { const Int JMAX=20; Doub s,st,ost=0.0,os=0.0; Trapzd t(func,a,b); for (Int j=0;j 5) if (abs(s-os) < eps*abs(os) || (s == 0.0 && os == 0.0)) return s; os=s; ost=st; } throw("Too many steps in routine qsimp"); } template struct Midpnt : Quadrature { Doub a,b,s; T &funk; Midpnt(T &funcc, const Doub aa, const Doub bb) : funk(funcc), a(aa), b(bb) {n=0;} Doub next(){ Int it,j; Doub x,tnm,sum,del,ddel; n++; if (n == 1) { return (s=(b-a)*func(0.5*(a+b))); } else { for(it=1,j=1;j struct Midinf : Midpnt{ Doub func(const Doub x) { return Midpnt::funk(1.0/x)/(x*x); } Midinf(T &funcc, const Doub aa, const Doub bb) : Midpnt(funcc, aa, bb) { Midpnt::a=1.0/bb; Midpnt::b=1.0/aa; } }; template struct Midsql : Midpnt{ Doub aorig; Doub func(const Doub x) { return 2.0*x*Midpnt::funk(aorig+x*x); } Midsql(T &funcc, const Doub aa, const Doub bb) : Midpnt(funcc, aa, bb), aorig(aa) { Midpnt::a=0; Midpnt::b=sqrt(bb-aa); } }; template struct Midsqu : Midpnt{ Doub borig; Doub func(const Doub x) { return 2.0*x*Midpnt::funk(borig-x*x); } Midsqu(T &funcc, const Doub aa, const Doub bb) : Midpnt(funcc, aa, bb), borig(bb) { Midpnt::a=0; Midpnt::b=sqrt(bb-aa); } }; template struct Midexp : Midpnt{ Doub func(const Doub x) { return Midpnt::funk(-log(x))/x; } Midexp(T &funcc, const Doub aa, const Doub bb) : Midpnt(funcc, aa, bb) { Midpnt::a=0.0; Midpnt::b=exp(-aa); } };