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)
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)
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])
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())
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]
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