%matplotlib inline
import numpy as np
import sympy as sp
import k3d
import matplotlib.pyplot as plt
from IPython.core.display import HTML
from IPython.display import display,Image
from sympy.physics.vector import init_vprinting
init_vprinting(use_latex='mathjax', pretty_print=False)
Utilisation d'un outil de calcul formel et de calcul numérique pour étudier la cinématique et la dynamique des solides, permettant de résoudre complètement le problème.
résolution numérique des équations pour obtenir la solution
ATTENTION ces outils ne sont pas une boite noir pour résoudre automatiquement les problèmes. Il faut comprendre la démarche pour pouvoir les utiliser à bon escient.
Le langage de programmation Python sera utiliser pour manipuler ces outils. Ce n'est pas de la programmation, mais l'utilisation d'instructions Python (à la matlab) pour appeler des fonctions. Il faut cependant connaître un minimum de syntaxe du langage Python.
Python est un langage de programmation très générique et utilisé dans beaucoup de contexte différent.
On utilise un serveur web Jupyter avec des notebooks Ipython, qui permet à l'aide d'un simple navigateur web sur un PC, une tablette ou un smartphone d'utiliser ces bibliothèques pythonà distance.
Le notebook est une interface web riche qui permet d'associer du code, la réponse du code et du texte. Le document que l'on travaille est composé de cellules.
ATTENTION en programmation l'ordre d'exécution des instructions est primordiale. Il faut donc exécuter les cellules dans l'ordre en cliquant sur exécuter du début à la fin du notebook et pas en déplaçant avec la souris dans le notebook.
Utilisation du langage de programmation Python et des notebooks Ipython
Utilisation de bibliothèques python spécialisées en calcul numérique:
k3D : pour la visualisation 3D de trajectoires
import numpy as np
import k3d
import matplotlib.pyplot as plt
et en calcul symbolique:
classical mechanics bibliothèque sympy pour l'étude de la cinématique et dynamique des solides
import sympy as sp
from sympy.physics.mechanics import dynamicsymbols, Point, ReferenceFrame, RigidBody
from sympy.physics.vector import dot
Attention en général quand on utilise une fonction d'une bibliothéque python, on préfixe en général la fonction par le nom (simplifié) de la bibliothéque
np.cos(..)
sp.symbols(..)
sous python, on va utiliser des variables (objets) dont la valeur est un symbole. Lors de la création, on doit définir comment sera affiché le symbole en fournissant la chaîne de caractère qui sera affichée. Par défaut sympy reconnaît les lettres grecques( i.e. 'alpha' sera affiché $\alpha$) et les indices (i.e. 'X_A' sera affiché $X_A$)
définitions des paramètres du problème
fonction sp.symbols() pour définit une variable symbolique
alpha,L = sp.symbols('alpha L')
fonction dynamicsymbols pour définir un degré de liberté (fct de t)
xa, ya = dynamicsymbols('x_a y_a')
définition d'un repère
fonction ReferenceFrame: definit un repère
R1 = ReferenceFrame('R_1')
ensuite on utilise les fonctions (méthodes) associées pour positionner le repère (rotation par rapport à un autre repère) (orient)
R1.orient(R0,'Axis',[psi, R0.z])
définition d'un point
fonction Point: définit un point dans l'espace
A = Point('A')
ensuite on utilise les fonctions (méthodes) associées pour positionner le point par rapport à un autre point: set_pos
pour positionner le point A: on écrit : $\overrightarrow{OA} = r \overrightarrow{R_1.x}$
A.set_pos(O,r*R1.x)
Dans un référentiel fixe $R_0$ d'origine O, on étudie la cinématique (mouvement) d'un solide S définit par un point A et un repère $R_1$ lié à S. On a s'intéresse à la cinématique d'un point P (observateur) dans $R_1$ connaissant la cinématique de A en utilisant la composition des mouvements.
On veut calculer la vitesse en P connaissant la vitesse en A. On distingue 2 cas:
Les fonctions membres (méthodes) v1pt_theory et v2pt_theory de la classe Point font le calcul symbolique
# si P mobile dans R1, calcul V(P)/R0
P.v1pt_theory(A,R0,R1)
# et si P est fixe dans R1
P.v2pt_theory(A,R0,R1)
Les fonctions membres (méthodes) a1pt_theory et a2pt_theory de la classe Point font le calcul symbolique
# si P mobile dans R1
P.a1pt_theory(A,R0,R1)
# et si P et A sont fixes dans R1
P.a2pt_theory(A,R0,R1)
inertia() calcul des matrices d'inertie
IG = inertia(R2,I2,I2,I1)
solide = RigidBody('Solide',G,R3,M,(IG,G))
On utilise ensuite les fonctions membres (méthodes) pour calculer les quantités dynamique:
On veut modéliser un solide en translation dans le plan et en rotation autour de l'axe vertical.
Dans un repère fixe $(O,R_0)$, on étudie le mouvement d'un solide de masse M, de centre de gravité G (de coordonnées $x_g,y_g,0$). On note $R_1$ le référentiel lié au solide dans lequel la matrice d'inertie $I_G$ en G s'écrit: $$ I_G = \left[ \begin{matrix}I_1 & 0 & 0\\ 0 & I_2 & 0\\0 & 0 & I_3 \end{matrix} \right]$$ Le référentiel $R_1$ est obtenu à partir de $R_0$ par une rotation d'angle $\theta$ autour de $R_0.z$.
# bibliothéques utilisées
import sympy as sp
from sympy.physics.mechanics import dynamicsymbols, Point, ReferenceFrame, RigidBody, inertia
# parametres
M, I1, I2, I3, t = sp.symbols('M I_1 I_2 I_3 t')
# degré de liberté (fct de t)
xg, yg, theta = dynamicsymbols('x_g y_g theta')
# repere fixe
O = Point('O')
R0 = ReferenceFrame('R_0')
O.set_vel(R0,0.)
# point et repère lié au solide (rotation /)
G = Point('G')
G.set_pos(O, xg*R0.x + yg*R0.y)
R1 = ReferenceFrame('R_1')
R1.orient(R0,'Axis',[theta,R0.z])
G.set_vel(R1,0)
# momement d'inertie
IG = inertia(R1,I1,I2,I3)
# solide S
S = RigidBody('S',G, R1, M, (IG,G))
En utilisant les calculs précédents, calculez et afficher avec la fonction display()
# entrez vos calculs ici
mais attention indice à partir de 0 (comme en C, on compte à partir de 0)
X = np.array([1,2,3])
Y = np.cos(X)*X*
print("dimension de X : ",X.size)
print("1er element: ",X[0),Y[0])
print("dernier element: ",X[2],Y[2])
plt.plot(X,Y)
lambdify conversion expression symbolique en fonction python
u = A*cos(omega*t+phi)
U = sp.lambdify([t],u.subs([(A,2.0),(omega,2*sp.pi/3.),(phi,sp.pi/2)]))
T = np.linspace(0,3,100)
Y = U(T)
plt.plot(T,Y)
Le solide S correspond à un disque plein de rayon $𝑅=4$, de masse $𝑀=2$.
La matrice d'inertie vaut: $$ 𝐼_𝐺 = 𝑀𝑅^2 \begin{bmatrix} 1/4& 0& 0 \\ 0& 1/4 &0 \\ 0 & 0 &1/2 \end{bmatrix} $$ calculez la valeur de la vitesse pour une trajectoire de G rectiligne et une rotation constante: $$ 𝑥_𝑔(𝑡) = 3𝑡, 𝑦_𝑔(𝑡) = 3𝑡, \theta(𝑡)=2𝑡 $$
Pour cela utiliser la fonction .subs() avec comme argument une liste de substitution: [(nom1,val2),(nom2,val2),..]
# entrez vos calcul ici
En fin d'analyse, il faut écrire une conclusion sur l'étude. Pour cela on entera du texte dans une cellule Markdown en utilisant les règles de formatage suivantes. Pour modifier une cellule de texte, il faut passer en mode édition en double cliquant sur la cellule.
Il est possible de mettre en page (un minimum) le texte dans une cellule Markdown.
Ces règles sont assez sommaires, mais suffisent en général pour ce qu'on veut écrire. Pour une mise en page plus complète, il faudra utiliser des logiciels tiers (Latex, openoffice, etc...)
italique, gras :
On utilise le caractère * pour mettre du texte en :
Saut de ligne, nouveau paragraphe : Pour commencer une nouvelle ligne, il faut ajouter deux espaces à la fin d'une ligne. Pour commencer un nouveau paragraphe, il faut sauter deux lignes.
Titres Pour inclure un titre, il faut utiliser le caractère # en début de ligne. Tout le reste de la ligne sera alors formaté comme un titre (grande police, gras).
Si on utilise plusieurs caractères en début de ligne, le niveau de titre diminue :
- # --> titre principal
- ## --> sous-titre
- ### --> sous-sous-titre
- etc...
mon analyse