kform.RdFunctionality for dealing with \(k\)-forms
kform(S)
as.kform(M,coeffs,lose=TRUE)
kform_basis(n, k)
kform_general(W,k,coeffs,lose=TRUE)
is.kform(x)
d(i)
e(i,n)
# S3 method for class 'kform'
as.function(x,...)Dimension of the vector space \(V=\mathbb{R}^n\)
Integer
A \(k\)-form maps \(V^k\) to \(\mathbb{R}\)
Integer vector of dimensions
Index matrix and coefficients for a \(k\)-form
Object of class spray
Boolean, with default TRUE meaning to coerce a
\(0\)-form to a scalar and FALSE meaning to return the
formal \(0\)-form
Object of class kform
Further arguments, currently ignored
A \(k\)-form is an alternating \(k\)-tensor. In the
package, \(k\)-forms are represented as sparse arrays
(spray objects), but with a class of c("kform",
"spray"). The constructor function kform() takes a
spray object and returns a kform object: it ensures that
rows of the index matrix are strictly nonnegative integers, have no
repeated entries, and are strictly increasing. Function
as.kform() is more user-friendly.
kform() is the constructor function. It takes a
spray object and returns a kform.
as.kform() also returns a kform but is a bit more
user-friendly than kform().
kform_basis() is a low-level helper function that
returns a matrix whose rows constitute a basis for the vector space
\(\Lambda^k(\mathbb{R}^n)\) of \(k\)-forms.
kform_general() returns a kform object with terms
that span the space of alternating tensors.
is.kform() returns TRUE if its argument is a
kform object.
d() is an easily-typed synonym for
as.kform(). The idea is that d(1) = dx,
d(2)=dy, d(5)=dx^5, etc. Also note that, for
example, d(1:3)=dx^dy^dz, the volume form.
Recall that a \(k\)-tensor is a multilinear map from \(V^k\) to the reals, where \(V=\mathbb{R}^n\) is a vector space. A multilinear \(k\)-tensor \(T\) is alternating if it satisfies
$$T\left(v_1,\ldots,v_i,\ldots,v_j,\ldots,v_k\right)= -T\left(v_1,\ldots,v_j,\ldots,v_i,\ldots,v_k\right) $$
In the package, an object of class kform is an efficient
representation of an alternating tensor.
Function kform_basis() is a low-level helper function that
returns a matrix whose rows constitute a basis for the vector space
\(\Lambda^k(\mathbb{R}^n)\) of \(k\)-forms:
$$\phi=\sum_{1\leqslant i_1 < \cdots < i_k\leqslant n} a_{i_1\ldots i_k}\mathrm{d}x_{i_1}\wedge\cdots\wedge\mathrm{d}x_{i_k}$$
and indeed we have:
$$a_{i_1\ldots i_k}=\phi\left(\mathbf{e}_{i_1},\ldots,\mathbf{e}_{i_k}\right) $$
where \(\mathbf{e}_j,1\leqslant j\leqslant k\) is a basis for \(V\).
All functions documented here return a kform object except
as.function.kform(), which returns a function, and
is.kform(), which returns a Boolean, and e(), which
returns a conjugate basis to that of d().
Hubbard and Hubbard; Spivak
Hubbard and Hubbard use the term “\(k\)-form”, but Spivak does not.
as.kform(cbind(1:5,2:6),rnorm(5))
#> An alternating linear map from V^2 to R with V=R^6:
#> val
#> 5 6 = -0.66601844
#> 4 5 = 0.87461531
#> 3 4 = 1.07907227
#> 2 3 = -0.53258072
#> 1 2 = -0.05892959
kform_general(1:4,2,coeffs=1:6) # used in electromagnetism
#> An alternating linear map from V^2 to R with V=R^4:
#> val
#> 3 4 = 6
#> 2 4 = 5
#> 1 4 = 4
#> 2 3 = 3
#> 1 3 = 2
#> 1 2 = 1
K1 <- as.kform(cbind(1:5,2:6),rnorm(5))
K2 <- kform_general(5:8,2,1:6)
K1^K2 # or wedge(K1,K2)
#> An alternating linear map from V^4 to R with V=R^8:
#> val
#> 3 4 5 6 = -1.1815951
#> 1 2 6 8 = -5.6313796
#> 3 4 6 7 = -3.5447852
#> 4 5 7 8 = 0.3559057
#> 2 3 7 8 = -2.2166139
#> 1 2 7 8 = -6.7576556
#> 3 4 6 8 = -5.9079753
#> 1 2 6 7 = -3.3788278
#> 3 4 5 8 = -4.7263802
#> 2 3 5 6 = -0.3694356
#> 3 4 5 7 = -2.3631901
#> 2 3 5 7 = -0.7388713
#> 2 3 6 7 = -1.1083069
#> 1 2 5 6 = -1.1262759
#> 1 2 5 8 = -4.5051037
#> 4 5 6 7 = 0.1779529
#> 5 6 7 8 = -10.9897196
#> 1 2 5 7 = -2.2525519
#> 3 4 7 8 = -7.0895704
#> 4 5 6 8 = 0.2965881
#> 2 3 6 8 = -1.8471782
#> 2 3 5 8 = -1.4777426
d(1:3)
#> An alternating linear map from V^3 to R with V=R^3:
#> val
#> 1 2 3 = 1
dx^dy^dz # same thing
#> An alternating linear map from V^3 to R with V=R^3:
#> val
#> 1 2 3 = 1
d(sample(9)) # coeff is +/-1 depending on even/odd permutation of 1:9
#> An alternating linear map from V^9 to R with V=R^9:
#> val
#> 1 2 3 4 5 6 7 8 9 = 1
f <- as.function(wedge(K1,K2))
E <- matrix(rnorm(32),8,4)
f(E) + f(E[,c(1,3,2,4)]) # should be zero by alternating property
#> [1] 1.065814e-14
options(kform_symbolic_print = 'd')
(d(5)+d(7)) ^ (d(2)^d(5) + 6*d(4)^d(7))
#> An alternating linear map from V^3 to R with V=R^7:
#> -6 dx4^dx5^dx7 + dx2^dx5^dx7
options(kform_symbolic_print = NULL) # revert to default