packages feed

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 θ))