コード例 #1
0
/// Initialise the weights w and abscissas x.
void GaussLaguerre::initialise()
{
  int i;
  // Create Laguerre polynomial L_n of order n+1 using recurrence relation - L_{n+1} is required to calculate weights below
  Array<complex<double>,1> one(2);
  one = 1.0, -1.0;
  Polynomial currL(one); // 1-x
  Polynomial prevL;      // 1
  // 2n+1-x:
  Polynomial two_n_plus_one_minus_x(one);
  for (i=2;i<=n+1;i++) {
    two_n_plus_one_minus_x += 2.0;
    Polynomial tmp(currL);
    tmp   *= two_n_plus_one_minus_x;
	prevL *= -(i-1.0);
	tmp   += prevL;
	tmp   *= 1.0/double(i);
	prevL  = currL;
	currL  = tmp; }
  // Abscissas x are the roots of the Laguerre polynomial
  const Array<complex<double>,1>& roots = prevL.roots();
  for (i=1;i<=n;i++) x(i) = roots(i-1).real(); // note that indexing starts from 1, not 0 in this particular implementation
  // Calculate weights w - using eq. 14 at http://mathworld.wolfram.com/Laguerre-GaussQuadrature.html
  for (i=1;i<=n;i++) {
    double tmp = (n+1)*currL(x(i)).real();
	w(i) = x(i) / (tmp*tmp); }
}
コード例 #2
0
void func2()
{
  /* Thread 2 */
  auto valsGivingZero = p.roots();
}
コード例 #3
0
void func1()
{
  /* Thread 1 */
  auto rootsOfP = p.roots();
}