图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.1 KiB

  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)