@Test public void crossDerivativeTest() { double[] x0Values = new double[] {1., 2., 3., 4.}; double[] x1Values = new double[] {-1., 0., 1., 2., 3.}; final int n0Data = x0Values.length; final int n1Data = x1Values.length; double[][] yValues = new double[][] { { 1.0, -1.0, 0.0, 1.0, 0.0, }, {1.0, -1.0, 0.0, 1.0, -2.0}, {1.0, -2.0, 0.0, -2.0, -2.0}, {-1.0, -1.0, -2.0, -2.0, -1.0} }; NaturalSplineInterpolator method = new NaturalSplineInterpolator(); PiecewisePolynomialInterpolator2D interp = new BicubicSplineInterpolator(method); PiecewisePolynomialResult2D result = interp.interpolate(x0Values, x1Values, yValues); final int n0IntExp = n0Data - 1; final int n1IntExp = n1Data - 1; final int orderExp = 4; final int n0Keys = 51; final int n1Keys = 61; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 5. * i / (n0Keys - 1); } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = -2. + 6. * i / (n1Keys - 1); } assertEquals(result.getNumberOfIntervals()[0], n0IntExp); assertEquals(result.getNumberOfIntervals()[1], n1IntExp); assertEquals(result.getOrder()[0], orderExp); assertEquals(result.getOrder()[1], orderExp); for (int i = 0; i < n0Data; ++i) { final double ref = Math.abs(x0Values[i]) == 0. ? 1. : Math.abs(x0Values[i]); assertEquals(result.getKnots0().getData()[i], x0Values[i], ref * EPS); assertEquals(result.getKnots2D().get(0).getData()[i], x0Values[i], ref * EPS); } for (int i = 0; i < n1Data; ++i) { final double ref = Math.abs(x1Values[i]) == 0. ? 1. : Math.abs(x1Values[i]); assertEquals(result.getKnots1().getData()[i], x1Values[i], ref * EPS); assertEquals(result.getKnots2D().get(1).getData()[i], x1Values[i], ref * EPS); } for (int i = 0; i < n0Data - 1; ++i) { for (int j = 0; j < n1Data - 1; ++j) { final double ref = Math.abs(yValues[i][j]) == 0. ? 1. : Math.abs(yValues[i][j]); assertEquals( result.getCoefs()[i][j].getData()[orderExp - 1][orderExp - 1], yValues[i][j], ref * EPS); } } double[][] resValues = interp.interpolate(x0Values, x1Values, yValues, x0Values, x1Values).getData(); final PiecewisePolynomialFunction2D func2D = new PiecewisePolynomialFunction2D(); double[][] resDiffX0 = func2D.differentiateX0(result, x0Values, x1Values).getData(); double[][] resDiffX1 = func2D.differentiateX1(result, x0Values, x1Values).getData(); final PiecewisePolynomialFunction1D func1D = new PiecewisePolynomialFunction1D(); double[][] expDiffX0 = func1D .differentiate( method.interpolate( x0Values, OG_ALGEBRA.getTranspose(new DoubleMatrix2D(yValues)).getData()), x0Values) .getData(); double[][] expDiffX1 = func1D.differentiate(method.interpolate(x1Values, yValues), x1Values).getData(); for (int i = 0; i < n0Data; ++i) { for (int j = 0; j < n1Data; ++j) { final double expVal = expDiffX1[i][j]; final double ref = Math.abs(expVal) == 0. ? 1. : Math.abs(expVal); assertEquals(resDiffX1[i][j], expVal, ref * EPS); } } // System.out.println(new DoubleMatrix2D(expDiffX0)); // System.out.println(new DoubleMatrix2D(resDiffX0)); for (int i = 0; i < n0Data; ++i) { for (int j = 0; j < n1Data; ++j) { final double expVal = expDiffX0[j][i]; final double ref = Math.abs(expVal) == 0. ? 1. : Math.abs(expVal); assertEquals(resDiffX0[i][j], expVal, ref * EPS); } } for (int i = 0; i < n0Data; ++i) { for (int j = 0; j < n1Data; ++j) { final double expVal = yValues[i][j]; final double ref = Math.abs(expVal) == 0. ? 1. : Math.abs(expVal); assertEquals(resValues[i][j], expVal, ref * EPS); } } }
@Override public Double evaluate(final Double lambda) { final DoubleMatrix1D x = (DoubleMatrix1D) OG_ALGEBRA.add(_x0, OG_ALGEBRA.scale(_p, lambda)); return _f.evaluate(x); }