예제 #1
0
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)
예제 #2
0
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)
예제 #3
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)
예제 #4
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)
예제 #5
0
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)