Il semble que sympy, une bibliothèque de traitement de formules mathématiques de python, puisse gérer les équations de mouvement qui apparaissent en physique, alors j'aimerais l'essayer. Cette fois, j'écrirai un script pour dériver l'équation de mouvement du système masse-ressort-amortisseur, qui se trouve également dans pydy_example sur le site de référence. Tout d'abord, supposons que vous ayez un système d'amortisseur à ressort de masse comme indiqué sur la figure. Si vous formulez une équation de mouvement normal, ce sera comme suit. Équation du mouvement
{\bf M}\dot{{\bf x}} = {\bf f}({\bf x})
ici
{\bf x} = [{\it x}, \dot{{\it x}}]^T \\
{\bf M} = \begin{bmatrix} 1 & 0 \\ 0 & m \end{bmatrix} \\
{\bf f}({\bf x}) = \begin{bmatrix} \dot{x} \\ -k x - c \dot{x} + m g + f \end{bmatrix}
Supposer que Vient ensuite le script. Nous utilisons un module appelé sympy.physics.mechanics. J'utilise la méthode de Kane pour formuler une équation cinétique, mais je n'en suis pas sûr. Il semble y avoir un moyen de le résoudre avec la méthode de Lagrange.
mass_spring_dumper.py
#!/usr/bin/python
#coding:utf-8
import sympy as sym
import sympy.physics.mechanics as me
x, v = me.dynamicsymbols('x v')
m, c, k, g, t, f = sym.symbols('m c k g t f')
#Créer un système de coordonnées
ceiling = me.ReferenceFrame('C')
o = me.Point('o') #Point plafond
p = me.Point('p') #Point qualité
o.set_vel(ceiling, 0)
p.set_pos(o, x * ceiling.x)
p.set_vel(ceiling, v * ceiling.x)
#Calculer la force externe appliquée au point de qualité
damping = -c * p.vel(ceiling) #Amortissement
stiffness = -k * p.pos_from(o) #Printemps
gravity = m * g * ceiling.x #la gravité
exf = f * ceiling.x #Autres forces externes
forces = damping + stiffness + gravity + exf
print forces
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
print M
print f
print M.inv() * f
La sortie ressemble à ceci:
(-c*v + f + g*m - k*x)*C.x
Matrix([[1, 0], [0, m]])
Matrix([[v(t)], [-c*v(t) + f + g*m - k*x(t)]])
Matrix([[v(t)], [(-c*v(t) + f + g*m - k*x(t))/m]])
Si vous étudiez comment l'utiliser, ce sera un outil très puissant. Il existe de l'érable et de la mathématique payants qui peuvent formuler des formules pour les systèmes mécaniques, mais comme les deux sont chers, je suis reconnaissant qu'un tel logiciel puisse être utilisé gratuitement.
documentation sympy http://docs.sympy.org/latest/index.html pydy examples https://github.com/PythonDynamics/pydy_examples
Recommended Posts