galgebra.mv¶
Multivector and Linear Multivector Differential Operator
Members¶
-
class
galgebra.mv.
Mv
(self, *args, ga, recp=None, **kwargs)[source]¶ Bases:
galgebra.printer.GaPrintable
Wrapper class for multivector objects (
self.obj
) so that it is easy to overload operators (*
,^
,|
,<
,>
) for the various multivector products and for printing.Also provides a constructor to easily instantiate multivector objects.
Additionally, the functionality of the multivector derivative have been added via the special vector
grad
so that one can take the geometric derivative of a multivector functionA
by applyinggrad
from the left,grad*A
, or the rightA*grad
for both the left and right derivatives. The operator between thegrad
and the ‘A’ can be any of the multivector product operators.If
f
is a scalar functiongrad*f
is the usual gradient of a function. IfA
is a vector functiongrad|f
is the divergence ofA
and-I*(grad^A)
is the curl ofA
(I is the pseudo scalar for the geometric algebra)-
obj
¶ The underlying sympy expression for this multivector
- Type
sympy.core.Expr
Note this constructor is overloaded, based on the type and number of positional arguments:
-
class
Mv
(*, ga, recp=None) Create a zero multivector
-
class
Mv
(expr, /, *, ga, recp=None) Create a multivector from an existing vector or sympy expression
-
class
Mv
(coeffs, grade, /, ga, recp=None) Create a multivector constant with a given grade
-
class
Mv
(name, category, /, *cat_args, ga, recp=None, f=False) Create a multivector constant with a given category
-
class
Mv
(name, grade, /, ga, recp=None, f=False) Create a multivector variable or function of a given grade
-
class
Mv
(coeffs, category, /, *cat_args, ga, recp=None) Create a multivector variable or function of a given category
*
and/
in the signatures above are python 3.8 syntax, and respectively indicate the boundaries between positional-only, normal, and keyword-only arguments.- Parameters
ga (Ga) – Geometric algebra to be used with multivectors
recp (object, optional) – Normalization for reciprocal vector. Unused.
name (str) – Name of this multivector, if it is a variable or function
coeffs (sequence) – Sequence of coefficients for the given category. This is only meaningful
category (str) –
One of:
"grade"
- this takes an additional argument, the grade to create, incat_args
"scalar"
"vector"
"bivector"
/"grade2"
"pseudo"
"mv"
"even"
/"spinor"
"odd"
f (bool, tuple) – True if function of coordinates, or a tuple of those coordinates. Only valid if a name is passed
coords –
This argument is always accepted but ignored.
It is incorrectly described internally as the coordinates to be used with multivector functions.
-
static
setup
(ga: Ga) → Tuple[Mv, List[Mv], Mv][source]¶ Set up constant multivectors required for multivector class for a given geometric algebra, ga.
-
static
Mul
(A: galgebra.mv.Mv, B: galgebra.mv.Mv, op: str) → galgebra.mv.Mv[source]¶ Function for all types of geometric multiplications called by overloaded operators for
*
,^
,|
,<
, and>
.
-
base_rep
() → galgebra.mv.Mv[source]¶ Express as a linear combination of geometric products
-
blade_rep
() → galgebra.mv.Mv[source]¶ Express as a linear combination of blades
-
collect
(deep=False) → galgebra.mv.Mv[source]¶ group coeffients of blades of multivector so there is only one coefficient per grade
-
is_blade
() → bool[source]¶ True is self is blade, otherwise False sets self.blade_flg and returns value
-
is_versor
() → bool[source]¶ Test for versor (geometric product of vectors)
This follows Leo Dorst’s test for a versor. Leo Dorst, ‘Geometric Algebra for Computer Science,’ p.533 Sets self.versor_flg and returns value
-
scalar
() → sympy.core.expr.Expr[source]¶ return scalar part of multivector as sympy expression
-
get_grade
(r: int) → galgebra.mv.Mv[source]¶ return r-th grade of multivector as a multivector
-
get_coefs
(grade: int) → List[sympy.core.expr.Expr][source]¶ Like
blade_coefs(self.Ga.mv_blades[grade])
, but requires all components to be of that grade.:raises ValueError:: If the multivector is not of the given grade.
-
blade_coefs
(blade_lst: List[Mv] = None) → List[sympy.core.expr.Expr][source]¶ For a multivector, A, and a list of basis blades, blade_lst return a list (sympy expressions) of the coefficients of each basis blade in blade_lst
-
proj
(bases_lst: List[Mv]) → galgebra.mv.Mv[source]¶ Project multivector onto a given list of bases. That is find the part of multivector with the same bases as in the bases_lst.
-
even
() → galgebra.mv.Mv[source]¶ return even parts of multivector
-
odd
() → galgebra.mv.Mv[source]¶ return odd parts of multivector
-
Grad
(coords, mode: str = '*', left: bool = True) → galgebra.mv.Mv[source]¶ Returns various derivatives (
*
,^
,|
,<
,>
) of multivector functions with respect to arbitrary coordinates, ‘coords’.This would be used where you have a multivector function of both the basis coordinate set and and auxiliary coordinate set. Consider for example a linear transformation in which the matrix coefficients depend upon the manifold coordinates, but the vector being transformed does not and you wish to take the divergence of the linear transformation with respect to the linear argument.
-
exp
(hint: str = '-') → galgebra.mv.Mv[source]¶ Only works if square of multivector is a scalar. If square is a number we can determine if square is > or < zero and hence if one should use trig or hyperbolic functions in expansion. If square is not a number use ‘hint’ to determine which type of functions to use in expansion
-
Fmt
(fmt: int = 1, title: str = None) → galgebra.printer.GaPrintable[source]¶ Set format for printing of multivectors
fmt=1 - One multivector per line
fmt=2 - One grade per line
fmt=3 - one base per line
Usage for multivector
A
example is:A.Fmt('2', 'A')
output is:
'A = '+str(A)
with one grade per line. Works for both standard printing and for latex.
-
norm
(hint: str = '+') → sympy.core.expr.Expr[source]¶ If A is a multivector and A*A.rev() is a scalar then:
A.norm() == sqrt(Abs(A*A.rev()))
The problem in simplifying the norm is that if
A
is symbolic you don’t know ifA*A.rev()
is positive or negative. The use of the hint argument is as follows:hint
A.norm()
'+'
sqrt(A*A.rev())
'-'
sqrt(-A*A.rev())
'0'
sqrt(Abs(A*A.rev()))
The default
hint='+'
is correct for vectors in a Euclidean vector space. For bivectors in a Euclidean vector space usehint='-'
. In a mixed signature space all bets are off for the norms of symbolic expressions.
-
simplify
(modes=<function simplify>) → galgebra.mv.Mv[source]¶ Simplify a multivector by scalar (sympy) simplifications.
modes is an operation or sequence of operations to apply to the the coefficients of a multivector expansion.
-
subs
(*args, **kwargs) → galgebra.mv.Mv[source]¶ Perform a substitution on each coefficient separately
-
-
galgebra.mv.
compare
(A: galgebra.mv.Mv, B: galgebra.mv.Mv) → Union[sympy.core.expr.Expr, int][source]¶ Determine if
B = c*A
where c is a scalar. If true return c otherwise return 0.
-
class
galgebra.mv.
Dop
(*args, ga: Ga, cmpflg: bool = False, debug: bool = False)[source]¶ Bases:
galgebra.dop._BaseDop
Differential operator class for multivectors. The operators are of the form
\[D = D^{i_{1}...i_{n}}\partial_{i_{1}...i_{n}}\]where the \(D^{i_{1}...i_{n}}\) are multivector functions of the coordinates \(x_{1},...,x_{n}\) and \(\partial_{i_{1}...i_{n}}\) are partial derivative operators
\[\partial_{i_{1}...i_{n}} = \frac{\partial^{i_{1}+...+i_{n}}}{\partial{x_{1}^{i_{1}}}...\partial{x_{n}^{i_{n}}}}.\]If \(*\) is any multivector multiplicative operation then the operator D operates on the multivector function \(F\) by the following definitions
\[D*F = D^{i_{1}...i_{n}}*\partial_{i_{1}...i_{n}}F\]returns a multivector and
\[F*D = F*D^{i_{1}...i_{n}}\partial_{i_{1}...i_{n}}\]returns a differential operator. If the
cmpflg
in the operator is set toTrue
the operation returns\[F*D = (\partial_{i_{1}...i_{n}}F)*D^{i_{1}...i_{n}}\]a multivector function. For example the representation of the grad operator in 3d would be:
\[\begin{split}D^{i_{1}...i_{n}} &= [e_x,e_y,e_z] \\ \partial_{i_{1}...i_{n}} &= [(1,0,0),(0,1,0),(0,0,1)].\end{split}\]See LaTeX documentation for definitions of operator algebraic operations
+
,-
,*
,^
,|
,<
, and>
.-
terms
¶ - Type
list of tuples
- Parameters
-
simplify
(modes=<function simplify>) → galgebra.mv.Dop[source]¶ Simplify each multivector coefficient of a partial derivative
-
consolidate_coefs
() → galgebra.mv.Dop[source]¶ Remove zero coefs and consolidate coefs with repeated pdiffs.
-
-
galgebra.mv.
Nga
(x, prec=5)[source]¶ Like
sympy.N()
, but also works on multivectorsFor multivectors with coefficients that contain floating point numbers, this rounds all these numbers to a precision of
prec
and returns the rounded multivector.
-
galgebra.mv.
cross
(v1: galgebra.mv.Mv, v2: galgebra.mv.Mv) → galgebra.mv.Mv[source]¶ If
v1
andv2
are 3-dimensional Euclidean vectors, compute the vector cross product \(v_{1}\times v_{2} = -I{\lp {v_{1}{\wedge}v_{2}} \rp }\).
-
galgebra.mv.
dual
(A: galgebra.mv.Mv) → galgebra.mv.Mv[source]¶ Equivalent to
Mv.dual()
-
galgebra.mv.
even
(A: galgebra.mv.Mv) → galgebra.mv.Mv[source]¶ Equivalent to
Mv.even()
-
galgebra.mv.
odd
(A: galgebra.mv.Mv) → galgebra.mv.Mv[source]¶ Equivalent to
Mv.odd()
-
galgebra.mv.
exp
(A: Union[galgebra.mv.Mv, sympy.core.expr.Expr], hint: str = '-') → Union[galgebra.mv.Mv, sympy.core.expr.Expr][source]¶ If
A
is a multivector thenA.exp(hint)
is returned. IfA
is a sympy expression the sympy expression \(e^{A}\) is returned (seesympy.exp()
).
-
galgebra.mv.
grade
(A: galgebra.mv.Mv, r: int = 0) → galgebra.mv.Mv[source]¶ Equivalent to
Mv.grade()
-
galgebra.mv.
inv
(A: galgebra.mv.Mv) → galgebra.mv.Mv[source]¶ Equivalent to
Mv.inv()
-
galgebra.mv.
norm
(A: galgebra.mv.Mv, hint: str = '+') → sympy.core.expr.Expr[source]¶ Equivalent to
Mv.norm()
-
galgebra.mv.
norm2
(A: galgebra.mv.Mv) → sympy.core.expr.Expr[source]¶ Equivalent to
Mv.norm2()
-
galgebra.mv.
proj
(B: galgebra.mv.Mv, A: galgebra.mv.Mv) → galgebra.mv.Mv[source]¶ Equivalent to
Mv.project_in_blade()
-
galgebra.mv.
rot
(itheta: galgebra.mv.Mv, A: galgebra.mv.Mv, hint: str = '-') → galgebra.mv.Mv[source]¶ Equivalent to
A.rotate_multivector(itheta, hint)
whereitheta
is the bi-vector blade defining the rotation. For the use ofhint
see the methodMv.rotate_multivector()
.
-
galgebra.mv.
refl
(B: galgebra.mv.Mv, A: galgebra.mv.Mv) → galgebra.mv.Mv[source]¶ Reflect multivector \(A\) in blade \(B\).
If \(s\) is grade of \(B\) returns \(\sum_{r}(-1)^{s(r+1)}B{\left < {A} \right >}_{r}B^{-1}\).
Equivalent to
Mv.reflect_in_blade()
-
galgebra.mv.
rev
(A: galgebra.mv.Mv) → galgebra.mv.Mv[source]¶ Equivalent to
Mv.rev()
-
galgebra.mv.
scalar
(A: galgebra.mv.Mv) → sympy.core.expr.Expr[source]¶ Equivalent to
Mv.scalar()