set.seed(0) library("stokes") options(rmarkdown.html_vignette.check_title = FALSE) knitr::opts_chunk$set(echo = TRUE) knit_print.function <- function(x, ...){dput(x)} registerS3method( "knit_print", "function", knit_print.function, envir = asNamespace("knitr") )
knitr::include_graphics(system.file("help/figures/stokes.png", package = "stokes"))
volume
To cite the stokes
package in publications, please use
@hankin2022_stokes. @spivak1965, in a memorable passage, states:
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}.$$ \noindent 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 83
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))
We can verify Spivak's reasoning as follows:
f <- as.function(V) f(diag(7))
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)
Now we create $w_1,\ldots,w_n$, 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))
Above we see that the volume element of M1
and M2
are $\pm1$ to
within numerical precision.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.