Ejemplo n.º 1
0
 def test_gradients_returned_by_xi(self):
     # verifies that gradients with respect to xi are returned if cached
     points, values, func, df = self._get_sample_2d()
     np.random.seed(4321)
     for method in self.valid_methods:
         interp = InterpND(points, values, method)
         x = np.array([0.9, 0.1])
         interp._xi = x
         dy = np.array([0.997901, 0.08915])
         interp._d_dx = dy
         assert_almost_equal(interp.gradient(x), dy)
Ejemplo n.º 2
0
 def test_gradients_returned_by_xi(self):
     # verifies that gradients with respect to xi are returned if cached
     points, values, func, df = self._get_sample_2d()
     np.random.seed(4321)
     for method in self.interp_methods:
         interp = InterpND(method=method, points=points, values=values)
         x = np.array([0.9, 0.1])
         interp._xi = x
         dy = np.array([0.997901, 0.08915])
         interp._d_dx = dy
         assert_near_equal(interp.gradient(x), dy, tolerance=1e-7)
Ejemplo n.º 3
0
    def test_auto_reduce_spline_order(self):
        # if a spline method is used and spline_dim_error=False and a dimension
        # does not have enough points, the spline order for that dimension
        # should be automatically reduced
        np.random.seed(314)

        # x dimension is too small for cubic, should fall back to linear
        x = [0, 1]
        y = np.linspace(-10, 4, 10)
        z = np.linspace(1000, 2000, 20)

        points = [x, y, z]
        values = np.random.randn(2, 10, 20)

        interp = InterpND(points, values, interp_method='scipy_cubic')

        # first dimension (x) should be reduced to k=1 (linear)
        self.assertEqual(interp.table._ki[0], 1)

        # should operate as normal
        x = np.array([0.5, 0, 1001])
        result = interp.interpolate(x)
        assert_almost_equal(result, -0.046325695741704434, decimal=5)

        interp = InterpND(points, values, interp_method='scipy_slinear')
        value1 = interp.interpolate(x)

        # cycle through different methods that require order reduction
        # in the first dimension
        interp = InterpND(points, values, interp_method='scipy_quintic')
        value2 = interp.interpolate(x)
        interp.gradient(x)
        interp = InterpND(points, values, interp_method='scipy_cubic')
        value3 = interp.interpolate(x)
        interp.gradient(x)

        # values from different methods should be different
        self.assertTrue(value1[0] != value2[0])
        self.assertTrue(value2[0] != value3[0])
Ejemplo n.º 4
0
    def test_spline_deriv_xi1d(self):
        # tests gradient values
        points, values, func, df = self._get_sample_2d()
        np.random.seed(1234)
        test_pt = np.random.uniform(0, 3, 2)
        actual = np.array(df(*test_pt))
        for method in self.valid_methods:
            interp = InterpND(points, values, method)
            computed = interp.gradient(test_pt)
            r_err = rel_error(actual, computed)
            assert r_err < self.tol[method]

            # test that gradients have been cached
            assert_array_equal(interp._xi, test_pt)
            assert_array_equal(interp._d_dx.flatten(), computed.flatten())
Ejemplo n.º 5
0
    def test_spline_out_of_bounds_extrap(self):
        points, values, func, df = self._get_sample_2d()
        np.random.seed(5)
        test_pt = np.random.uniform(3, 3.1, 2)
        actual = func(*test_pt)
        gradient = np.array(df(*test_pt))
        for method in self.valid_methods:
            k = self.interp_configs[method]
            interp = InterpND(points, values, method, bounds_error=False)
            computed = interp.interpolate(test_pt)
            computed_grad = interp.gradient(test_pt)
            r_err = rel_error(actual, computed)
            assert r_err < 1e3 * self.tol[method]

            r_err = rel_error(gradient, computed_grad)
            # extrapolated gradients are even trickier, but usable still
            assert r_err < 2e3 * self.tol[method]
Ejemplo n.º 6
0
    def test_spline_out_of_bounds_extrap(self):
        points, values, func, df = self. _get_sample_2d()
        np.random.seed(5)
        test_pt = np.random.uniform(3, 3.1, 2)
        actual = func(*test_pt)
        gradient = np.array(df(*test_pt))
        tol = 1e-1
        for method in self.interp_methods:
            k = self.interp_configs[method]
            if method == 'slinear':
                tol = 2
            interp = InterpND(method=method, points=points, values=values,
                              extrapolate=True)
            computed, computed_grad = interp.interpolate(test_pt, compute_derivative=True)
            computed_grad = interp.gradient(test_pt)
            r_err = rel_error(actual, computed)
            assert r_err < tol

            r_err = rel_error(gradient, computed_grad)
            # extrapolated gradients are even trickier, but usable still
            assert r_err < 2 * tol