The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Function volume() in the Stokes package

Robin K. S. Hankin

volume
## function (n) 
## {
##     as.kform(seq_len(n))
## }
## <bytecode: 0x560d7d781e30>
## <environment: namespace:stokes>

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

The volume element

The fact that \(\operatorname{dim}\Lambda^n\left(\mathbb{R}^n\right)=1\) is probably not new to you, since \(\operatorname{det}\) is often defined as the unique element \(\omega\in\Lambda^n{\left(\mathbb{R}^n\right)}\) such that \(\omega{\left(e_1,\ldots,e_n\right)}=1\). For a general vector space \(V\) there is no extra criterion of this sort to distinguish a particular \(\omega\in\Lambda^n{\left(\mathbb{R}^n\right)}\). Suppose, however, that an inner product \(T\) for \(V\) is given. If \(v_1,\ldots,v_n\) and \(w_1,\ldots, w_n\) are two bases which are orthonormal with respect to \(T\), and the matrix \(A=\left(a_{ij}\right)\) is defined by \(w_i=\sum_{j=1}^n a_{ij}v_j\), then

\[\delta_{ij}=T{\left(w_i,w_j\right)}= \sum_{k,l=1}^n a_{ik}a_{jl}\,T{\left(v_k,v_l\right)}= \sum_{k=1}^n a_{ik}a_{jk}.\]

In other words, if \(A^T\) denotes the transpose of the matrix \(A\), then we have \(A\cdot A^T=I\), so \(\operatorname{det}A=\pm 1\). It follows from Theorem 4-6 [see vignette det.Rmd] that if \(\omega\in\Lambda^n(V)\) satisfies \(\omega{\left(v_1,\ldots,v_n\right)}=\pm 1\), then \(\omega{\left(w_1,\ldots,w_n\right)}=\pm 1\). If an orientation \(\mu\) for \(V\) has also been given, it follows that there is a unique \(\omega\in\Lambda^n(V)\) such that \(\omega\left(v_1,\ldots,v_n\right)=1\) whenever \(v_1,\ldots,v_n\) is an orthornormal basis such that \(\left[v_1,\ldots,v_n\right]=\mu\). This unique \(\omega\) is called the volume element of \(V\), determined by the inner product \(T\) and orientation \(\mu\). Note that \(\operatorname{det}\) is the volume element of \(\mathbb{R}^n\) determined by the usual inner product and usual orientation, and that \(\left|\operatorname{det}\left(v_1,\ldots,v_n\right)\right|\) is the volume of the parallelepiped spanned by the line segments from \(0\) to each of \(v_1,\ldots,v_n\).

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

In the stokes package, function volume(n) returns the volume element on the usual basis, that is, \(\omega{\left(e_1,\ldots,e_n\right)}\). We will take \(n=7\) as an example:

(V <- volume(7))
## An alternating linear map from V^7 to R with V=R^7:
##                    val
##  1 2 3 4 5 6 7  =    1

We can verify Spivak’s reasoning as follows:

f <- as.function(V)
f(diag(7))
## [1] 1

Above, we see that \(\omega{\left(e_1,\ldots,e_n\right)}=1\). To verify that \(V{\left(v_1,\ldots,v_n\right)}=\operatorname{det}(A)\), where \(A_{ij}=\left(v_i\right)_j\):

A <- matrix(rnorm(49),7,7)
LHS <- f(A)
RHS <- det(A)
c(LHS=LHS,RHS=RHS,diff=LHS-RHS)
##      LHS      RHS     diff 
## 1.770074 1.770074 0.000000

Now we create \(w_1,\ldots,w_n\), another orthonormal set. We may verify by generating a random orthogonal matrix and permutiting its rows:

M1 <- qr.Q(qr(matrix(rnorm(49),7,7)))  # M1: a random orthogonal matrix
M2 <- M1[c(2,1,3,4,5,6,7),]            # M2: (odd) permutation of rows of M1
c(f(M1),f(M2))
## [1]  1 -1

Above we see that the volume element of M1 and M2 are \(\pm1\) to within numerical precision.

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.