/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.interpolation; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import com.opengamma.analytics.math.interpolation.data.Interpolator1DDataBundle; import com.opengamma.util.test.TestGroup; /** * Test related to the exponential extrapolator. */ @Test(groups = TestGroup.UNIT) public class ExponentialExtrapolator1DTest { private static final Interpolator1D INTERPOLATOR = new LinearInterpolator1D(); private static final ExponentialExtrapolator1D EXP_EXTRAPOLATOR = new ExponentialExtrapolator1D(); private static final double[] X_DATA = new double[] {0.01, 1.0, 5.0, 10.0}; private static final double[] Y_DATA = new double[] {0.99, 0.98, 0.90, 0.80}; private static final Interpolator1DDataBundle DATA; static { DATA = INTERPOLATOR.getDataBundleFromSortedArrays(X_DATA, Y_DATA); } private static final double TOLERANCE_VALUE = 1.0E-10; private static final double TOLERANCE_SENSI = 1.0E-5; @Test public void value() { double mLeft = Math.log(Y_DATA[0]) / X_DATA[0]; double mRight = Math.log(Y_DATA[X_DATA.length - 1]) / X_DATA[X_DATA.length - 1]; double value; value = 0.0; assertEquals("ExponentialExtrapolator1D: value", 1.0, EXP_EXTRAPOLATOR.interpolate(DATA, value), TOLERANCE_VALUE); value = -0.2; assertEquals("ExponentialExtrapolator1D: value", Math.exp(mLeft * value), EXP_EXTRAPOLATOR.interpolate(DATA, value), TOLERANCE_VALUE); value = 11.0; assertEquals("ExponentialExtrapolator1D: value", Math.exp(mRight * value), EXP_EXTRAPOLATOR.interpolate(DATA, value), TOLERANCE_VALUE); } @Test public void sensitivity() { double value; double shift = 1.0E-8; double[] yDataShifted; value = 0.0; yDataShifted = Y_DATA.clone(); yDataShifted[0] += shift; assertEquals("ExponentialExtrapolator1D: value", (EXP_EXTRAPOLATOR.interpolate(INTERPOLATOR.getDataBundleFromSortedArrays(X_DATA, yDataShifted), value) - EXP_EXTRAPOLATOR.interpolate(DATA, value)) / shift, EXP_EXTRAPOLATOR.getNodeSensitivitiesForValue(DATA, value)[0], TOLERANCE_SENSI); value = -0.2; yDataShifted = Y_DATA.clone(); yDataShifted[0] += shift; assertEquals("ExponentialExtrapolator1D: value", (EXP_EXTRAPOLATOR.interpolate(INTERPOLATOR.getDataBundleFromSortedArrays(X_DATA, yDataShifted), value) - EXP_EXTRAPOLATOR.interpolate(DATA, value)) / shift, EXP_EXTRAPOLATOR.getNodeSensitivitiesForValue(DATA, value)[0], TOLERANCE_SENSI); value = 11.0; yDataShifted = Y_DATA.clone(); yDataShifted[Y_DATA.length - 1] += shift; assertEquals("ExponentialExtrapolator1D: value", (EXP_EXTRAPOLATOR.interpolate(INTERPOLATOR.getDataBundleFromSortedArrays(X_DATA, yDataShifted), value) - EXP_EXTRAPOLATOR.interpolate(DATA, value)) / shift, EXP_EXTRAPOLATOR.getNodeSensitivitiesForValue(DATA, value)[Y_DATA.length - 1], TOLERANCE_SENSI); } }