volume()
in the Stokes
packagefunction (n)
{
as.kform(seq_len(n))
}
To cite the stokes
package in publications, please use
Hankin (2022). Spivak (1965), in a memorable passage,
states:
The volume element
The fact that dim Λn(ℝn) = 1 is probably not new to you, since det is often defined as the unique element ω ∈ Λn(ℝn) such that ω(e1, …, en) = 1. For a general vector space V there is no extra criterion of this sort to distinguish a particular ω ∈ Λn(ℝn). Suppose, however, that an inner product T for V is given. If v1, …, vn and w1, …, wn are two bases which are orthonormal with respect to T, and the matrix A = (aij) 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 AT denotes the transpose of the matrix A, then we have A ⋅ AT = I, so det A = ±1. It follows from Theorem 4-6 [see vignettedet.Rmd
] that if ω ∈ Λn(V)
satisfies ω(v1, …, vn) = ±1,
then ω(w1, …, wn) = ±1.
If an orientation μ for V has also been given, it follows
that there is a unique ω ∈ Λn(V)
such that ω(v1, …, vn) = 1
whenever v1, …, vn
is an orthornormal basis such that [v1, …, vn] = μ.
This unique ω is called the
volume element of V,
determined by the inner product T and orientation μ. Note that det is the volume element of ℝn determined by the
usual inner product and usual orientation, and that |det (v1, …, vn)|
is the volume of the parallelepiped spanned by the line segments from
0 to each of v1, …, vn.
- Michael Spivak, 1969 (Calculus on Manifolds, Perseus books). Page 83
In the stokes
package, function volume(n)
returns the volume element on the usual basis, that is, ω(e1, …, en).
We will take n = 7 as an
example:
## 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:
## [1] 1
Above, we see that ω(e1, …, en) = 1. To verify that V(v1, …, vn) = det (A), where Aij = (vi)j:
## LHS RHS diff
## 1.770074 1.770074 0.000000
Now we create w1, …, wn, another orthonormal set. We may verify by generating a random orthogonal matrix and permuting 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 ±1 to within
numerical precision.