def test_low_grid_basics(npoint): grid = LegendreGrid(npoint) assert grid.basis.shape == (npoint, npoint) assert grid.basis_inv.shape == (npoint, npoint) fn1 = np.random.uniform(0, 1, npoint) coeffs = grid.tocoeffs(fn1) fn2 = grid.tofnvals(coeffs) assert_allclose(fn1, fn2, atol=1e-14) fn3 = legval(grid.points, coeffs) assert_allclose(fn1, fn3, atol=1e-14)
def test_low_grid_sin(): npoint = 101 grid = LegendreGrid(npoint) assert_allclose(grid.points[npoint // 2], 0.0, atol=1e-10) fnvals = np.cos(grid.points) fnvalsa = grid.antiderivative(fnvals) fnvalsa -= fnvalsa[npoint // 2] fnvalsd = grid.derivative(fnvals) assert_allclose(grid.integrate(fnvals), np.sin(1) - np.sin(-1), atol=1e-14, rtol=0) assert_allclose(fnvalsa, np.sin(grid.points), atol=1e-14, rtol=0) assert_allclose(fnvalsd, -np.sin(grid.points), atol=1e-10, rtol=0)
def test_low_grid_exp(): npoint = 101 grid = LegendreGrid(npoint) assert_allclose(grid.points[npoint // 2], 0.0, atol=1e-10) fnvals = np.exp(grid.points) fnvalsa = grid.antiderivative(fnvals) fnvalsa += 1 - fnvalsa[npoint // 2] fnvalsd = grid.derivative(fnvals) assert_allclose(grid.integrate(fnvals), np.exp(1) - np.exp(-1), atol=1e-14, rtol=0) assert_allclose(fnvalsa, fnvals, atol=1e-14, rtol=0) assert_allclose(fnvalsd, fnvals, atol=1e-10, rtol=0)
def test_low_grid_basics_vectorized(): shape = (5, 4, 8) npoint = 7 extshape = shape + (npoint, ) grid = LegendreGrid(npoint) fn1 = np.random.uniform(0, 1, extshape) coeffs = grid.tocoeffs(fn1) assert coeffs.shape == extshape fn2 = grid.tofnvals(coeffs) assert fn2.shape == extshape assert_allclose(fn1, fn2, atol=1e-14) # For legval, the first index of the coefficients array should be for # different polynomial orders. It returns function values at grid points, # for which the last index is used. fn3 = legval(grid.points, coeffs.transpose(3, 0, 1, 2)) assert fn3.shape == extshape assert_allclose(fn1, fn3, atol=1e-14)
def test_low_grid_sin_vectorized(): npoint = 101 grid = LegendreGrid(npoint) assert_allclose(grid.points[npoint // 2], 0.0, atol=1e-10) fnsvals = np.cos(np.outer([1.0, 0.5, 0.2], grid.points)) fnsvalsa = grid.antiderivative(fnsvals) fnsvalsa -= fnsvalsa[:, npoint // 2, np.newaxis] fnsvalsd = grid.derivative(fnsvals) integrals = [ np.sin(1) - np.sin(-1), 2 * np.sin(0.5) - 2 * np.sin(-0.5), 5 * np.sin(0.2) - 5 * np.sin(-0.2), ] assert_allclose(grid.integrate(fnsvals), integrals, atol=1e-14, rtol=0) antiderivatives = [ np.sin(grid.points), 2 * np.sin(0.5 * grid.points), 5 * np.sin(0.2 * grid.points), ] assert_allclose(fnsvalsa, antiderivatives, atol=1e-14, rtol=0) derivatives = [ -np.sin(grid.points), -0.5 * np.sin(0.5 * grid.points), -0.2 * np.sin(0.2 * grid.points), ] assert_allclose(fnsvalsd, derivatives, atol=1e-10, rtol=0) fns_other = np.cos(np.outer([1.1, 1.2, 0.8], grid.points)) integrals2 = np.array([[grid.integrate(fn1 * fn2) for fn2 in fns_other] for fn1 in fnsvals]) assert_allclose(grid.integrate(fnsvals, fns_other), integrals2, atol=1e-14, rtol=0)