Periodic Boundary Conditions
Added in version 0.12.
findiff supports periodic boundary conditions for differential operators and PDEs. This is useful for problems on periodic domains, such as Fourier-like settings.
Setup
import numpy as np
from findiff import Diff
# Periodic grid: endpoint=False is important!
x = np.linspace(0, 2*np.pi, 100, endpoint=False)
dx = x[1] - x[0]
f = np.sin(x)
Periodic derivatives
Pass periodic=True to enable periodic boundary conditions:
d_dx = Diff(0, dx, periodic=True)
df = d_dx(f)
The derivative wraps around at the boundaries — the last grid point is treated as the neighbor of the first.
Higher derivatives
Works the same way:
d2_dx2 = Diff(0, dx, periodic=True) ** 2
d2f = d2_dx2(f)
Multi-dimensional periodic grids
Periodicity can be enabled per axis:
x = np.linspace(0, 2*np.pi, 50, endpoint=False)
y = np.linspace(0, 2*np.pi, 50, endpoint=False)
dx, dy = x[1] - x[0], y[1] - y[0]
X, Y = np.meshgrid(x, y, indexing='ij')
f = np.sin(X) * np.cos(Y)
# Periodic in both x and y
d_dx = Diff(0, dx, periodic=True)
d_dy = Diff(1, dy, periodic=True)
laplacian = d_dx**2 + d_dy**2
result = laplacian(f)
Matrix representation
The matrix representation of periodic operators uses a circulant structure:
mat = d_dx.matrix(f.shape)