from IPython.display import SVG SVG(filename='mass_spring_damper.svg') import sympy as sym import sympy.physics.mechanics as me %load_ext sympy.interactive.ipythonprinting x, v = me.dynamicsymbols('x v') m, c, k, g, t = sym.symbols('m c k g t') ceiling = me.ReferenceFrame('C') o = me.Point('o') p = me.Point('p') o.set_vel(ceiling, 0) p.set_pos(o, x * ceiling.x) p.set_vel(ceiling, v * ceiling.x) damping = -c * p.vel(ceiling) stiffness = -k * p.pos_from(o) gravity = m * g * ceiling.x forces = damping + stiffness + gravity forces zero = me.dot(forces - m * p.acc(ceiling), ceiling.x) zero dvdt = sym.solve(zero, v.diff(t))[0] dxdt = v dvdt, dxdt mass = me.Particle('mass', p, m) kane = me.KanesMethod(ceiling, q_ind=[x], u_ind=[v], kd_eqs=[v - x.diff(t)]) kane.kanes_equations([(p, forces)], [mass]) M = kane.mass_matrix_full f = kane.forcing_full M, f M.inv() * f