test_particle.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from sympy import symbols
  2. from sympy.physics.mechanics import Point, Particle, ReferenceFrame, inertia
  3. from sympy.physics.mechanics.body_base import BodyBase
  4. from sympy.testing.pytest import raises, warns_deprecated_sympy
  5. def test_particle_default():
  6. # Test default
  7. p = Particle('P')
  8. assert p.name == 'P'
  9. assert p.mass == symbols('P_mass')
  10. assert p.masscenter.name == 'P_masscenter'
  11. assert p.potential_energy == 0
  12. assert p.__str__() == 'P'
  13. assert p.__repr__() == ("Particle('P', masscenter=P_masscenter, "
  14. "mass=P_mass)")
  15. raises(AttributeError, lambda: p.frame)
  16. def test_particle():
  17. # Test initializing with parameters
  18. m, m2, v1, v2, v3, r, g, h = symbols('m m2 v1 v2 v3 r g h')
  19. P = Point('P')
  20. P2 = Point('P2')
  21. p = Particle('pa', P, m)
  22. assert isinstance(p, BodyBase)
  23. assert p.mass == m
  24. assert p.point == P
  25. # Test the mass setter
  26. p.mass = m2
  27. assert p.mass == m2
  28. # Test the point setter
  29. p.point = P2
  30. assert p.point == P2
  31. # Test the linear momentum function
  32. N = ReferenceFrame('N')
  33. O = Point('O')
  34. P2.set_pos(O, r * N.y)
  35. P2.set_vel(N, v1 * N.x)
  36. raises(TypeError, lambda: Particle(P, P, m))
  37. raises(TypeError, lambda: Particle('pa', m, m))
  38. assert p.linear_momentum(N) == m2 * v1 * N.x
  39. assert p.angular_momentum(O, N) == -m2 * r * v1 * N.z
  40. P2.set_vel(N, v2 * N.y)
  41. assert p.linear_momentum(N) == m2 * v2 * N.y
  42. assert p.angular_momentum(O, N) == 0
  43. P2.set_vel(N, v3 * N.z)
  44. assert p.linear_momentum(N) == m2 * v3 * N.z
  45. assert p.angular_momentum(O, N) == m2 * r * v3 * N.x
  46. P2.set_vel(N, v1 * N.x + v2 * N.y + v3 * N.z)
  47. assert p.linear_momentum(N) == m2 * (v1 * N.x + v2 * N.y + v3 * N.z)
  48. assert p.angular_momentum(O, N) == m2 * r * (v3 * N.x - v1 * N.z)
  49. p.potential_energy = m * g * h
  50. assert p.potential_energy == m * g * h
  51. # TODO make the result not be system-dependent
  52. assert p.kinetic_energy(
  53. N) in [m2 * (v1 ** 2 + v2 ** 2 + v3 ** 2) / 2,
  54. m2 * v1 ** 2 / 2 + m2 * v2 ** 2 / 2 + m2 * v3 ** 2 / 2]
  55. def test_parallel_axis():
  56. N = ReferenceFrame('N')
  57. m, a, b = symbols('m, a, b')
  58. o = Point('o')
  59. p = o.locatenew('p', a * N.x + b * N.y)
  60. P = Particle('P', o, m)
  61. Ip = P.parallel_axis(p, N)
  62. Ip_expected = inertia(N, m * b ** 2, m * a ** 2, m * (a ** 2 + b ** 2),
  63. ixy=-m * a * b)
  64. assert Ip == Ip_expected
  65. def test_deprecated_set_potential_energy():
  66. m, g, h = symbols('m g h')
  67. P = Point('P')
  68. p = Particle('pa', P, m)
  69. with warns_deprecated_sympy():
  70. p.set_potential_energy(m * g * h)