test_models.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import sympy.physics.mechanics.models as models
  2. from sympy.core.backend import (cos, sin, Matrix, symbols, zeros)
  3. from sympy.simplify.simplify import simplify
  4. from sympy.physics.mechanics import (dynamicsymbols)
  5. def test_multi_mass_spring_damper_inputs():
  6. c0, k0, m0 = symbols("c0 k0 m0")
  7. g = symbols("g")
  8. v0, x0, f0 = dynamicsymbols("v0 x0 f0")
  9. kane1 = models.multi_mass_spring_damper(1)
  10. massmatrix1 = Matrix([[m0]])
  11. forcing1 = Matrix([[-c0*v0 - k0*x0]])
  12. assert simplify(massmatrix1 - kane1.mass_matrix) == Matrix([0])
  13. assert simplify(forcing1 - kane1.forcing) == Matrix([0])
  14. kane2 = models.multi_mass_spring_damper(1, True)
  15. massmatrix2 = Matrix([[m0]])
  16. forcing2 = Matrix([[-c0*v0 + g*m0 - k0*x0]])
  17. assert simplify(massmatrix2 - kane2.mass_matrix) == Matrix([0])
  18. assert simplify(forcing2 - kane2.forcing) == Matrix([0])
  19. kane3 = models.multi_mass_spring_damper(1, True, True)
  20. massmatrix3 = Matrix([[m0]])
  21. forcing3 = Matrix([[-c0*v0 + g*m0 - k0*x0 + f0]])
  22. assert simplify(massmatrix3 - kane3.mass_matrix) == Matrix([0])
  23. assert simplify(forcing3 - kane3.forcing) == Matrix([0])
  24. kane4 = models.multi_mass_spring_damper(1, False, True)
  25. massmatrix4 = Matrix([[m0]])
  26. forcing4 = Matrix([[-c0*v0 - k0*x0 + f0]])
  27. assert simplify(massmatrix4 - kane4.mass_matrix) == Matrix([0])
  28. assert simplify(forcing4 - kane4.forcing) == Matrix([0])
  29. def test_multi_mass_spring_damper_higher_order():
  30. c0, k0, m0 = symbols("c0 k0 m0")
  31. c1, k1, m1 = symbols("c1 k1 m1")
  32. c2, k2, m2 = symbols("c2 k2 m2")
  33. v0, x0 = dynamicsymbols("v0 x0")
  34. v1, x1 = dynamicsymbols("v1 x1")
  35. v2, x2 = dynamicsymbols("v2 x2")
  36. kane1 = models.multi_mass_spring_damper(3)
  37. massmatrix1 = Matrix([[m0 + m1 + m2, m1 + m2, m2],
  38. [m1 + m2, m1 + m2, m2],
  39. [m2, m2, m2]])
  40. forcing1 = Matrix([[-c0*v0 - k0*x0],
  41. [-c1*v1 - k1*x1],
  42. [-c2*v2 - k2*x2]])
  43. assert simplify(massmatrix1 - kane1.mass_matrix) == zeros(3)
  44. assert simplify(forcing1 - kane1.forcing) == Matrix([0, 0, 0])
  45. def test_n_link_pendulum_on_cart_inputs():
  46. l0, m0 = symbols("l0 m0")
  47. m1 = symbols("m1")
  48. g = symbols("g")
  49. q0, q1, F, T1 = dynamicsymbols("q0 q1 F T1")
  50. u0, u1 = dynamicsymbols("u0 u1")
  51. kane1 = models.n_link_pendulum_on_cart(1)
  52. massmatrix1 = Matrix([[m0 + m1, -l0*m1*cos(q1)],
  53. [-l0*m1*cos(q1), l0**2*m1]])
  54. forcing1 = Matrix([[-l0*m1*u1**2*sin(q1) + F], [g*l0*m1*sin(q1)]])
  55. assert simplify(massmatrix1 - kane1.mass_matrix) == zeros(2)
  56. assert simplify(forcing1 - kane1.forcing) == Matrix([0, 0])
  57. kane2 = models.n_link_pendulum_on_cart(1, False)
  58. massmatrix2 = Matrix([[m0 + m1, -l0*m1*cos(q1)],
  59. [-l0*m1*cos(q1), l0**2*m1]])
  60. forcing2 = Matrix([[-l0*m1*u1**2*sin(q1)], [g*l0*m1*sin(q1)]])
  61. assert simplify(massmatrix2 - kane2.mass_matrix) == zeros(2)
  62. assert simplify(forcing2 - kane2.forcing) == Matrix([0, 0])
  63. kane3 = models.n_link_pendulum_on_cart(1, False, True)
  64. massmatrix3 = Matrix([[m0 + m1, -l0*m1*cos(q1)],
  65. [-l0*m1*cos(q1), l0**2*m1]])
  66. forcing3 = Matrix([[-l0*m1*u1**2*sin(q1)], [g*l0*m1*sin(q1) + T1]])
  67. assert simplify(massmatrix3 - kane3.mass_matrix) == zeros(2)
  68. assert simplify(forcing3 - kane3.forcing) == Matrix([0, 0])
  69. kane4 = models.n_link_pendulum_on_cart(1, True, False)
  70. massmatrix4 = Matrix([[m0 + m1, -l0*m1*cos(q1)],
  71. [-l0*m1*cos(q1), l0**2*m1]])
  72. forcing4 = Matrix([[-l0*m1*u1**2*sin(q1) + F], [g*l0*m1*sin(q1)]])
  73. assert simplify(massmatrix4 - kane4.mass_matrix) == zeros(2)
  74. assert simplify(forcing4 - kane4.forcing) == Matrix([0, 0])
  75. def test_n_link_pendulum_on_cart_higher_order():
  76. l0, m0 = symbols("l0 m0")
  77. l1, m1 = symbols("l1 m1")
  78. m2 = symbols("m2")
  79. g = symbols("g")
  80. q0, q1, q2 = dynamicsymbols("q0 q1 q2")
  81. u0, u1, u2 = dynamicsymbols("u0 u1 u2")
  82. F, T1 = dynamicsymbols("F T1")
  83. kane1 = models.n_link_pendulum_on_cart(2)
  84. massmatrix1 = Matrix([[m0 + m1 + m2, -l0*m1*cos(q1) - l0*m2*cos(q1),
  85. -l1*m2*cos(q2)],
  86. [-l0*m1*cos(q1) - l0*m2*cos(q1), l0**2*m1 + l0**2*m2,
  87. l0*l1*m2*(sin(q1)*sin(q2) + cos(q1)*cos(q2))],
  88. [-l1*m2*cos(q2),
  89. l0*l1*m2*(sin(q1)*sin(q2) + cos(q1)*cos(q2)),
  90. l1**2*m2]])
  91. forcing1 = Matrix([[-l0*m1*u1**2*sin(q1) - l0*m2*u1**2*sin(q1) -
  92. l1*m2*u2**2*sin(q2) + F],
  93. [g*l0*m1*sin(q1) + g*l0*m2*sin(q1) -
  94. l0*l1*m2*(sin(q1)*cos(q2) - sin(q2)*cos(q1))*u2**2],
  95. [g*l1*m2*sin(q2) - l0*l1*m2*(-sin(q1)*cos(q2) +
  96. sin(q2)*cos(q1))*u1**2]])
  97. assert simplify(massmatrix1 - kane1.mass_matrix) == zeros(3)
  98. assert simplify(forcing1 - kane1.forcing) == Matrix([0, 0, 0])