Objects dx, dy, and dz in the stokes package

dx <- d(1)
dy <- d(2)
dz <- d(3)

To cite the stokes package in publications, please use Hankin (2022). Convenience objects dx, dy, and dz, corresponding to elementary differential forms, are discussed here (basis vectors e1, e2, e2 are discussed in vignette ex.Rmd).

Spivak (1965), in a memorable passage, states:

Fields and forms

If f: ℝn → ℝ is differentiable, then Df(p) ∈ Λ1(ℝn). By a minor modification we therefore obtain a 1-form df, defined by

df(p)(vp) = Df(p)(v).

Let us consider in particular the 1-forms dπi 1. It is customary to let xi denote the function πi (on 3 we often denote x1, x2, and x3 by x, y, and z) Since dxi(p)(vp) = dπi(p)(vp) = Dπi(p)(v) = vi, we see that dx1(p), …, dxn(p) is just the dual basis to (e1)p, …, (en)p.

- Michael Spivak, 1969 (Calculus on Manifolds, Perseus books). Page 89

Spivak goes on to observe that every k-form ω can be written ω = ∑i1 < ⋯ < ikωi1, …, ikdxi1 ∧ ⋯ ∧ dxik. If working in 3, we have three elementary forms dx, dy, and dz; in the package we have the pre-defined objects dx, dy, and dz. These are convenient for reproducing textbook results.

We conceptualise dx as “picking out” the x-component of a 3-vector and similarly for dy and dz. Recall that dx: ℝ3 → ℝ and we have

$$ dx\begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix} = u_1\qquad dy\begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix} = u_2\qquad dz\begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix} = u_3. $$

Noting that 1-forms are a vector space, we have in general

$$(a\cdot\mathrm{d}x + b\cdot\mathrm{d}y +c\cdot\mathrm{d}z) \begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix} = au_1+bu_2+cu_3 $$

Numerically:

v <- c(2,3,7)
c(as.function(dx)(v),as.function(dx+dy)(v),as.function(dx+100*dz)(v))
## [1]   2   5 702

As Spivak says, dx, dy and dz are conjugate to e1, e2, e3 and these are defined using function e(). In this case it is safer to pass n=3 to function e() in order to specify that we are working in 3.

e(1,3)
## [1] 1 0 0
e(2,3)
## [1] 0 1 0
e(3,3)
## [1] 0 0 1

We will now verify numerically that dx, dy and dz are indeed conjugate to e1, e2, e3, but to do this we will define an orthonormal set of vectors u, v, w:

u <- e(1,3)
v <- e(2,3)
w <- e(3,3)
matrix(c(
    as.function(dx)(u), as.function(dx)(v), as.function(dx)(w),
    as.function(dy)(u), as.function(dy)(v), as.function(dy)(w),
    as.function(dz)(u), as.function(dz)(v), as.function(dz)(w)
),3,3)
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1

Above we see the conjugacy clearly [obtaining I3 as expected].

Wedge products

The elementary forms may be combined with a wedge product. We note that dx ∧ dy: (ℝ3)2 → ℝ and, for example,

$$ (\mathrm{d}x\wedge\mathrm{d}y)\left( \begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix}, \begin{pmatrix}v_1\\v_2\\v_3\end{pmatrix} \right) = \det\begin{pmatrix}u_1&v_1\\u_2&v_2\end{pmatrix} $$

and

$$ (\mathrm{d}x\wedge\mathrm{d}y\wedge\mathrm{d}z) \left( \begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix}, \begin{pmatrix}v_1\\v_2\\v_3\end{pmatrix}, \begin{pmatrix}w_1\\w_2\\w_3\end{pmatrix} \right) = \det\begin{pmatrix}u_1&v_1&w_1\\u_2&v_2&w_2\\u_3&v_3&w_3\end{pmatrix} $$

Numerically:

as.function(dx ^ dy)(cbind(c(2,3,5),c(4,1,2)))
## [1] -10

Above we see the package correctly giving $\det\begin{pmatrix}2&4\\3&1\end{pmatrix}=2-12=-10$.

The print method

Here I give some illustrations of the package print method.

dx
## An alternating linear map from V^1 to R with V=R^1:
##        val
##  1  =    1

This is somewhat opaque and difficult to understand. It is easier to start with a more complicated example: take X = dx ∧ dy − 7dx ∧ dz + 3dy ∧ dz:

(X <- dx^dy -7*dx^dz + 3*dy^dz)
## An alternating linear map from V^2 to R with V=R^3:
##          val
##  1 3  =   -7
##  2 3  =    3
##  1 2  =    1

We see that X has three rows for the three elementary components. Taking the row with coefficient −7 [which would be −7dx ∧ dz], this maps (ℝ3)2 to and we have

$$(-7\mathrm{d}x\wedge\mathrm{d}z)\left(\begin{pmatrix} u_1\\u_2\\u_3\end{pmatrix}, \begin{pmatrix}v_1\\v_2\\v_3\end{pmatrix}\right)= -7\det\begin{pmatrix}u_1&v_1\\u_3&v_3\end{pmatrix} $$

The other two rows would be

$$(3\mathrm{d}y\wedge\mathrm{d}z)\left( \begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix}, \begin{pmatrix}v_1\\v_2\\v_3\end{pmatrix} \right) = 3\det\begin{pmatrix}u_2&v_2\\u_3&v_3\end{pmatrix}$$

and

$$(1\mathrm{d}x\wedge\mathrm{d}y)\left( \begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix}, \begin{pmatrix}v_1\\v_2\\v_3\end{pmatrix} \right) = \det\begin{pmatrix}u_1&v_1\\u_2&v_2\end{pmatrix} $$

Thus form X would be, by linearity

$$ X\left( \begin{pmatrix}u_1\\u_2\\u_3\end{pmatrix}, \begin{pmatrix}v_1\\v_2\\v_3\end{pmatrix} \right) = -7\det\begin{pmatrix}u_1&v_1\\u_3&v_3\end{pmatrix} +3\det\begin{pmatrix}u_2&v_2\\u_3&v_3\end{pmatrix} +\det\begin{pmatrix}u_1&v_1\\u_2&v_2\end{pmatrix}. $$

We might want to verify that dx ∧ dy = −dy ∧ dx:

dx ^ dy == -dy ^ dx
## [1] TRUE

Configuring the print method

The print method is configurable and can display kforms in symbolic form. For working with dx dy dz we may set option kform_symbolic_print to dx:

options(kform_symbolic_print = 'dx')

Then the results of calculations are more natural:

dx
## An alternating linear map from V^1 to R with V=R^1:
##  + dx
dx^dy + 56*dy^dz
## An alternating linear map from V^2 to R with V=R^3:
##  + dx^dy +56 dy^dz

However, this setting can be confusing if we work with dxi, i > 3, for the print method runs out of alphabet:

rform()
## An alternating linear map from V^3 to R with V=R^7:
##  +6 dy^dNA^dNA +5 dy^dNA^dNA -9 dNA^dNA^dNA +4 dx^dz^dNA +7 dx^dNA^dNA -3 dy^dz^dNA -8 dx^dNA^dNA +2 dx^dy^dNA + dx^dNA^dNA

Above, we see the use of NA because there is no defined symbol.

The Hodge dual

Function hodge() returns the Hodge dual:

hodge(dx^dy + 13*dy^dz)
## An alternating linear map from V^1 to R with V=R^3:
##  +13 dx + dz

Note that calling hodge(dx) can be confusing:

hodge(dx)
## [1] 1

This returns a scalar because dx is interpreted as a one-form on one-dimensional space, which is a scalar form. One usually wants the result in three dimensions:

hodge(dx,3)
## An alternating linear map from V^2 to R with V=R^3:
##  + dy^dz

This is further discussed in the dovs vignette.

Creating elementary one-forms

Package function d() will create elementary one-forms but it is easier to interpret the output if we restore the default print method

options(kform_symbolic_print = NULL)
d(8)
## An alternating linear map from V^1 to R with V=R^8:
##        val
##  8  =    1

Package dataset

Following lines create dx.rda, residing in the data/ directory of the package.

save(dx, dy, dz, file="dx.rda")

References

Hankin, R. K. S. 2022. “Stokes’s Theorem in R.” arXiv. https://doi.org/10.48550/ARXIV.2210.17008.
Spivak, M. 1965. Calculus on Manifolds. Addison-Wesley.

  1. Spivak introduces the πi notation on page 11: “if π: ℝn → ℝn is the identity function, π(x) = x, then [its components are] πi(x) = xi; the function πi is called the ith projection function↩︎