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