1 #ifndef __JTOOLS__JQUADRATURE__
2 #define __JTOOLS__JQUADRATURE__
20 namespace JPP {
using namespace JTOOLS; }
63 template<
class JFunction_t>
68 const double eps = 1.0e-4)
73 const double Vmin = integral(Xmin, Xmax) / (double) nx;
75 for (
int i = 0; i != nx; ++i) {
77 for (
double xmin = Xmin, xmax = Xmax; ; ) {
79 const double x = 0.5 * (xmin + xmax);
80 const double v = integral(Xmin, x);
82 if (fabs(Vmin - v) < eps * Vmin ||
83 fabs(xmax - xmin) < eps * (Xmax - Xmin)) {
85 const double __x = 0.5 * (Xmin + x);
86 const double __y = Vmin / integral(__x);
124 const double eps = 1.0e-12) :
129 const int M = (n + 1) / 2;
131 double p0,
p1, p2, pp;
133 for (
int i = 0; i < M; ++i) {
135 double z = cos(
PI * (i+0.75) / (n+0.5));
145 for (
int j = 0; j < n; ++j) {
148 p2 = ((2*j + 1) * z*p1 - j*p0) / (j+1);
151 pp = n * (z*p2 -
p1) / (z*z - 1.0);
156 }
while (fabs(z-z1) > eps);
158 const double y = 2.0 / ((1.0-z*z)*pp*pp);
187 const double eps = 1.0e-12) :
190 const int number_of_iterations = 100;
193 double p0,
p1, p2, pp;
195 for (
int i = 0; i < n; ++i) {
200 z = (1.0 + alf) * (3.0 + 0.92*alf) / (1.0 + 2.4*n + 1.8*alf);
204 z += (15.0 + 6.25*alf) / (1.0 + 0.9*alf + 2.5*n);
208 const double ai = i - 1;
209 z += ((1.0+2.55*ai)/(1.9*ai) + (1.26*ai*alf)/(1.0+3.5*ai)) * (z - at(i-2).getX()) / (1.0 + 0.3*alf);
216 for (k = 0; k != number_of_iterations; ++k) {
223 for (
int j = 0; j < n; ++j) {
226 p2 = ((2*j + 1 + alf - z) * p1 - (j + alf)*p0) / (j+1);
229 pp = (n*p2 - (n+alf)*p1) / z;
234 if (fabs(z-z1) < eps)
238 const double y = -TMath::Gamma(alf+n) / TMath::Gamma((
double) n) / (pp*n*
p1);
264 const double eps = 1.0e-12) :
269 const double pii = 1.0 / pow(
PI,0.25);
271 const int number_of_iterations = 100;
273 const int M = (n + 1) / 2;
275 double p0,
p1, p2, pp;
279 for (
int i = 0; i < M; ++i) {
284 z = sqrt((
double) (2*n+1)) - 1.85575 * pow((
double) (2*n+1),-0.16667);
288 z -= 1.14 * pow((
double) n,0.426) / z;
292 z = 1.86*z + 0.86*at( 0 ).getX();
296 z = 1.91*z + 0.91*at( 1 ).getX();
300 z = 2.00*z + 1.00*at(i-2).getX();
304 for (
int k = 0; k != number_of_iterations; ++k) {
311 for (
int j = 0; j < n; ++j) {
314 p2 = z * sqrt(2.0/(
double) (j+1)) * p1 - sqrt((
double) j / (
double) (j+1)) * p0;
317 pp = sqrt((
double) (2*n)) *
p1;
322 if (fabs(z-z1) < eps)
326 const double y = 2.0 / (pp*pp);
357 const double b = -2*g * (a + 1.0);
358 const double ai = 1.0 / (a + 1.0);
360 const double ymin = pow(1.0 + g, 2*(a + 1.0)) / b;
361 const double ymax = pow(1.0 - g, 2*(a + 1.0)) / b;
363 const double dy = (ymax - ymin) / (n + 1);
365 for (
double y = ymax - 0.5*dy; y > ymin; y -= dy) {
367 const double v = y*b;
368 const double w = pow(v, ai);
369 const double x = (1.0 + g*g - w) / (2*g);
370 const double dx = pow(v, -a*ai)*dy;
393 const double b = -2*g * (a + 1.0);
394 const double ai = 1.0 / (a + 1.0);
396 const double ymin = pow(1.0 + g*g -2*g*xmin, a + 1.0) / b;
397 const double ymax = pow(1.0 + g*g -2*g*xmax, a + 1.0) / b;
399 const double dy = (ymax - ymin) / (n + 1);
401 for (
double y = ymax - 0.5*dy; y > ymin; y -= dy) {
403 const double v = y*b;
404 const double w = pow(v, ai);
405 const double x = (1.0 + g*g - w) / (2*g);
406 const double dx = pow(v, -a*ai)*dy;
423 const double dy = 1.0 / (n + 1);
424 const double gi = log((1.0 + g*g) / (1.0 - g*g)) / (2.0*g);
426 for (
double y = 1.0 - 0.5*dy; y > 0.0; y -= dy) {
428 const double v = -y*2.0*g*gi + log(1.0 + g*g);
429 const double w = exp(v);
430 const double x = (1.0 + g*g - w) / (2.0*g);
431 const double dx = w*gi*dy;
459 const double dy = 1.0 / (n + 1);
460 const double gi = 3.0/g + 1.0;
464 const double p = 1.0/g;
466 for (
double y = 0.5*dy; y < 1.0; y += dy) {
468 const double q = 0.5*gi - gi*y;
470 const double b = sqrt(q*q + p*p*p);
471 const double u = pow(-q + b, 1.0/3.0);
472 const double v = pow(+q + b, 1.0/3.0);
474 const double x = u - v;
475 const double dx = (u + v) / (3.0*b);
500 for (
double ds = 1.0 / (n/2), sb = 0.5*ds; sb < 1.0; sb += ds) {
502 const double cb = sqrt((1.0 + sb)*(1.0 - sb));
503 const double dc = ds*sb/cb;
533 for (ds = 1.0 / (n/2), sb = 0.5*ds; sb < 1.0; sb += ds) {
535 cb = sqrt((1.0 + sb)*(1.0 - sb));
541 for (dc = (cb + 1.0) / (n/2), cb -= 0.5*dc ; cb > -1.0; cb -= dc) {
The elements in a collection are sorted according to their abscissa values and a given distance opera...
General purpose class for a collection of sorted elements.
JTOOLS::JElement2D< double, double > JElement2D_t