File size: 1,812 Bytes
9c6594c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#sympy.vector.kind
from sympy.core.kind import Kind, _NumberKind, NumberKind
from sympy.core.mul import Mul
class VectorKind(Kind):
"""
Kind for all vector objects in SymPy.
Parameters
==========
element_kind : Kind
Kind of the element. Default is
:class:`sympy.core.kind.NumberKind`,
which means that the vector contains only numbers.
Examples
========
Any instance of Vector class has kind ``VectorKind``:
>>> from sympy.vector.coordsysrect import CoordSys3D
>>> Sys = CoordSys3D('Sys')
>>> Sys.i.kind
VectorKind(NumberKind)
Operations between instances of Vector keep also have the kind ``VectorKind``:
>>> from sympy.core.add import Add
>>> v1 = Sys.i * 2 + Sys.j * 3 + Sys.k * 4
>>> v2 = Sys.i * Sys.x + Sys.j * Sys.y + Sys.k * Sys.z
>>> v1.kind
VectorKind(NumberKind)
>>> v2.kind
VectorKind(NumberKind)
>>> Add(v1, v2).kind
VectorKind(NumberKind)
Subclasses of Vector also have the kind ``VectorKind``, such as
Cross, VectorAdd, VectorMul or VectorZero.
See Also
========
sympy.core.kind.Kind
sympy.matrices.kind.MatrixKind
"""
def __new__(cls, element_kind=NumberKind):
obj = super().__new__(cls, element_kind)
obj.element_kind = element_kind
return obj
def __repr__(self):
return "VectorKind(%s)" % self.element_kind
@Mul._kind_dispatcher.register(_NumberKind, VectorKind)
def num_vec_mul(k1, k2):
"""
The result of a multiplication between a number and a Vector should be of VectorKind.
The element kind is selected by recursive dispatching.
"""
if not isinstance(k2, VectorKind):
k1, k2 = k2, k1
elemk = Mul._kind_dispatcher(k1, k2.element_kind)
return VectorKind(elemk)
|