egison-5.1.0: sample/math/geometry/surface.egi
-- Surface Geometry: First and Second Fundamental Forms
declare symbol x, y
def f := function (x, y)
def v1 := [|1, 0, ∂/∂ (f x y) x|]
def v2 := [|0, 1, ∂/∂ (f x y) y|]
assertEqual "tangent vector v1"
v1
[| 1, 0, (userRefs f [1]) x y |]
assertEqual "tangent vector v2"
v2
[| 0, 1, (userRefs f [2]) x y |]
def v3 := crossProduct v1 v2
assertEqual "normal vector (cross product)"
v3
[| - (userRefs f [1]) x y, - (userRefs f [2]) x y, 1 |]
def e3 := v3 / sqrt '(V.* v3 v3)
-- Unit normal vector
assertEqual "unit normal vector e3"
e3
[| - (userRefs f [1]) x y / sqrt (((userRefs f [1]) x y)^2 + ((userRefs f [2]) x y)^2 + 1), - (userRefs f [2]) x y / sqrt (((userRefs f [1]) x y)^2 + ((userRefs f [2]) x y)^2 + 1), 1 / sqrt (((userRefs f [1]) x y)^2 + ((userRefs f [2]) x y)^2 + 1) |]
-- First fundamental form coefficients
def E := V.* v1 v1
def F := V.* v1 v2
def G := V.* v2 v2
assertEqual "E (first fundamental form)"
E
(1 + ((userRefs f [1]) x y)^2)
assertEqual "F (first fundamental form)"
F
((userRefs f [1]) x y * (userRefs f [2]) x y)
assertEqual "G (first fundamental form)"
G
(1 + ((userRefs f [2]) x y)^2)
-- Second fundamental form coefficients
def L := V.* (∂/∂ v1 x) e3
def M := V.* (∂/∂ v1 y) e3
def N := V.* (∂/∂ v2 y) e3
assertEqual "L (second fundamental form)"
L
((userRefs f [1, 1]) x y / sqrt (((userRefs f [1]) x y)^2 + ((userRefs f [2]) x y)^2 + 1))
assertEqual "M (second fundamental form)"
M
((userRefs f [1, 2]) x y / sqrt (((userRefs f [1]) x y)^2 + ((userRefs f [2]) x y)^2 + 1))
assertEqual "N (second fundamental form)"
N
((userRefs f [2, 2]) x y / sqrt (((userRefs f [1]) x y)^2 + ((userRefs f [2]) x y)^2 + 1))
-- Gaussian curvature K and mean curvature H
def K := (L * N - M ^ 2) / '(E * G - F ^ 2)
def H := ('E * N + 'G * L + (-2) * F * M) / 2 * `(E * G - F ^ 2)
-- The formulas for K and H involve complex expressions with partial derivatives
-- They represent the Gaussian and mean curvatures of the surface z = f(x, y)