Source code for freegs.test_quadrature
import numpy as np
from . import quadrature
[docs]
def test_unity():
# Sum of weights is one i.e quadrature works out average over area
for n in [1, 3, 6]:
ps = quadrature.polygon_quad([(0, 0), (0, 1), (1, 1), (1, 0)], n=n)
assert len(ps) == 2 * n # Two triangles
assert np.isclose(sum(weight for r, z, weight in ps), 1.0)
[docs]
def test_integral():
# Limits of integration
x0, x1 = 0.4, 1.3
y0, y1 = -0.2, 3.1
def func(x, y):
return x**2 - y**3 + x * y
exact_integral = (
(x1**3 - x0**3) * (y1 - y0) / 3
- (y1**4 - y0**4) * (x1 - x0) / 4
+ (x1**2 - x0**2) * (y1**2 - y0**2) / 4
)
# A 1st order method can't integrate this polynomial exactly
quad1 = quadrature.polygon_quad([(x0, y0), (x0, y1), (x1, y1), (x1, y0)], n=1)
assert not np.isclose(
quadrature.average(func, quad1), exact_integral / ((x1 - x0) * (y1 - y0))
)
for n in [3, 6]:
# Higher order methods can
quad1 = quadrature.polygon_quad([(x0, y0), (x0, y1), (x1, y1), (x1, y0)], n=n)
assert len(quad1) == 2 * n
assert np.isclose(
quadrature.average(func, quad1), exact_integral / ((x1 - x0) * (y1 - y0))
)