A Wolfram Language/Mathematica package for working with Geometric Algebra
To use this package, put it in your working directory and import it using:
<<GeometricAlgebra`
Basis vectors are represented using e[i]
where i is an index/label. In typical usage, i is a non-negative integer, e.g. e[3]
, e[0]
, but arbitrary symbols or expressions are permitted: e[x]
, e[∞]
, and e[time]
would all be valid. Additionally, basis k-vectors may, for convenience, be given as sequences of arguments: e[1,2]
(a basis bivector), e[1,3,5]
(a basis trivector). These are expanded into geometric products of basis vectors.
Geometric products are represented using the built-in Wolfram Language function NonCommutativeMultiply, which has operator form **
. These may then be expanded using ExpandNCM
. Basis vectors automatically order themselves when multiplied: e[2]**e[1]
becomes -e[1]**e[2]
.
This library presently assumes orthogonality between all basis vectors. What each one squares to may be changed, however, by assigning values to Metric[i]
, which may be arbitrary expressions. This can be useful for Spacetime Algebra, Projective Geometric Algebra, and working in alternative charts, manifolds, or spaces. For example:
In[2]:= {e[0]**e[0], e[1]**e[1], e[2]**e[2]}
Out[2]= {1, 1, 1}
In[3]:= Metric[0]=0; Metric[1]=-1; Metric[2]=r;
In[4]:= {e[0]**e[0], e[1]**e[1], e[2]**e[2]}
Out[4]= {0, -1, r}
KVectorPart[mv,k]
will extract the k-vector part of a multivector mv
. ScalarPart[mv]
will give the scalar part of a multivector mv
(equivalent to KVectorPart[mv,0]
). KVectorDecomposition is also provided which splits a multivector into a list of its parts:
In[2]:= KVectorDecomposition[1+e[1]-e[2,3]+4e[1,2,3,4]]
Out[2]= {1, e[1], -e[2] ** e[3], 0, 4 e[1] ** e[2] ** e[3] ** e[4]}
This package includes the following products: GeometricProduct, OuterProduct, CommutatorProduct, LeftContraction, RightContraction, FatDotProduct, and ScalarProduct.
The package includes various involutions: Reversion, Involution, and Conjugation. MultivectorNorm and MultivectorNormSquared are provided for calculating norms. Angle computes the angle between two blades.
Symbolic vectors may be represented using OverVector, which renders an arrow over a symbol. These behave properly as though they are vectors in functions like KVectorPart and ExpandNCM. I also plan on expanding symbolic capabilities further as I continue to work on this package.