test_inertia.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from sympy import symbols
  2. from sympy.testing.pytest import raises
  3. from sympy.physics.mechanics import (inertia, inertia_of_point_mass,
  4. Inertia, ReferenceFrame, Point)
  5. def test_inertia_dyadic():
  6. N = ReferenceFrame('N')
  7. ixx, iyy, izz = symbols('ixx iyy izz')
  8. ixy, iyz, izx = symbols('ixy iyz izx')
  9. assert inertia(N, ixx, iyy, izz) == (ixx * (N.x | N.x) + iyy *
  10. (N.y | N.y) + izz * (N.z | N.z))
  11. assert inertia(N, 0, 0, 0) == 0 * (N.x | N.x)
  12. raises(TypeError, lambda: inertia(0, 0, 0, 0))
  13. assert inertia(N, ixx, iyy, izz, ixy, iyz, izx) == (ixx * (N.x | N.x) +
  14. ixy * (N.x | N.y) + izx * (N.x | N.z) + ixy * (N.y | N.x) + iyy *
  15. (N.y | N.y) + iyz * (N.y | N.z) + izx * (N.z | N.x) + iyz * (N.z |
  16. N.y) + izz * (N.z | N.z))
  17. def test_inertia_of_point_mass():
  18. r, s, t, m = symbols('r s t m')
  19. N = ReferenceFrame('N')
  20. px = r * N.x
  21. I = inertia_of_point_mass(m, px, N)
  22. assert I == m * r**2 * (N.y | N.y) + m * r**2 * (N.z | N.z)
  23. py = s * N.y
  24. I = inertia_of_point_mass(m, py, N)
  25. assert I == m * s**2 * (N.x | N.x) + m * s**2 * (N.z | N.z)
  26. pz = t * N.z
  27. I = inertia_of_point_mass(m, pz, N)
  28. assert I == m * t**2 * (N.x | N.x) + m * t**2 * (N.y | N.y)
  29. p = px + py + pz
  30. I = inertia_of_point_mass(m, p, N)
  31. assert I == (m * (s**2 + t**2) * (N.x | N.x) -
  32. m * r * s * (N.x | N.y) -
  33. m * r * t * (N.x | N.z) -
  34. m * r * s * (N.y | N.x) +
  35. m * (r**2 + t**2) * (N.y | N.y) -
  36. m * s * t * (N.y | N.z) -
  37. m * r * t * (N.z | N.x) -
  38. m * s * t * (N.z | N.y) +
  39. m * (r**2 + s**2) * (N.z | N.z))
  40. def test_inertia_object():
  41. N = ReferenceFrame('N')
  42. O = Point('O')
  43. ixx, iyy, izz = symbols('ixx iyy izz')
  44. I_dyadic = ixx * (N.x | N.x) + iyy * (N.y | N.y) + izz * (N.z | N.z)
  45. I = Inertia(inertia(N, ixx, iyy, izz), O)
  46. assert isinstance(I, tuple)
  47. assert I.__repr__() == ('Inertia(dyadic=ixx*(N.x|N.x) + iyy*(N.y|N.y) + '
  48. 'izz*(N.z|N.z), point=O)')
  49. assert I.dyadic == I_dyadic
  50. assert I.point == O
  51. assert I[0] == I_dyadic
  52. assert I[1] == O
  53. assert I == (I_dyadic, O) # Test tuple equal
  54. raises(TypeError, lambda: I != (O, I_dyadic)) # Incorrect tuple order
  55. assert I == Inertia(O, I_dyadic) # Parse changed argument order
  56. assert I == Inertia.from_inertia_scalars(O, N, ixx, iyy, izz)
  57. # Test invalid tuple operations
  58. raises(TypeError, lambda: I + (1, 2))
  59. raises(TypeError, lambda: (1, 2) + I)
  60. raises(TypeError, lambda: I * 2)
  61. raises(TypeError, lambda: 2 * I)