/**
* Copyright (C) 2009 - 2010 by OpenGamma Inc.
*
* Please see distribution for license.
*/
package com.opengamma.strata.math.impl.function.special;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.Test;
import com.opengamma.strata.collect.tuple.Pair;
import com.opengamma.strata.math.impl.function.DoubleFunction1D;
import com.opengamma.strata.math.impl.function.RealPolynomialFunction1D;
/**
* Test.
*/
@Test
public class LaguerrePolynomialFunctionTest {
private static final DoubleFunction1D L0 = x -> 1d;
private static final DoubleFunction1D L1 = x -> 1 - x;
private static final DoubleFunction1D L2 = x -> 0.5 * (x * x - 4 * x + 2);
private static final DoubleFunction1D L3 = x -> (-x * x * x + 9 * x * x - 18 * x + 6) / 6;
private static final DoubleFunction1D L4 = x -> (x * x * x * x - 16 * x * x * x + 72 * x * x - 96 * x + 24) / 24;
private static final DoubleFunction1D L5 =
x -> (-x * x * x * x * x + 25 * x * x * x * x - 200 * x * x * x + 600 * x * x - 600 * x + 120) / 120;
private static final DoubleFunction1D L6 =
x -> (x * x * x * x * x * x - 36 * x * x * x * x * x + 450 * x * x * x * x - 2400 * x * x * x + 5400 * x * x - 4320 * x + 720) / 720;
private static final DoubleFunction1D[] L = new DoubleFunction1D[] {L0, L1, L2, L3, L4, L5, L6 };
private static final LaguerrePolynomialFunction LAGUERRE = new LaguerrePolynomialFunction();
private static final double EPS = 1e-12;
@Test(expectedExceptions = IllegalArgumentException.class)
public void testBadN1() {
LAGUERRE.getPolynomials(-3);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testBadN2() {
LAGUERRE.getPolynomials(-3, 1);
}
@Test
public void test() {
DoubleFunction1D[] l = LAGUERRE.getPolynomials(0);
assertEquals(l.length, 1);
final double x = 1.23;
assertEquals(l[0].applyAsDouble(x), 1, EPS);
l = LAGUERRE.getPolynomials(1);
assertEquals(l.length, 2);
assertEquals(l[1].applyAsDouble(x), 1 - x, EPS);
for (int i = 0; i <= 6; i++) {
l = LAGUERRE.getPolynomials(i);
for (int j = 0; j <= i; j++) {
assertEquals(L[j].applyAsDouble(x), l[j].applyAsDouble(x), EPS);
}
}
}
@Test
public void testAlpha1() {
DoubleFunction1D[] l1, l2;
final double x = 2.34;
for (int i = 0; i <= 6; i++) {
l1 = LAGUERRE.getPolynomials(i, 0);
l2 = LAGUERRE.getPolynomials(i);
for (int j = 0; j <= i; j++) {
assertEquals(l1[j].applyAsDouble(x), l2[j].applyAsDouble(x), EPS);
}
}
final double alpha = 3.45;
l1 = LAGUERRE.getPolynomials(6, alpha);
final DoubleFunction1D f0 = d -> 1d;
final DoubleFunction1D f1 = d -> 1 + alpha - d;
final DoubleFunction1D f2 = d -> d * d / 2 - (alpha + 2) * d + (alpha + 2) * (alpha + 1) / 2.;
final DoubleFunction1D f3 =
d -> -d * d * d / 6 + (alpha + 3) * d * d / 2 - (alpha + 2) * (alpha + 3) * d / 2 + (alpha + 1) * (alpha + 2) * (alpha + 3) / 6;
assertEquals(l1[0].applyAsDouble(x), f0.applyAsDouble(x), EPS);
assertEquals(l1[1].applyAsDouble(x), f1.applyAsDouble(x), EPS);
assertEquals(l1[2].applyAsDouble(x), f2.applyAsDouble(x), EPS);
assertEquals(l1[3].applyAsDouble(x), f3.applyAsDouble(x), EPS);
}
@Test
public void testAlpha2() {
final int n = 14;
final Pair<DoubleFunction1D, DoubleFunction1D>[] polynomialAndDerivative1 = LAGUERRE.getPolynomialsAndFirstDerivative(n);
final Pair<DoubleFunction1D, DoubleFunction1D>[] polynomialAndDerivative2 = LAGUERRE.getPolynomialsAndFirstDerivative(n, 0);
for (int i = 0; i < n; i++) {
assertTrue(polynomialAndDerivative1[i].getFirst() instanceof RealPolynomialFunction1D);
assertTrue(polynomialAndDerivative2[i].getFirst() instanceof RealPolynomialFunction1D);
final RealPolynomialFunction1D first = (RealPolynomialFunction1D) polynomialAndDerivative1[i].getFirst();
final RealPolynomialFunction1D second = (RealPolynomialFunction1D) polynomialAndDerivative2[i].getFirst();
assertEquals(first, second);
}
}
}