/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.math.impl.integration; import static org.testng.AssertJUnit.assertEquals; import java.util.function.BiFunction; import org.testng.annotations.Test; /** * Tests related to the repeated one-dimensional integration to integrate 2-D functions. */ @Test public class IntegratorRepeated2DTest { @Test /** Numerical integral vs a known explicit solution. */ public void integrate() { // Test function. BiFunction<Double, Double, Double> f = (x1, x2) -> x1 + Math.sin(x2); double absTol = 1.0E-6; double relTol = 1.0E-6; int minSteps = 6; RungeKuttaIntegrator1D integrator1D = new RungeKuttaIntegrator1D(absTol, relTol, minSteps); IntegratorRepeated2D integrator2D = new IntegratorRepeated2D(integrator1D); Double[] lower; Double[] upper; double result, resultExpected; // First set of limits. lower = new Double[] {0.0, 1.0}; upper = new Double[] {2.0, 10.0}; result = integrator2D.integrate(f, lower, upper); resultExpected = (upper[0] * upper[0] - lower[0] * lower[0]) / 2.0 * (upper[1] - lower[1]) + (upper[0] - lower[0]) * (-Math.cos(upper[1]) + Math.cos(lower[1])); assertEquals("Integration 2D - repeated 1D", resultExpected, result, 1E-8); // Second set of limits. lower = new Double[] {0.25, 5.25}; upper = new Double[] {25.25, 35.25}; result = integrator2D.integrate(f, lower, upper); resultExpected = (upper[0] * upper[0] - lower[0] * lower[0]) / 2.0 * (upper[1] - lower[1]) + (upper[0] - lower[0]) * (-Math.cos(upper[1]) + Math.cos(lower[1])); assertEquals("Integration 2D - repeated 1D", resultExpected, result, 1E-6); } }