This page was generated from
docs/tutorials/space-time-algebra.ipynb.
Interactive online version:
.
Space Time Algebra¶
Intro¶
This notebook demonstrates how to use clifford
to work with Space Time Algebra. The Pauli algebra of space \(\mathbb{P}\), and Dirac algebra of space-time \(\mathbb{D}\), are related using the spacetime split. The split is implemented by using a BladeMap
(docs), which maps a subset of blades in \(\mathbb{D}\) to the blades in \(\mathbb{P}\). This split allows a spacetime bivector \(F\) to be broken up into relative electric and
magnetic fields in space. Lorentz transformations are implemented as rotations in \(\mathbb{D}\), and the effects on the relative fields are computed with the split.
Setup¶
First we import clifford
, instantiate the two algebras, and populate the namespace with the blades of each algebra. The elements of \(\mathbb{D}\) are prefixed with \(d\), while the elements of \(\mathbb{P}\) are prefixed with \(p\). Although unconventional, it is easier to read and to translate into code.
[1]:
from clifford import Cl, pretty
pretty(precision=1)
# Dirac Algebra `D`
D, D_blades = Cl(1,3, firstIdx=0, names='d')
# Pauli Algebra `P`
P, P_blades = Cl(3, names='p')
# put elements of each in namespace
locals().update(D_blades)
locals().update(P_blades)
The Space Time Split¶
To two algebras can be related by the spacetime-split. First, we create a BladeMap
which relates the bivectors in \(\mathbb{D}\) to the vectors/bivectors in \(\mathbb{P}\). The scalars and pseudo-scalars in each algebra are equated.
[2]:
from clifford import BladeMap
bm = BladeMap([(d01,p1),
(d02,p2),
(d03,p3),
(d12,p12),
(d23,p23),
(d13,p13),
(d0123, p123)])
Splitting a space-time vector (an event)¶
A vector in \(\mathbb{D}\), represents a unique place in space and time, i.e. an event. To illustrate the split, create a random event \(X\).
[3]:
X = D.randomV()*10
X
[3]:
-(14.6^d0) - (5.3^d1) + (8.0^d2) - (10.4^d3)
This can be split into time and space components by multiplying with the time-vector \(d_0\),
[4]:
X*d0
[4]:
-14.6 + (5.3^d01) - (8.0^d02) + (10.4^d03)
and applying the BladeMap
, which results in a scalar+vector in \(\mathbb{P}\)
[5]:
bm(X*d0)
[5]:
-14.6 + (5.3^p1) - (8.0^p2) + (10.4^p3)
The space and time components can be separated by grade projection,
[6]:
x = bm(X*d0)
x(0) # the time component
[6]:
-14.6
[7]:
x(1) # the space component
[7]:
(5.3^p1) - (8.0^p2) + (10.4^p3)
We therefor define a split()
function, which has a simple condition allowing it to act on a vector or a multivector in \(\mathbb{D}\). Splitting a spacetime bivector will be treated in the next section.
[8]:
def split(X):
return bm(X.odd*d0+X.even)
[9]:
split(X)
[9]:
-14.6 + (5.3^p1) - (8.0^p2) + (10.4^p3)
The split can be inverted by applying the BladeMap
again, and multiplying by \(d_0\)
[10]:
x = split(X)
bm(x)*d0
[10]:
-(14.6^d0) - (5.3^d1) + (8.0^d2) - (10.4^d3)
Splitting a Bivector¶
Given a random bivector \(F\) in \(\mathbb{D}\),
[11]:
F = D.randomMV()(2)
F
[11]:
-(0.1^d01) + (1.3^d02) - (0.1^d03) - (0.7^d12) + (2.0^d13) + (1.9^d23)
\(F\) splits into a vector/bivector in \(\mathbb{P}\)
[12]:
split(F)
[12]:
-(0.1^p1) + (1.3^p2) - (0.1^p3) - (0.7^p12) + (2.0^p13) + (1.9^p23)
If \(F\) is interpreted as the electromagnetic bivector, the Electric and Magnetic fields can be separated by grade
[13]:
E = split(F)(1)
iB = split(F)(2)
E
[13]:
-(0.1^p1) + (1.3^p2) - (0.1^p3)
[14]:
iB
[14]:
-(0.7^p12) + (2.0^p13) + (1.9^p23)
Lorentz Transformations¶
Lorentz Transformations are rotations in \(\mathbb{D}\), which are implemented with Rotors. A rotor in G4 will, in general, have scalar, bivector, and quadvector components.
[15]:
R = D.randomRotor()
R
[15]:
-0.1 - (0.2^d01) + (2.2^d02) + (1.6^d03) - (2.1^d12) - (1.5^d13) - (0.8^d23) - (1.0^d0123)
In this way, the effect of a lorentz transformation on the electric and magnetic fields can be computed by rotating the bivector with \(F \rightarrow RF\tilde{R}\)
[16]:
F_ = R*F*~R
F_
[16]:
(1.7^d01) - (45.3^d02) - (3.4^d03) + (45.3^d12) + (3.4^d13) - (2.9^d23)
Then splitting into \(E\) and \(B\) fields
[17]:
E_ = split(F_)(1)
E_
[17]:
(1.7^p1) - (45.3^p2) - (3.4^p3)
[18]:
iB_ = split(F_)(2)
iB_
[18]:
(45.3^p12) + (3.4^p13) - (2.9^p23)
Lorentz Invariants¶
Since lorentz rotations in \(\mathbb{D}\), the magnitude of elements of \(\mathbb{D}\) are invariants of the lorentz transformation. For example, the magnitude of electromagnetic bivector \(F\) is invariant, and it can be related to \(E\) and \(B\) fields in \(\mathbb{P}\) through the split,
[19]:
i = p123
E = split(F)(1)
B = -i*split(F)(2)
[20]:
F**2
[20]:
-6.4 - (5.3^d0123)
[21]:
split(F**2) == E**2 - B**2 + (2*E|B)*i
[21]:
True