non_min_pendulum.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import sympy.physics.mechanics as _me
  2. import sympy as _sm
  3. import math as m
  4. import numpy as _np
  5. q1, q2 = _me.dynamicsymbols('q1 q2')
  6. q1_d, q2_d = _me.dynamicsymbols('q1_ q2_', 1)
  7. q1_dd, q2_dd = _me.dynamicsymbols('q1_ q2_', 2)
  8. l, m, g = _sm.symbols('l m g', real=True)
  9. frame_n = _me.ReferenceFrame('n')
  10. point_pn = _me.Point('pn')
  11. point_pn.set_vel(frame_n, 0)
  12. theta1 = _sm.atan(q2/q1)
  13. frame_a = _me.ReferenceFrame('a')
  14. frame_a.orient(frame_n, 'Axis', [theta1, frame_n.z])
  15. particle_p = _me.Particle('p', _me.Point('p_pt'), _sm.Symbol('m'))
  16. particle_p.point.set_pos(point_pn, q1*frame_n.x+q2*frame_n.y)
  17. particle_p.mass = m
  18. particle_p.point.set_vel(frame_n, (point_pn.pos_from(particle_p.point)).dt(frame_n))
  19. f_v = _me.dot((particle_p.point.vel(frame_n)).express(frame_a), frame_a.x)
  20. force_p = particle_p.mass*(g*frame_n.x)
  21. dependent = _sm.Matrix([[0]])
  22. dependent[0] = f_v
  23. velocity_constraints = [i for i in dependent]
  24. u_q1_d = _me.dynamicsymbols('u_q1_d')
  25. u_q2_d = _me.dynamicsymbols('u_q2_d')
  26. kd_eqs = [q1_d-u_q1_d, q2_d-u_q2_d]
  27. forceList = [(particle_p.point,particle_p.mass*(g*frame_n.x))]
  28. kane = _me.KanesMethod(frame_n, q_ind=[q1,q2], u_ind=[u_q2_d], u_dependent=[u_q1_d], kd_eqs = kd_eqs, velocity_constraints = velocity_constraints)
  29. fr, frstar = kane.kanes_equations([particle_p], forceList)
  30. zero = fr+frstar
  31. f_c = point_pn.pos_from(particle_p.point).magnitude()-l
  32. config = _sm.Matrix([[0]])
  33. config[0] = f_c
  34. zero = zero.row_insert(zero.shape[0], _sm.Matrix([[0]]))
  35. zero[zero.shape[0]-1] = config[0]