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(Rn)=1 is probably not new to you, since det is often defined as the unique element ω∈Λn(Rn) such that ω(e1,…,en)=1. For a general vector space V there is no extra criterion of this sort to distinguish a particular ω∈Λn(Rn). 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 wi=∑nj=1aijvj, then
δij=T(wi,wj)=n∑k,l=1aikajlT(vk,vl)=n∑k=1aikajk.
In other words, if AT denotes the transpose of the matrix A, then we have A⋅AT=I, so detA=±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 Rn 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.