/**
* 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.matrix.DoubleMatrix1D;
import com.opengamma.util.test.TestGroup;
/**
* Set up a simple parameterised curve (based on the function a * Math.sin(b * x) + c, where a, b, & c are the parameters)
* and check the finite difference sensitivity (the default behaviour of getYParameterSensitivity) agrees with the analytic
* calculation for a range of points along the curve.
*/
@Test(groups = TestGroup.UNIT)
public class ParameterizedCurveTest {
@Test
public void test() {
/**
* Take the form $y = a\sin(bx) + c$
*/
final ParameterizedCurve testCurve = new ParameterizedCurve() {
@Override
public Double evaluate(final Double x, final DoubleMatrix1D parameters) {
assertEquals(3, parameters.getNumberOfElements());
final double a = parameters.getEntry(0);
final double b = parameters.getEntry(1);
final double c = parameters.getEntry(2);
return a * Math.sin(b * x) + c;
}
@Override
public int getNumberOfParameters() {
return 3;
}
};
final ParameterizedFunction<Double, DoubleMatrix1D, DoubleMatrix1D> parmSense = new ParameterizedFunction<Double, DoubleMatrix1D, DoubleMatrix1D>() {
@Override
public DoubleMatrix1D evaluate(final Double x, final DoubleMatrix1D parameters) {
final double a = parameters.getEntry(0);
final double b = parameters.getEntry(1);
final DoubleMatrix1D res = new DoubleMatrix1D(Math.sin(b * x), x * a * Math.cos(b * x), 1.0);
return res;
}
@Override
public int getNumberOfParameters() {
return 0;
}
};
final DoubleMatrix1D params = new DoubleMatrix1D(0.7, -0.3, 1.2);
final Function1D<Double, DoubleMatrix1D> paramsSenseFD = testCurve.getYParameterSensitivity(params);
final Function1D<Double, DoubleMatrix1D> paramsSenseAnal = parmSense.asFunctionOfArguments(params);
for (int i = 0; i < 20; i++) {
final double x = Math.PI * (-0.5 + i / 19.);
final DoubleMatrix1D s1 = paramsSenseAnal.evaluate(x);
final DoubleMatrix1D s2 = paramsSenseFD.evaluate(x);
for (int j = 0; j < 3; j++) {
assertEquals(s1.getEntry(j), s2.getEntry(j), 1e-10);
}
}
}
}