Objects dx, dy, and dz in the stokes package
Author: Robin K. S. Hankin

# Objects `dx`, `dy`, and `dz` in the `stokes` package

#### Robin K. S. Hankin

    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 \(e_1\), \(e_2\), \(e_2\) are discussed in vignette `ex.Rmd`).

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

Fields and forms

If \(f\colon\mathbb{R}^n\longrightarrow\mathbb{R}\) is differentiable, then \(Df(p)\in\Lambda^1(\mathbb{R}^n)\). By a minor modification we therefore obtain a \(1\)-form \(\mathrm{d}f\), defined by

\[\mathrm{d}f(p)(v_p)=Df(p)(v).\]

Let us consider in particular the \(1\)-forms \(\mathrm{d}\pi^i\) 1. It is customary to let \(x^i\) denote the function \(\pi^i\) (on \(\mathbb{R}^3\) we often denote \(x^1\), \(x^2\), and \(x^3\) by \(x\), \(y\), and \(z\)) \(\ldots\) Since \(\mathrm{d}x^i(p)(v_p)=\mathrm{d}\pi^i(p)(v_p)=D\pi^i(p)(v)=v^i\), we see that \(\mathrm{d}x^1(p),\ldots,\mathrm{d}x^n(p)\) is just the dual basis to \((e_1)_p,\ldots, (e_n)_p\).

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

Spivak goes on to observe that every \(k\)-form \(\omega\) can be written \(\omega=\sum_{i_1 < \cdots < i_k}\omega_{i_1,\ldots, i_k}\mathrm{d}x^{i_1}\wedge\cdots\wedge\mathrm{d}x^{i_k}\). If working in \(\mathbb{R}^3\), we have three elementary forms \(\mathrm{d}x\), \(\mathrm{d}y\), and \(\mathrm{d}z\); 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 \(\mathrm{d}x\colon\mathbb{R}^3\longrightarrow\mathbb{R}\) 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 \(e_1,e_2,e_3\) 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 \(\mathbb{R}^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 \(e_1,e_2,e_3\), 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 \(I_3\) as expected].

## Wedge products

The elementary forms may be combined with a wedge product. We note that \(\mathrm{d}x\wedge\mathrm{d}y\colon\left(\mathbb{R}^3\right)^2\longrightarrow\mathbb{R}\) 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=\mathrm{d}x\wedge\mathrm{d}y -7\mathrm{d}x\wedge\mathrm{d}z + 3\mathrm{d}y\wedge\mathrm{d}z\):

    (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 \(-7\mathrm{d}x\wedge\mathrm{d}z\)], this maps \(\left(\mathbb{R}^3\right)^2\) to \(\mathbb{R}\) 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 \(\mathrm{d}x\wedge\mathrm{d}y=-\mathrm{d}y\wedge\mathrm{d}x\):

    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 \(\mathrm{d}x^i,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 \(\pi^i\) notation on page 11: “if \(\pi\colon\mathbb{R}^n\longrightarrow\mathbb{R}^n\) is the identity function, \(\pi(x)=x\), then [its components are] \(\pi^i(x)=x^i\); the function \(\pi^i\) is called the \(i^\mathrm{th}\) projection function”↩︎