test_particle.py 2.1 KB

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