/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.function;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.math.differentiation.VectorFieldFirstOrderDifferentiator;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix2D;
import com.opengamma.analytics.util.AssertMatrix;
import com.opengamma.util.test.TestGroup;
/**
* Test simple a simple function a * Math.sinh(b * x)
*/
@Test(groups = TestGroup.UNIT)
public class ParameterizedCurveVectorFunctionTest {
private static final ParameterizedCurve s_PCurve;
static {
s_PCurve = new ParameterizedCurve() {
@Override
public Double evaluate(final Double x, final DoubleMatrix1D parameters) {
final double a = parameters.getEntry(0);
final double b = parameters.getEntry(1);
return a * Math.sinh(b * x);
}
@Override
public int getNumberOfParameters() {
return 2;
}
};
}
@Test
public void test() {
final ParameterizedCurveVectorFunctionProvider pro = new ParameterizedCurveVectorFunctionProvider(s_PCurve);
final double[] points = new double[] {-1.0, 0.0, 1.0 };
final VectorFunction f = pro.from(points);
assertEquals(2, f.getLengthOfDomain());
assertEquals(3, f.getLengthOfRange());
final DoubleMatrix1D x = new DoubleMatrix1D(0.5, 2.0); //the parameters a & b
final DoubleMatrix1D y = f.evaluate(x);
assertEquals(0.5 * Math.sinh(-2.0), y.getEntry(0), 1e-14);
assertEquals(0.0, y.getEntry(1), 1e-14);
assertEquals(0.5 * Math.sinh(2.0), y.getEntry(2), 1e-14);
final DoubleMatrix2D jac = f.calculateJacobian(x);
final DoubleMatrix2D fdJac = (new VectorFieldFirstOrderDifferentiator().differentiate(f)).evaluate(x);
AssertMatrix.assertEqualsMatrix(fdJac, jac, 1e-9);
}
}