kind.py 1.8 KB

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