49 S = 0.5*(b-a)*(func(a) + func(b));
53 const double delta = (b-a)/it;
54 double x = a + 0.5*delta;
56 for (
j=0;
j<it;
j++) {
60 S = 0.5*(S + (b-a)*sum/it);
66static void polint(
const double xa[],
const double ya[],
int n,
double x,
double& y,
double& dy)
73 double C[nmax],D[nmax];
75 double dif = fabs(x-xa[0]);
77 double dift = fabs(x-xa[
i]);
87 for (m=0; m<n-1; m++) {
88 for (
i=0;
i<n-m-1;
i++) {
89 const double h0 = xa[
i] - x;
90 const double hp = xa[
i+m+1] - x;
91 const double W = C[
i+1] - D[
i];
108static void ratint(
const double xa[],
const double ya[],
int n,
double x,
double& y,
double& dy)
116 const double tiny = 1e-30;
117 double C[nmax],D[nmax];
119 for (
i=0;
i<n;
i++) {
135 for (m1=1; m1<n; m1++) {
136 for (
i=0;
i<n-m1;
i++) {
139 t = (xa[
i] - x)*D[
i]/h;
142 cerr <<
"*** Error in ratint\n";
151 y+= (dy = (2*(ns+1) < (n-m1) ? C[ns+1] : D[ns--]));
163 double result = 0, dresult = 0;
164 for (
j=1;
j<=jmax;
j++) {
168 k1 = (
j <
k) ?
j :
k;
169 polint(&H[
j-k1],&S[
j-k1],k1,0.,result,dresult);
170 if (fabs(dresult) < absacc) {
break;}
188 double result=0, result_pol=0, result_rat=0;
189 double dresult, dresult_pol = 0, dresult_rat, dresult_polrat;
190 for (
j=1;
j<=jmax;
j++) {
194 k1 = (
j <
k) ?
j :
k;
197 polint(&H[
j-k1],&S[
j-k1],k1,0.,result_pol,dresult_pol);
198 ratint(&H[
j-k1],&S[
j-k1],k1,0.,result_rat,dresult_rat);
199 dresult_pol = fabs(dresult_pol);
200 dresult_rat = fabs(dresult_rat);
201 dresult = (dresult_pol > dresult_rat ? dresult_pol : dresult_rat);
202 dresult_polrat = fabs(result_pol - result_rat);
203 if (dresult_polrat > dresult) dresult = dresult_polrat;
204 if (dresult < absacc) {
206 result = 0.5*(result_pol + result_rat);
222 return Romberg( std::bind(func, x, std::placeholders::_1),
c, d,absacc/(b-a));
224 return Romberg(Tinty,a,b,absacc);
228double Romberg(
const T3DFunction& func,
double a,
double b,
double c,
double d,
double e,
double f,
double absacc) {
230 return Romberg(std::bind(func, std::placeholders::_1, std::placeholders::_2, z), a,b,
c,d,absacc/(f-e));
232 return Romberg(Tintxy,e,f,absacc);
std::function< double(double, double)> T2DFunction
std::function< double(double, double, double)> T3DFunction
std::function< double(double)> T1DFunction
static void ratint(const double xa[], const double ya[], int n, double x, double &y, double &dy)
double Romberg(const T1DFunction &func, double a, double b, double absacc)
double Romberg_simple(const T1DFunction &func, double a, double b, double absacc)
static void trapez(const T1DFunction &func, double a, double b, double &S, int &it, int n)
static void polint(const double xa[], const double ya[], int n, double x, double &y, double &dy)