test_vector.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. from sympy.core import Rational, S
  2. from sympy.simplify import simplify, trigsimp
  3. from sympy.core.function import (Derivative, Function, diff)
  4. from sympy.core.numbers import pi
  5. from sympy.core.symbol import symbols
  6. from sympy.functions.elementary.miscellaneous import sqrt
  7. from sympy.functions.elementary.trigonometric import (cos, sin)
  8. from sympy.integrals.integrals import Integral
  9. from sympy.matrices.immutable import ImmutableDenseMatrix as Matrix
  10. from sympy.vector.vector import Vector, BaseVector, VectorAdd, \
  11. VectorMul, VectorZero
  12. from sympy.vector.coordsysrect import CoordSys3D
  13. from sympy.vector.vector import Cross, Dot, cross
  14. from sympy.testing.pytest import raises
  15. C = CoordSys3D('C')
  16. i, j, k = C.base_vectors()
  17. a, b, c = symbols('a b c')
  18. def test_cross():
  19. v1 = C.x * i + C.z * C.z * j
  20. v2 = C.x * i + C.y * j + C.z * k
  21. assert Cross(v1, v2) == Cross(C.x*C.i + C.z**2*C.j, C.x*C.i + C.y*C.j + C.z*C.k)
  22. assert Cross(v1, v2).doit() == C.z**3*C.i + (-C.x*C.z)*C.j + (C.x*C.y - C.x*C.z**2)*C.k
  23. assert cross(v1, v2) == C.z**3*C.i + (-C.x*C.z)*C.j + (C.x*C.y - C.x*C.z**2)*C.k
  24. assert Cross(v1, v2) == -Cross(v2, v1)
  25. assert Cross(v1, v2) + Cross(v2, v1) == Vector.zero
  26. def test_dot():
  27. v1 = C.x * i + C.z * C.z * j
  28. v2 = C.x * i + C.y * j + C.z * k
  29. assert Dot(v1, v2) == Dot(C.x*C.i + C.z**2*C.j, C.x*C.i + C.y*C.j + C.z*C.k)
  30. assert Dot(v1, v2).doit() == C.x**2 + C.y*C.z**2
  31. assert Dot(v1, v2).doit() == C.x**2 + C.y*C.z**2
  32. assert Dot(v1, v2) == Dot(v2, v1)
  33. def test_vector_sympy():
  34. """
  35. Test whether the Vector framework confirms to the hashing
  36. and equality testing properties of SymPy.
  37. """
  38. v1 = 3*j
  39. assert v1 == j*3
  40. assert v1.components == {j: 3}
  41. v2 = 3*i + 4*j + 5*k
  42. v3 = 2*i + 4*j + i + 4*k + k
  43. assert v3 == v2
  44. assert v3.__hash__() == v2.__hash__()
  45. def test_vector():
  46. assert isinstance(i, BaseVector)
  47. assert i != j
  48. assert j != k
  49. assert k != i
  50. assert i - i == Vector.zero
  51. assert i + Vector.zero == i
  52. assert i - Vector.zero == i
  53. assert Vector.zero != 0
  54. assert -Vector.zero == Vector.zero
  55. v1 = a*i + b*j + c*k
  56. v2 = a**2*i + b**2*j + c**2*k
  57. v3 = v1 + v2
  58. v4 = 2 * v1
  59. v5 = a * i
  60. assert isinstance(v1, VectorAdd)
  61. assert v1 - v1 == Vector.zero
  62. assert v1 + Vector.zero == v1
  63. assert v1.dot(i) == a
  64. assert v1.dot(j) == b
  65. assert v1.dot(k) == c
  66. assert i.dot(v2) == a**2
  67. assert j.dot(v2) == b**2
  68. assert k.dot(v2) == c**2
  69. assert v3.dot(i) == a**2 + a
  70. assert v3.dot(j) == b**2 + b
  71. assert v3.dot(k) == c**2 + c
  72. assert v1 + v2 == v2 + v1
  73. assert v1 - v2 == -1 * (v2 - v1)
  74. assert a * v1 == v1 * a
  75. assert isinstance(v5, VectorMul)
  76. assert v5.base_vector == i
  77. assert v5.measure_number == a
  78. assert isinstance(v4, Vector)
  79. assert isinstance(v4, VectorAdd)
  80. assert isinstance(v4, Vector)
  81. assert isinstance(Vector.zero, VectorZero)
  82. assert isinstance(Vector.zero, Vector)
  83. assert isinstance(v1 * 0, VectorZero)
  84. assert v1.to_matrix(C) == Matrix([[a], [b], [c]])
  85. assert i.components == {i: 1}
  86. assert v5.components == {i: a}
  87. assert v1.components == {i: a, j: b, k: c}
  88. assert VectorAdd(v1, Vector.zero) == v1
  89. assert VectorMul(a, v1) == v1*a
  90. assert VectorMul(1, i) == i
  91. assert VectorAdd(v1, Vector.zero) == v1
  92. assert VectorMul(0, Vector.zero) == Vector.zero
  93. raises(TypeError, lambda: v1.outer(1))
  94. raises(TypeError, lambda: v1.dot(1))
  95. def test_vector_magnitude_normalize():
  96. assert Vector.zero.magnitude() == 0
  97. assert Vector.zero.normalize() == Vector.zero
  98. assert i.magnitude() == 1
  99. assert j.magnitude() == 1
  100. assert k.magnitude() == 1
  101. assert i.normalize() == i
  102. assert j.normalize() == j
  103. assert k.normalize() == k
  104. v1 = a * i
  105. assert v1.normalize() == (a/sqrt(a**2))*i
  106. assert v1.magnitude() == sqrt(a**2)
  107. v2 = a*i + b*j + c*k
  108. assert v2.magnitude() == sqrt(a**2 + b**2 + c**2)
  109. assert v2.normalize() == v2 / v2.magnitude()
  110. v3 = i + j
  111. assert v3.normalize() == (sqrt(2)/2)*C.i + (sqrt(2)/2)*C.j
  112. def test_vector_simplify():
  113. A, s, k, m = symbols('A, s, k, m')
  114. test1 = (1 / a + 1 / b) * i
  115. assert (test1 & i) != (a + b) / (a * b)
  116. test1 = simplify(test1)
  117. assert (test1 & i) == (a + b) / (a * b)
  118. assert test1.simplify() == simplify(test1)
  119. test2 = (A**2 * s**4 / (4 * pi * k * m**3)) * i
  120. test2 = simplify(test2)
  121. assert (test2 & i) == (A**2 * s**4 / (4 * pi * k * m**3))
  122. test3 = ((4 + 4 * a - 2 * (2 + 2 * a)) / (2 + 2 * a)) * i
  123. test3 = simplify(test3)
  124. assert (test3 & i) == 0
  125. test4 = ((-4 * a * b**2 - 2 * b**3 - 2 * a**2 * b) / (a + b)**2) * i
  126. test4 = simplify(test4)
  127. assert (test4 & i) == -2 * b
  128. v = (sin(a)+cos(a))**2*i - j
  129. assert trigsimp(v) == (2*sin(a + pi/4)**2)*i + (-1)*j
  130. assert trigsimp(v) == v.trigsimp()
  131. assert simplify(Vector.zero) == Vector.zero
  132. def test_vector_dot():
  133. assert i.dot(Vector.zero) == 0
  134. assert Vector.zero.dot(i) == 0
  135. assert i & Vector.zero == 0
  136. assert i.dot(i) == 1
  137. assert i.dot(j) == 0
  138. assert i.dot(k) == 0
  139. assert i & i == 1
  140. assert i & j == 0
  141. assert i & k == 0
  142. assert j.dot(i) == 0
  143. assert j.dot(j) == 1
  144. assert j.dot(k) == 0
  145. assert j & i == 0
  146. assert j & j == 1
  147. assert j & k == 0
  148. assert k.dot(i) == 0
  149. assert k.dot(j) == 0
  150. assert k.dot(k) == 1
  151. assert k & i == 0
  152. assert k & j == 0
  153. assert k & k == 1
  154. raises(TypeError, lambda: k.dot(1))
  155. def test_vector_cross():
  156. assert i.cross(Vector.zero) == Vector.zero
  157. assert Vector.zero.cross(i) == Vector.zero
  158. assert i.cross(i) == Vector.zero
  159. assert i.cross(j) == k
  160. assert i.cross(k) == -j
  161. assert i ^ i == Vector.zero
  162. assert i ^ j == k
  163. assert i ^ k == -j
  164. assert j.cross(i) == -k
  165. assert j.cross(j) == Vector.zero
  166. assert j.cross(k) == i
  167. assert j ^ i == -k
  168. assert j ^ j == Vector.zero
  169. assert j ^ k == i
  170. assert k.cross(i) == j
  171. assert k.cross(j) == -i
  172. assert k.cross(k) == Vector.zero
  173. assert k ^ i == j
  174. assert k ^ j == -i
  175. assert k ^ k == Vector.zero
  176. assert k.cross(1) == Cross(k, 1)
  177. def test_projection():
  178. v1 = i + j + k
  179. v2 = 3*i + 4*j
  180. v3 = 0*i + 0*j
  181. assert v1.projection(v1) == i + j + k
  182. assert v1.projection(v2) == Rational(7, 3)*C.i + Rational(7, 3)*C.j + Rational(7, 3)*C.k
  183. assert v1.projection(v1, scalar=True) == S.One
  184. assert v1.projection(v2, scalar=True) == Rational(7, 3)
  185. assert v3.projection(v1) == Vector.zero
  186. assert v3.projection(v1, scalar=True) == S.Zero
  187. def test_vector_diff_integrate():
  188. f = Function('f')
  189. v = f(a)*C.i + a**2*C.j - C.k
  190. assert Derivative(v, a) == Derivative((f(a))*C.i +
  191. a**2*C.j + (-1)*C.k, a)
  192. assert (diff(v, a) == v.diff(a) == Derivative(v, a).doit() ==
  193. (Derivative(f(a), a))*C.i + 2*a*C.j)
  194. assert (Integral(v, a) == (Integral(f(a), a))*C.i +
  195. (Integral(a**2, a))*C.j + (Integral(-1, a))*C.k)
  196. def test_vector_args():
  197. raises(ValueError, lambda: BaseVector(3, C))
  198. raises(TypeError, lambda: BaseVector(0, Vector.zero))
  199. def test_srepr():
  200. from sympy.printing.repr import srepr
  201. res = "CoordSys3D(Str('C'), Tuple(ImmutableDenseMatrix([[Integer(1), "\
  202. "Integer(0), Integer(0)], [Integer(0), Integer(1), Integer(0)], "\
  203. "[Integer(0), Integer(0), Integer(1)]]), VectorZero())).i"
  204. assert srepr(C.i) == res
  205. def test_scalar():
  206. from sympy.vector import CoordSys3D
  207. C = CoordSys3D('C')
  208. v1 = 3*C.i + 4*C.j + 5*C.k
  209. v2 = 3*C.i - 4*C.j + 5*C.k
  210. assert v1.is_Vector is True
  211. assert v1.is_scalar is False
  212. assert (v1.dot(v2)).is_scalar is True
  213. assert (v1.cross(v2)).is_scalar is False