/**
* 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 org.testng.annotations.Test;
import com.opengamma.strata.math.impl.function.DoubleFunction1D;
/**
* Test.
*/
@Test
public class HermitePolynomialFunctionTest {
private static final DoubleFunction1D H0 = x -> 1d;
private static final DoubleFunction1D H1 = x -> 2 * x;
private static final DoubleFunction1D H2 = x -> 4 * x * x - 2;
private static final DoubleFunction1D H3 = x -> x * (8 * x * x - 12);
private static final DoubleFunction1D H4 = x -> 16 * x * x * x * x - 48 * x * x + 12;
private static final DoubleFunction1D H5 = x -> x * (32 * x * x * x * x - 160 * x * x + 120);
private static final DoubleFunction1D H6 = x -> 64 * x * x * x * x * x * x - 480 * x * x * x * x + 720 * x * x - 120;
private static final DoubleFunction1D H7 =
x -> x * (128 * x * x * x * x * x * x - 1344 * x * x * x * x + 3360 * x * x - 1680);
private static final DoubleFunction1D H8 = x -> {
double xSq = x * x;
return 256 * xSq * xSq * xSq * xSq - 3584 * xSq * xSq * xSq + 13440 * xSq * xSq - 13440 * xSq + 1680;
};
private static final DoubleFunction1D H9 = x -> {
double xSq = x * x;
return x * (512 * xSq * xSq * xSq * xSq - 9216 * xSq * xSq * xSq + 48384 * xSq * xSq - 80640 * xSq + 30240);
};
private static final DoubleFunction1D H10 = x -> {
double xSq = x * x;
return 1024 * xSq * xSq * xSq * xSq * xSq - 23040 *
xSq * xSq * xSq * xSq + 161280 * xSq * xSq * xSq - 403200 * xSq * xSq + 302400 * xSq - 30240;
};
private static final DoubleFunction1D[] H = new DoubleFunction1D[] {H0, H1, H2, H3, H4, H5, H6, H7, H8, H9, H10 };
private static final HermitePolynomialFunction HERMITE = new HermitePolynomialFunction();
private static final double EPS = 1e-9;
@Test(expectedExceptions = IllegalArgumentException.class)
public void testBadN() {
HERMITE.getPolynomials(-3);
}
@Test(expectedExceptions = UnsupportedOperationException.class)
public void testGetPolynomials() {
HERMITE.getPolynomialsAndFirstDerivative(3);
}
@Test
public void test() {
DoubleFunction1D[] h = HERMITE.getPolynomials(0);
assertEquals(h.length, 1);
final double x = 1.23;
assertEquals(h[0].applyAsDouble(x), 1, EPS);
h = HERMITE.getPolynomials(1);
assertEquals(h.length, 2);
assertEquals(h[1].applyAsDouble(x), 2 * x, EPS);
for (int i = 0; i <= 10; i++) {
h = HERMITE.getPolynomials(i);
for (int j = 0; j <= i; j++) {
assertEquals(H[j].applyAsDouble(x), h[j].applyAsDouble(x), EPS);
}
}
}
}