egison-5.1.0: sample/math/geometry/polar-laplacian-2d.egi
--
-- 2D Polar Laplacian using chain rule
--
declare symbol r, θ : MathValue
def x : MathValue := r * cos θ
def y : MathValue := r * sin θ
def u := function (x, y)
def uR : MathValue := ∂/∂ u r
-- Chain rule: ∂u/∂r = u|1 * ∂x/∂r + u|2 * ∂y/∂r = u|1 * cos θ + u|2 * sin θ.
-- u|i (the i-th partial of u) is constructed via `userRefs u [i]`.
assertEqual "∂u/∂r"
uR
(cos θ * (userRefs u [1]) (r * cos θ) (r * sin θ)
+ sin θ * (userRefs u [2]) (r * cos θ) (r * sin θ))
def uRR : MathValue := ∂/∂ (∂/∂ u r) r
def uΘ : MathValue := ∂/∂ u θ
def uΘΘ : MathValue := ∂/∂ (∂/∂ u θ) θ
-- Laplacian in polar coordinates: ∂²u/∂r² + (1/r)∂u/∂r + (1/r²)∂²u/∂θ²
-- Should simplify to u|1|1 + u|2|2 (the cartesian Laplacian).
assertEqual "Full Laplacian in polar coordinates"
(uRR + 1 / r * uR + 1 / r ^ 2 * uΘΘ)
((userRefs u [1, 1]) (r * cos θ) (r * sin θ)
+ (userRefs u [2, 2]) (r * cos θ) (r * sin θ))