test_functions.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. from sympy.core.numbers import pi
  2. from sympy.core.singleton import S
  3. from sympy.core.symbol import symbols
  4. from sympy.functions.elementary.miscellaneous import sqrt
  5. from sympy.functions.elementary.trigonometric import (cos, sin)
  6. from sympy.integrals.integrals import Integral
  7. from sympy.physics.vector import Dyadic, Point, ReferenceFrame, Vector
  8. from sympy.physics.vector.functions import (cross, dot, express,
  9. time_derivative,
  10. kinematic_equations, outer,
  11. partial_velocity,
  12. get_motion_params, dynamicsymbols)
  13. from sympy.testing.pytest import raises
  14. Vector.simp = True
  15. q1, q2, q3, q4, q5 = symbols('q1 q2 q3 q4 q5')
  16. N = ReferenceFrame('N')
  17. A = N.orientnew('A', 'Axis', [q1, N.z])
  18. B = A.orientnew('B', 'Axis', [q2, A.x])
  19. C = B.orientnew('C', 'Axis', [q3, B.y])
  20. def test_dot():
  21. assert dot(A.x, A.x) == 1
  22. assert dot(A.x, A.y) == 0
  23. assert dot(A.x, A.z) == 0
  24. assert dot(A.y, A.x) == 0
  25. assert dot(A.y, A.y) == 1
  26. assert dot(A.y, A.z) == 0
  27. assert dot(A.z, A.x) == 0
  28. assert dot(A.z, A.y) == 0
  29. assert dot(A.z, A.z) == 1
  30. def test_dot_different_frames():
  31. assert dot(N.x, A.x) == cos(q1)
  32. assert dot(N.x, A.y) == -sin(q1)
  33. assert dot(N.x, A.z) == 0
  34. assert dot(N.y, A.x) == sin(q1)
  35. assert dot(N.y, A.y) == cos(q1)
  36. assert dot(N.y, A.z) == 0
  37. assert dot(N.z, A.x) == 0
  38. assert dot(N.z, A.y) == 0
  39. assert dot(N.z, A.z) == 1
  40. assert dot(N.x, A.x + A.y) == sqrt(2)*cos(q1 + pi/4) == dot(A.x + A.y, N.x)
  41. assert dot(A.x, C.x) == cos(q3)
  42. assert dot(A.x, C.y) == 0
  43. assert dot(A.x, C.z) == sin(q3)
  44. assert dot(A.y, C.x) == sin(q2)*sin(q3)
  45. assert dot(A.y, C.y) == cos(q2)
  46. assert dot(A.y, C.z) == -sin(q2)*cos(q3)
  47. assert dot(A.z, C.x) == -cos(q2)*sin(q3)
  48. assert dot(A.z, C.y) == sin(q2)
  49. assert dot(A.z, C.z) == cos(q2)*cos(q3)
  50. def test_cross():
  51. assert cross(A.x, A.x) == 0
  52. assert cross(A.x, A.y) == A.z
  53. assert cross(A.x, A.z) == -A.y
  54. assert cross(A.y, A.x) == -A.z
  55. assert cross(A.y, A.y) == 0
  56. assert cross(A.y, A.z) == A.x
  57. assert cross(A.z, A.x) == A.y
  58. assert cross(A.z, A.y) == -A.x
  59. assert cross(A.z, A.z) == 0
  60. def test_cross_different_frames():
  61. assert cross(N.x, A.x) == sin(q1)*A.z
  62. assert cross(N.x, A.y) == cos(q1)*A.z
  63. assert cross(N.x, A.z) == -sin(q1)*A.x - cos(q1)*A.y
  64. assert cross(N.y, A.x) == -cos(q1)*A.z
  65. assert cross(N.y, A.y) == sin(q1)*A.z
  66. assert cross(N.y, A.z) == cos(q1)*A.x - sin(q1)*A.y
  67. assert cross(N.z, A.x) == A.y
  68. assert cross(N.z, A.y) == -A.x
  69. assert cross(N.z, A.z) == 0
  70. assert cross(N.x, A.x) == sin(q1)*A.z
  71. assert cross(N.x, A.y) == cos(q1)*A.z
  72. assert cross(N.x, A.x + A.y) == sin(q1)*A.z + cos(q1)*A.z
  73. assert cross(A.x + A.y, N.x) == -sin(q1)*A.z - cos(q1)*A.z
  74. assert cross(A.x, C.x) == sin(q3)*C.y
  75. assert cross(A.x, C.y) == -sin(q3)*C.x + cos(q3)*C.z
  76. assert cross(A.x, C.z) == -cos(q3)*C.y
  77. assert cross(C.x, A.x) == -sin(q3)*C.y
  78. assert cross(C.y, A.x) == sin(q3)*C.x - cos(q3)*C.z
  79. assert cross(C.z, A.x) == cos(q3)*C.y
  80. def test_operator_match():
  81. """Test that the output of dot, cross, outer functions match
  82. operator behavior.
  83. """
  84. A = ReferenceFrame('A')
  85. v = A.x + A.y
  86. d = v | v
  87. zerov = Vector(0)
  88. zerod = Dyadic(0)
  89. # dot products
  90. assert d & d == dot(d, d)
  91. assert d & zerod == dot(d, zerod)
  92. assert zerod & d == dot(zerod, d)
  93. assert d & v == dot(d, v)
  94. assert v & d == dot(v, d)
  95. assert d & zerov == dot(d, zerov)
  96. assert zerov & d == dot(zerov, d)
  97. raises(TypeError, lambda: dot(d, S.Zero))
  98. raises(TypeError, lambda: dot(S.Zero, d))
  99. raises(TypeError, lambda: dot(d, 0))
  100. raises(TypeError, lambda: dot(0, d))
  101. assert v & v == dot(v, v)
  102. assert v & zerov == dot(v, zerov)
  103. assert zerov & v == dot(zerov, v)
  104. raises(TypeError, lambda: dot(v, S.Zero))
  105. raises(TypeError, lambda: dot(S.Zero, v))
  106. raises(TypeError, lambda: dot(v, 0))
  107. raises(TypeError, lambda: dot(0, v))
  108. # cross products
  109. raises(TypeError, lambda: cross(d, d))
  110. raises(TypeError, lambda: cross(d, zerod))
  111. raises(TypeError, lambda: cross(zerod, d))
  112. assert d ^ v == cross(d, v)
  113. assert v ^ d == cross(v, d)
  114. assert d ^ zerov == cross(d, zerov)
  115. assert zerov ^ d == cross(zerov, d)
  116. assert zerov ^ d == cross(zerov, d)
  117. raises(TypeError, lambda: cross(d, S.Zero))
  118. raises(TypeError, lambda: cross(S.Zero, d))
  119. raises(TypeError, lambda: cross(d, 0))
  120. raises(TypeError, lambda: cross(0, d))
  121. assert v ^ v == cross(v, v)
  122. assert v ^ zerov == cross(v, zerov)
  123. assert zerov ^ v == cross(zerov, v)
  124. raises(TypeError, lambda: cross(v, S.Zero))
  125. raises(TypeError, lambda: cross(S.Zero, v))
  126. raises(TypeError, lambda: cross(v, 0))
  127. raises(TypeError, lambda: cross(0, v))
  128. # outer products
  129. raises(TypeError, lambda: outer(d, d))
  130. raises(TypeError, lambda: outer(d, zerod))
  131. raises(TypeError, lambda: outer(zerod, d))
  132. raises(TypeError, lambda: outer(d, v))
  133. raises(TypeError, lambda: outer(v, d))
  134. raises(TypeError, lambda: outer(d, zerov))
  135. raises(TypeError, lambda: outer(zerov, d))
  136. raises(TypeError, lambda: outer(zerov, d))
  137. raises(TypeError, lambda: outer(d, S.Zero))
  138. raises(TypeError, lambda: outer(S.Zero, d))
  139. raises(TypeError, lambda: outer(d, 0))
  140. raises(TypeError, lambda: outer(0, d))
  141. assert v | v == outer(v, v)
  142. assert v | zerov == outer(v, zerov)
  143. assert zerov | v == outer(zerov, v)
  144. raises(TypeError, lambda: outer(v, S.Zero))
  145. raises(TypeError, lambda: outer(S.Zero, v))
  146. raises(TypeError, lambda: outer(v, 0))
  147. raises(TypeError, lambda: outer(0, v))
  148. def test_express():
  149. assert express(Vector(0), N) == Vector(0)
  150. assert express(S.Zero, N) is S.Zero
  151. assert express(A.x, C) == cos(q3)*C.x + sin(q3)*C.z
  152. assert express(A.y, C) == sin(q2)*sin(q3)*C.x + cos(q2)*C.y - \
  153. sin(q2)*cos(q3)*C.z
  154. assert express(A.z, C) == -sin(q3)*cos(q2)*C.x + sin(q2)*C.y + \
  155. cos(q2)*cos(q3)*C.z
  156. assert express(A.x, N) == cos(q1)*N.x + sin(q1)*N.y
  157. assert express(A.y, N) == -sin(q1)*N.x + cos(q1)*N.y
  158. assert express(A.z, N) == N.z
  159. assert express(A.x, A) == A.x
  160. assert express(A.y, A) == A.y
  161. assert express(A.z, A) == A.z
  162. assert express(A.x, B) == B.x
  163. assert express(A.y, B) == cos(q2)*B.y - sin(q2)*B.z
  164. assert express(A.z, B) == sin(q2)*B.y + cos(q2)*B.z
  165. assert express(A.x, C) == cos(q3)*C.x + sin(q3)*C.z
  166. assert express(A.y, C) == sin(q2)*sin(q3)*C.x + cos(q2)*C.y - \
  167. sin(q2)*cos(q3)*C.z
  168. assert express(A.z, C) == -sin(q3)*cos(q2)*C.x + sin(q2)*C.y + \
  169. cos(q2)*cos(q3)*C.z
  170. # Check to make sure UnitVectors get converted properly
  171. assert express(N.x, N) == N.x
  172. assert express(N.y, N) == N.y
  173. assert express(N.z, N) == N.z
  174. assert express(N.x, A) == (cos(q1)*A.x - sin(q1)*A.y)
  175. assert express(N.y, A) == (sin(q1)*A.x + cos(q1)*A.y)
  176. assert express(N.z, A) == A.z
  177. assert express(N.x, B) == (cos(q1)*B.x - sin(q1)*cos(q2)*B.y +
  178. sin(q1)*sin(q2)*B.z)
  179. assert express(N.y, B) == (sin(q1)*B.x + cos(q1)*cos(q2)*B.y -
  180. sin(q2)*cos(q1)*B.z)
  181. assert express(N.z, B) == (sin(q2)*B.y + cos(q2)*B.z)
  182. assert express(N.x, C) == (
  183. (cos(q1)*cos(q3) - sin(q1)*sin(q2)*sin(q3))*C.x -
  184. sin(q1)*cos(q2)*C.y +
  185. (sin(q3)*cos(q1) + sin(q1)*sin(q2)*cos(q3))*C.z)
  186. assert express(N.y, C) == (
  187. (sin(q1)*cos(q3) + sin(q2)*sin(q3)*cos(q1))*C.x +
  188. cos(q1)*cos(q2)*C.y +
  189. (sin(q1)*sin(q3) - sin(q2)*cos(q1)*cos(q3))*C.z)
  190. assert express(N.z, C) == (-sin(q3)*cos(q2)*C.x + sin(q2)*C.y +
  191. cos(q2)*cos(q3)*C.z)
  192. assert express(A.x, N) == (cos(q1)*N.x + sin(q1)*N.y)
  193. assert express(A.y, N) == (-sin(q1)*N.x + cos(q1)*N.y)
  194. assert express(A.z, N) == N.z
  195. assert express(A.x, A) == A.x
  196. assert express(A.y, A) == A.y
  197. assert express(A.z, A) == A.z
  198. assert express(A.x, B) == B.x
  199. assert express(A.y, B) == (cos(q2)*B.y - sin(q2)*B.z)
  200. assert express(A.z, B) == (sin(q2)*B.y + cos(q2)*B.z)
  201. assert express(A.x, C) == (cos(q3)*C.x + sin(q3)*C.z)
  202. assert express(A.y, C) == (sin(q2)*sin(q3)*C.x + cos(q2)*C.y -
  203. sin(q2)*cos(q3)*C.z)
  204. assert express(A.z, C) == (-sin(q3)*cos(q2)*C.x + sin(q2)*C.y +
  205. cos(q2)*cos(q3)*C.z)
  206. assert express(B.x, N) == (cos(q1)*N.x + sin(q1)*N.y)
  207. assert express(B.y, N) == (-sin(q1)*cos(q2)*N.x +
  208. cos(q1)*cos(q2)*N.y + sin(q2)*N.z)
  209. assert express(B.z, N) == (sin(q1)*sin(q2)*N.x -
  210. sin(q2)*cos(q1)*N.y + cos(q2)*N.z)
  211. assert express(B.x, A) == A.x
  212. assert express(B.y, A) == (cos(q2)*A.y + sin(q2)*A.z)
  213. assert express(B.z, A) == (-sin(q2)*A.y + cos(q2)*A.z)
  214. assert express(B.x, B) == B.x
  215. assert express(B.y, B) == B.y
  216. assert express(B.z, B) == B.z
  217. assert express(B.x, C) == (cos(q3)*C.x + sin(q3)*C.z)
  218. assert express(B.y, C) == C.y
  219. assert express(B.z, C) == (-sin(q3)*C.x + cos(q3)*C.z)
  220. assert express(C.x, N) == (
  221. (cos(q1)*cos(q3) - sin(q1)*sin(q2)*sin(q3))*N.x +
  222. (sin(q1)*cos(q3) + sin(q2)*sin(q3)*cos(q1))*N.y -
  223. sin(q3)*cos(q2)*N.z)
  224. assert express(C.y, N) == (
  225. -sin(q1)*cos(q2)*N.x + cos(q1)*cos(q2)*N.y + sin(q2)*N.z)
  226. assert express(C.z, N) == (
  227. (sin(q3)*cos(q1) + sin(q1)*sin(q2)*cos(q3))*N.x +
  228. (sin(q1)*sin(q3) - sin(q2)*cos(q1)*cos(q3))*N.y +
  229. cos(q2)*cos(q3)*N.z)
  230. assert express(C.x, A) == (cos(q3)*A.x + sin(q2)*sin(q3)*A.y -
  231. sin(q3)*cos(q2)*A.z)
  232. assert express(C.y, A) == (cos(q2)*A.y + sin(q2)*A.z)
  233. assert express(C.z, A) == (sin(q3)*A.x - sin(q2)*cos(q3)*A.y +
  234. cos(q2)*cos(q3)*A.z)
  235. assert express(C.x, B) == (cos(q3)*B.x - sin(q3)*B.z)
  236. assert express(C.y, B) == B.y
  237. assert express(C.z, B) == (sin(q3)*B.x + cos(q3)*B.z)
  238. assert express(C.x, C) == C.x
  239. assert express(C.y, C) == C.y
  240. assert express(C.z, C) == C.z == (C.z)
  241. # Check to make sure Vectors get converted back to UnitVectors
  242. assert N.x == express((cos(q1)*A.x - sin(q1)*A.y), N)
  243. assert N.y == express((sin(q1)*A.x + cos(q1)*A.y), N)
  244. assert N.x == express((cos(q1)*B.x - sin(q1)*cos(q2)*B.y +
  245. sin(q1)*sin(q2)*B.z), N)
  246. assert N.y == express((sin(q1)*B.x + cos(q1)*cos(q2)*B.y -
  247. sin(q2)*cos(q1)*B.z), N)
  248. assert N.z == express((sin(q2)*B.y + cos(q2)*B.z), N)
  249. """
  250. These don't really test our code, they instead test the auto simplification
  251. (or lack thereof) of SymPy.
  252. assert N.x == express((
  253. (cos(q1)*cos(q3)-sin(q1)*sin(q2)*sin(q3))*C.x -
  254. sin(q1)*cos(q2)*C.y +
  255. (sin(q3)*cos(q1)+sin(q1)*sin(q2)*cos(q3))*C.z), N)
  256. assert N.y == express((
  257. (sin(q1)*cos(q3) + sin(q2)*sin(q3)*cos(q1))*C.x +
  258. cos(q1)*cos(q2)*C.y +
  259. (sin(q1)*sin(q3) - sin(q2)*cos(q1)*cos(q3))*C.z), N)
  260. assert N.z == express((-sin(q3)*cos(q2)*C.x + sin(q2)*C.y +
  261. cos(q2)*cos(q3)*C.z), N)
  262. """
  263. assert A.x == express((cos(q1)*N.x + sin(q1)*N.y), A)
  264. assert A.y == express((-sin(q1)*N.x + cos(q1)*N.y), A)
  265. assert A.y == express((cos(q2)*B.y - sin(q2)*B.z), A)
  266. assert A.z == express((sin(q2)*B.y + cos(q2)*B.z), A)
  267. assert A.x == express((cos(q3)*C.x + sin(q3)*C.z), A)
  268. # Tripsimp messes up here too.
  269. #print express((sin(q2)*sin(q3)*C.x + cos(q2)*C.y -
  270. # sin(q2)*cos(q3)*C.z), A)
  271. assert A.y == express((sin(q2)*sin(q3)*C.x + cos(q2)*C.y -
  272. sin(q2)*cos(q3)*C.z), A)
  273. assert A.z == express((-sin(q3)*cos(q2)*C.x + sin(q2)*C.y +
  274. cos(q2)*cos(q3)*C.z), A)
  275. assert B.x == express((cos(q1)*N.x + sin(q1)*N.y), B)
  276. assert B.y == express((-sin(q1)*cos(q2)*N.x +
  277. cos(q1)*cos(q2)*N.y + sin(q2)*N.z), B)
  278. assert B.z == express((sin(q1)*sin(q2)*N.x -
  279. sin(q2)*cos(q1)*N.y + cos(q2)*N.z), B)
  280. assert B.y == express((cos(q2)*A.y + sin(q2)*A.z), B)
  281. assert B.z == express((-sin(q2)*A.y + cos(q2)*A.z), B)
  282. assert B.x == express((cos(q3)*C.x + sin(q3)*C.z), B)
  283. assert B.z == express((-sin(q3)*C.x + cos(q3)*C.z), B)
  284. """
  285. assert C.x == express((
  286. (cos(q1)*cos(q3)-sin(q1)*sin(q2)*sin(q3))*N.x +
  287. (sin(q1)*cos(q3)+sin(q2)*sin(q3)*cos(q1))*N.y -
  288. sin(q3)*cos(q2)*N.z), C)
  289. assert C.y == express((
  290. -sin(q1)*cos(q2)*N.x + cos(q1)*cos(q2)*N.y + sin(q2)*N.z), C)
  291. assert C.z == express((
  292. (sin(q3)*cos(q1)+sin(q1)*sin(q2)*cos(q3))*N.x +
  293. (sin(q1)*sin(q3)-sin(q2)*cos(q1)*cos(q3))*N.y +
  294. cos(q2)*cos(q3)*N.z), C)
  295. """
  296. assert C.x == express((cos(q3)*A.x + sin(q2)*sin(q3)*A.y -
  297. sin(q3)*cos(q2)*A.z), C)
  298. assert C.y == express((cos(q2)*A.y + sin(q2)*A.z), C)
  299. assert C.z == express((sin(q3)*A.x - sin(q2)*cos(q3)*A.y +
  300. cos(q2)*cos(q3)*A.z), C)
  301. assert C.x == express((cos(q3)*B.x - sin(q3)*B.z), C)
  302. assert C.z == express((sin(q3)*B.x + cos(q3)*B.z), C)
  303. def test_time_derivative():
  304. #The use of time_derivative for calculations pertaining to scalar
  305. #fields has been tested in test_coordinate_vars in test_essential.py
  306. A = ReferenceFrame('A')
  307. q = dynamicsymbols('q')
  308. qd = dynamicsymbols('q', 1)
  309. B = A.orientnew('B', 'Axis', [q, A.z])
  310. d = A.x | A.x
  311. assert time_derivative(d, B) == (-qd) * (A.y | A.x) + \
  312. (-qd) * (A.x | A.y)
  313. d1 = A.x | B.y
  314. assert time_derivative(d1, A) == - qd*(A.x|B.x)
  315. assert time_derivative(d1, B) == - qd*(A.y|B.y)
  316. d2 = A.x | B.x
  317. assert time_derivative(d2, A) == qd*(A.x|B.y)
  318. assert time_derivative(d2, B) == - qd*(A.y|B.x)
  319. d3 = A.x | B.z
  320. assert time_derivative(d3, A) == 0
  321. assert time_derivative(d3, B) == - qd*(A.y|B.z)
  322. q1, q2, q3, q4 = dynamicsymbols('q1 q2 q3 q4')
  323. q1d, q2d, q3d, q4d = dynamicsymbols('q1 q2 q3 q4', 1)
  324. q1dd, q2dd, q3dd, q4dd = dynamicsymbols('q1 q2 q3 q4', 2)
  325. C = B.orientnew('C', 'Axis', [q4, B.x])
  326. v1 = q1 * A.z
  327. v2 = q2*A.x + q3*B.y
  328. v3 = q1*A.x + q2*A.y + q3*A.z
  329. assert time_derivative(B.x, C) == 0
  330. assert time_derivative(B.y, C) == - q4d*B.z
  331. assert time_derivative(B.z, C) == q4d*B.y
  332. assert time_derivative(v1, B) == q1d*A.z
  333. assert time_derivative(v1, C) == - q1*sin(q)*q4d*A.x + \
  334. q1*cos(q)*q4d*A.y + q1d*A.z
  335. assert time_derivative(v2, A) == q2d*A.x - q3*qd*B.x + q3d*B.y
  336. assert time_derivative(v2, C) == q2d*A.x - q2*qd*A.y + \
  337. q2*sin(q)*q4d*A.z + q3d*B.y - q3*q4d*B.z
  338. assert time_derivative(v3, B) == (q2*qd + q1d)*A.x + \
  339. (-q1*qd + q2d)*A.y + q3d*A.z
  340. assert time_derivative(d, C) == - qd*(A.y|A.x) + \
  341. sin(q)*q4d*(A.z|A.x) - qd*(A.x|A.y) + sin(q)*q4d*(A.x|A.z)
  342. raises(ValueError, lambda: time_derivative(B.x, C, order=0.5))
  343. raises(ValueError, lambda: time_derivative(B.x, C, order=-1))
  344. def test_get_motion_methods():
  345. #Initialization
  346. t = dynamicsymbols._t
  347. s1, s2, s3 = symbols('s1 s2 s3')
  348. S1, S2, S3 = symbols('S1 S2 S3')
  349. S4, S5, S6 = symbols('S4 S5 S6')
  350. t1, t2 = symbols('t1 t2')
  351. a, b, c = dynamicsymbols('a b c')
  352. ad, bd, cd = dynamicsymbols('a b c', 1)
  353. a2d, b2d, c2d = dynamicsymbols('a b c', 2)
  354. v0 = S1*N.x + S2*N.y + S3*N.z
  355. v01 = S4*N.x + S5*N.y + S6*N.z
  356. v1 = s1*N.x + s2*N.y + s3*N.z
  357. v2 = a*N.x + b*N.y + c*N.z
  358. v2d = ad*N.x + bd*N.y + cd*N.z
  359. v2dd = a2d*N.x + b2d*N.y + c2d*N.z
  360. #Test position parameter
  361. assert get_motion_params(frame = N) == (0, 0, 0)
  362. assert get_motion_params(N, position=v1) == (0, 0, v1)
  363. assert get_motion_params(N, position=v2) == (v2dd, v2d, v2)
  364. #Test velocity parameter
  365. assert get_motion_params(N, velocity=v1) == (0, v1, v1 * t)
  366. assert get_motion_params(N, velocity=v1, position=v0, timevalue1=t1) == \
  367. (0, v1, v0 + v1*(t - t1))
  368. answer = get_motion_params(N, velocity=v1, position=v2, timevalue1=t1)
  369. answer_expected = (0, v1, v1*t - v1*t1 + v2.subs(t, t1))
  370. assert answer == answer_expected
  371. answer = get_motion_params(N, velocity=v2, position=v0, timevalue1=t1)
  372. integral_vector = Integral(a, (t, t1, t))*N.x + Integral(b, (t, t1, t))*N.y \
  373. + Integral(c, (t, t1, t))*N.z
  374. answer_expected = (v2d, v2, v0 + integral_vector)
  375. assert answer == answer_expected
  376. #Test acceleration parameter
  377. assert get_motion_params(N, acceleration=v1) == \
  378. (v1, v1 * t, v1 * t**2/2)
  379. assert get_motion_params(N, acceleration=v1, velocity=v0,
  380. position=v2, timevalue1=t1, timevalue2=t2) == \
  381. (v1, (v0 + v1*t - v1*t2),
  382. -v0*t1 + v1*t**2/2 + v1*t2*t1 - \
  383. v1*t1**2/2 + t*(v0 - v1*t2) + \
  384. v2.subs(t, t1))
  385. assert get_motion_params(N, acceleration=v1, velocity=v0,
  386. position=v01, timevalue1=t1, timevalue2=t2) == \
  387. (v1, v0 + v1*t - v1*t2,
  388. -v0*t1 + v01 + v1*t**2/2 + \
  389. v1*t2*t1 - v1*t1**2/2 + \
  390. t*(v0 - v1*t2))
  391. answer = get_motion_params(N, acceleration=a*N.x, velocity=S1*N.x,
  392. position=S2*N.x, timevalue1=t1, timevalue2=t2)
  393. i1 = Integral(a, (t, t2, t))
  394. answer_expected = (a*N.x, (S1 + i1)*N.x, \
  395. (S2 + Integral(S1 + i1, (t, t1, t)))*N.x)
  396. assert answer == answer_expected
  397. def test_kin_eqs():
  398. q0, q1, q2, q3 = dynamicsymbols('q0 q1 q2 q3')
  399. q0d, q1d, q2d, q3d = dynamicsymbols('q0 q1 q2 q3', 1)
  400. u1, u2, u3 = dynamicsymbols('u1 u2 u3')
  401. ke = kinematic_equations([u1,u2,u3], [q1,q2,q3], 'body', 313)
  402. assert ke == kinematic_equations([u1,u2,u3], [q1,q2,q3], 'body', '313')
  403. kds = kinematic_equations([u1, u2, u3], [q0, q1, q2, q3], 'quaternion')
  404. assert kds == [-0.5 * q0 * u1 - 0.5 * q2 * u3 + 0.5 * q3 * u2 + q1d,
  405. -0.5 * q0 * u2 + 0.5 * q1 * u3 - 0.5 * q3 * u1 + q2d,
  406. -0.5 * q0 * u3 - 0.5 * q1 * u2 + 0.5 * q2 * u1 + q3d,
  407. 0.5 * q1 * u1 + 0.5 * q2 * u2 + 0.5 * q3 * u3 + q0d]
  408. raises(ValueError, lambda: kinematic_equations([u1, u2, u3], [q0, q1, q2], 'quaternion'))
  409. raises(ValueError, lambda: kinematic_equations([u1, u2, u3], [q0, q1, q2, q3], 'quaternion', '123'))
  410. raises(ValueError, lambda: kinematic_equations([u1, u2, u3], [q0, q1, q2, q3], 'foo'))
  411. raises(TypeError, lambda: kinematic_equations(u1, [q0, q1, q2, q3], 'quaternion'))
  412. raises(TypeError, lambda: kinematic_equations([u1], [q0, q1, q2, q3], 'quaternion'))
  413. raises(TypeError, lambda: kinematic_equations([u1, u2, u3], q0, 'quaternion'))
  414. raises(ValueError, lambda: kinematic_equations([u1, u2, u3], [q0, q1, q2, q3], 'body'))
  415. raises(ValueError, lambda: kinematic_equations([u1, u2, u3], [q0, q1, q2, q3], 'space'))
  416. raises(ValueError, lambda: kinematic_equations([u1, u2, u3], [q0, q1, q2], 'body', '222'))
  417. assert kinematic_equations([0, 0, 0], [q0, q1, q2], 'space') == [S.Zero, S.Zero, S.Zero]
  418. def test_partial_velocity():
  419. q1, q2, q3, u1, u2, u3 = dynamicsymbols('q1 q2 q3 u1 u2 u3')
  420. u4, u5 = dynamicsymbols('u4, u5')
  421. r = symbols('r')
  422. N = ReferenceFrame('N')
  423. Y = N.orientnew('Y', 'Axis', [q1, N.z])
  424. L = Y.orientnew('L', 'Axis', [q2, Y.x])
  425. R = L.orientnew('R', 'Axis', [q3, L.y])
  426. R.set_ang_vel(N, u1 * L.x + u2 * L.y + u3 * L.z)
  427. C = Point('C')
  428. C.set_vel(N, u4 * L.x + u5 * (Y.z ^ L.x))
  429. Dmc = C.locatenew('Dmc', r * L.z)
  430. Dmc.v2pt_theory(C, N, R)
  431. vel_list = [Dmc.vel(N), C.vel(N), R.ang_vel_in(N)]
  432. u_list = [u1, u2, u3, u4, u5]
  433. assert (partial_velocity(vel_list, u_list, N) ==
  434. [[- r*L.y, r*L.x, 0, L.x, cos(q2)*L.y - sin(q2)*L.z],
  435. [0, 0, 0, L.x, cos(q2)*L.y - sin(q2)*L.z],
  436. [L.x, L.y, L.z, 0, 0]])
  437. # Make sure that partial velocities can be computed regardless if the
  438. # orientation between frames is defined or not.
  439. A = ReferenceFrame('A')
  440. B = ReferenceFrame('B')
  441. v = u4 * A.x + u5 * B.y
  442. assert partial_velocity((v, ), (u4, u5), A) == [[A.x, B.y]]
  443. raises(TypeError, lambda: partial_velocity(Dmc.vel(N), u_list, N))
  444. raises(TypeError, lambda: partial_velocity(vel_list, u1, N))
  445. def test_dynamicsymbols():
  446. #Tests to check the assumptions applied to dynamicsymbols
  447. f1 = dynamicsymbols('f1')
  448. f2 = dynamicsymbols('f2', real=True)
  449. f3 = dynamicsymbols('f3', positive=True)
  450. f4, f5 = dynamicsymbols('f4,f5', commutative=False)
  451. f6 = dynamicsymbols('f6', integer=True)
  452. assert f1.is_real is None
  453. assert f2.is_real
  454. assert f3.is_positive
  455. assert f4*f5 != f5*f4
  456. assert f6.is_integer