Polar Coordinates
By assembling general linear combinations of differential operators with variable coefficients, you can use vector calculus operators in coordinates other than Cartesian. Here we demonstrate polar coordinates in 2D.
import numpy as np
from findiff import Diff, Laplacian
Setup: Cartesian Laplacian
Consider the 2D paraboloid \(f(x, y) = x^2 + y^2\), whose Laplacian is trivially \(\nabla^2 f = 4\) everywhere.
x, y = [np.linspace(-5, 5, 100)] * 2
dx, dy = x[1] - x[0], y[1] - y[0]
X, Y = np.meshgrid(x, y, indexing='ij')
f = X**2 + Y**2
laplace = Laplacian(h=[dx, dy])
laplace_f = laplace(f) # array of 4.0 everywhere
Polar coordinates
In polar coordinates the same function is \(f(r, \varphi) = r^2\), and the Laplacian is:
\[\nabla^2 = \frac{\partial^2}{\partial r^2}
+ \frac{1}{r}\frac{\partial}{\partial r}
+ \frac{1}{r^2}\frac{\partial^2}{\partial \varphi^2}\]
In findiff:
r = np.linspace(0.1, 10, 100)
phi = np.linspace(0, 2*np.pi, 100, endpoint=False)
dr, dphi = r[1] - r[0], phi[1] - phi[0]
R, Phi = np.meshgrid(r, phi, indexing='ij')
f_polar = R**2
laplace_polar = (
Diff(0, dr)**2
+ (1/R) * Diff(0, dr)
+ (1/R**2) * Diff(1, dphi)**2
)
result = laplace_polar(f_polar) # array of 4.0 everywhere