@Override
public GaussianQuadratureData generate(int n) {
ArgChecker.isTrue(n > 0, "n > 0");
Pair<DoubleFunction1D, DoubleFunction1D>[] polynomials = JACOBI.getPolynomialsAndFirstDerivative(n, _alpha, _beta);
Pair<DoubleFunction1D, DoubleFunction1D> pair = polynomials[n];
DoubleFunction1D previous = polynomials[n - 1].getFirst();
DoubleFunction1D function = pair.getFirst();
DoubleFunction1D derivative = pair.getSecond();
double[] x = new double[n];
double[] w = new double[n];
double root = 0;
for (int i = 0; i < n; i++) {
double d = 2 * n + _c;
root = getInitialRootGuess(root, i, n, x);
root = ROOT_FINDER.getRoot(function, derivative, root);
x[i] = root;
w[i] =
GAMMA_FUNCTION.applyAsDouble(_alpha + n) * GAMMA_FUNCTION.applyAsDouble(_beta + n) /
CombinatoricsUtils.factorialDouble(n) / GAMMA_FUNCTION.applyAsDouble(n + _c + 1) * d *
Math.pow(2, _c)
/ (derivative.applyAsDouble(root) * previous.applyAsDouble(root));
}
return new GaussianQuadratureData(x, w);
}