Inscription / Connexion Nouveau Sujet
Niveau exercices
Partager :

Modélisation de mouvement

Posté par
matheux14
10-08-24 à 21:54

Bonsoir, je m'amusais à modéliser le mouvement de ces billes.

D'autres propositions ou remarques ?

Modélisation de mouvement

Soit \mathcal{M} un point (une bille) du cercle à l'instant initial.

Modélisation de mouvement

\mathcal{M} décrit une trajectoire rectiligne (portion de droite) passant par O le centre du cercle.

Soit \phi_{\mathcal{M}} la pente de cette trajectoire et \vec{\ell}_{\mathcal{M}} = \cos(\phi_{\mathcal{M}}) \vec{i} + \sin(\phi_{\mathcal{M}}) \vec j.

Il existe une application f continue de [0 ; +\infty[ \longrightarrow \R telle que :

\blue\forall t \in [0 ; +\infty[, \overrightarrow{O\mathcal{M}}(t) = f(t) \vec{\ell}_{\mathcal{M}}

On considère maintenant \Omega le centre du cercle mobile en l'occurence et R le rayon de ce cercle.

Sans perte de généralité, on prend pour instant initial le moment où \overrightarrow{O\Omega} = R \vec{i}.

Soit \omega la vitesse angulaire de \Omega. Alors

\red \overrightarrow{O\Omega}(t) = R \left(\cos(\omega t) \vec i + \sin(\omega t) \vec j\right)

Des deux équations (en blue et rouge), on a :

\begin{aligned}R^2 &= \left\|\overrightarrow{\Omega(t) M(t)}\right\|^2 \\\
 \\ &= \left\|\overrightarrow{OM}(t) - \overrightarrow{O\Omega(t)}\right\|^2 \\\
 \\ &= \left(f(t) \cos(\phi__{\mathcal{M}} - R \cos(\omega t)\right)^2 + \left(f(t) \sin(\phi_{\mathcal{M}}) - R\sin(\omega t)\right)^2 \\\
 \\ R^2 = R^2 + f(t) \left(f(t) - 2R \cos(\omega t - \phi_{\mathcal{M}})\right)
 \\ \end{aligned}

D'où, par continuité de f, f(t) = 2R \cos(\omega t - \phi_{\mathcal{M}}) \quad \forall t \ge 0.

Finalement on a :

\boxed{\forall t \in [0 ; + \infty[, \overrightarrow{OM}(t) = 2 R \cos(\omega t - \phi_{\mathcal{M}}) \vec{\ell_{\mathcal{M}}}}

Posté par
matheux14
re : Modélisation de mouvement 10-08-24 à 22:00

Une coquille :

Citation :
Des deux équations (en blue et rouge), on a :

\begin{aligned}R^2 &= \left\|\overrightarrow{\Omega(t) M(t)}\right\|^2 \\\
 \\  \\ &= \left\|\overrightarrow{OM}(t) - \overrightarrow{O\Omega(t)}\right\|^2 \\\
 \\  \\ &= \left(f(t) \cos(\phi_{\mathcal{M}})- R \cos(\omega t)\right)^2 + \left(f(t) \sin(\phi_{\mathcal{M}}) - R\sin(\omega t)\right)^2 \\\
 \\  \\ R^2 &= R^2 + f(t) \left(f(t) - 2R \cos(\omega t - \phi_{\mathcal{M}})\right)
 \\  \\ \end{aligned}

Posté par
thetapinch27
re : Modélisation de mouvement 11-08-24 à 06:53

Bonjour,

La trajectoire décrite par une bille s'apparente à une cycloïde qui est ici dégénérée en segment de droite car le rayon du cercle mobile fait la moitié du rayon du cercle externe.

Voir lien :

Pour démontrer cette propriété, une approche naturelle consiste à raisonner sur les vitesses. D'abord la vitesse M dans le référentiel de la roue mobile, et enfin la vitesse de Omega dans le référentiel du cercle fixe, puis d'appliquer le principe de composition des vitesses.
Il y a ensuite une équation supplémentaire car à ce stade tu as  2 inconnues (2 vitesses angulaires) : c'est le fait que le point de contact roue/cercle a une vitesse nulle (non-glissement). Cela permet de trouver une relation entre la vitesse angulaire de M dans le référentiel de la roue, et la vitesse de Omega dans le référentiel du cercle.

Je n'ai pas regardé le détail de ton calcul mais il est surprenant que n'aies pas besoin de la relation de non-glissement. Pour être plus précis : à supposer que ton raisonnement soit correct, cette hypothèse de non-glissement impose des choses entre ton omega et la dérivée de ton Phi_m.

* Modération > lien facilité *

Posté par
carpediem
re : Modélisation de mouvement 11-08-24 à 10:40

salut

il me semble que chaque bille fait simplement un aller retour sur un diamètre.

quand on fixe n'importe quelle bille, c'est du moins ce que je vois.

et l'ensemble des billes fait effectivement penser à un cercle qui tourne (sans frottement !!) à l'intérieur d'un grand cercle.

si on se fixe un point du cercle formé par les billes alors c'est plutôt une hypocycloïde :

voir aussi

Posté par
dpi
re : Modélisation de mouvement 11-08-24 à 17:58

Je trouve le mouvement des billes particulièrement gracieux ,ce qui
n'est pas le cas des formules correspondantes

Posté par
Imod
re : Modélisation de mouvement 11-08-24 à 18:52

Bonjour à tous

Je suis comme souvent ( parfois ? ) d'accord avec Dpi , se lancer dans des calculs sans savoir ce qu'il en est  , c'est bof . On croit voir des choses mais il faut avant tout poser les bases .

1°) Il y a 12 billes qui se promènent sur 24 diamètres régulièrement espacés .

2°) Apparemment chaque bille reste toujours sur le même diamètre dans un mouvement périodique qui est le même pour toutes les billes .

3°)  A chaque instant les 12 billes semblent rester sur un cercle de rayon constant .

Après il y a plein de questions que l'image animée laisse en suspens  ...

Plus simplement si on met 3 billes sur 6 diamètres et que les billes doivent rester sur un cercle de même rayon : on fait comment ?

Imod

Posté par
matheux14
re : Modélisation de mouvement 11-08-24 à 20:52

Salut, merci à vous !

Imod, une petite simulation de ce cas

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# Paramètres
rayon = 1.5  # Rayon du mouvement des billes
nb_points = 3  # Nombre de billes (3 dans ce cas)
velocity = -0.5  # Vitesse angulaire individuelle des billes

rayon_global = 5  # Rayon du cercle sur lequel les diamètres sont répartis
vitesse_angulaire_globale = 0.5  # Vitesse angulaire globale du cercle mobile
temps = np.linspace(0, 20, 500)  # Temps pour l'animation

angles_initiaux = np.linspace(0, 2 * np.pi, 6, endpoint=False)  # 6 diamètres réguliers
angles_billes = angles_initiaux[:nb_points]  # On ne sélectionne que 3 angles pour les billes

# Configuration de la figure
fig, ax = plt.subplots(figsize=(6, 6))
dim_X = -rayon_global - rayon - 1
dim_Y = rayon_global + rayon + 1
ax.set_xlim(dim_X, dim_Y)
ax.set_ylim(dim_X, dim_Y)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_title('Animation')
ax.grid(True)
ax.axis('equal')

# Points et traînées
points, = ax.plot([], [], 'ro', markersize=5)
trace = [ax.plot([], [], 'b-', lw=1)[0] for _ in range(nb_points)]
historique = [[] for _ in range(nb_points)]  # Historique pour les traînées

# Initialisation de l'animation
def init():
    points.set_data([], [])
    for traînée in trace:
        traînée.set_data([], [])
    return points, *trace

# Mise à jour de l'animation à chaque frame
def update(frame):
    angle_global = vitesse_angulaire_globale * temps[frame]
    centre_x = rayon_global * np.cos(angle_global)
    centre_y = rayon_global * np.sin(angle_global)
    
    angles = angles_billes + velocity * temps[frame]
    x = centre_x + rayon * np.cos(angles)
    y = centre_y + rayon * np.sin(angles)
    
    points.set_data(x, y)
    
    for i in range(nb_points):
        historique[i].append((x[i], y[i]))
        traînée_x, traînée_y = zip(*historique[i]) if historique[i] else ([], [])
        trace[i].set_data(traînée_x, traînée_y)
    
    return points, *trace

# Lancement de l'animation
if __name__ == "__main__":
    ani = FuncAnimation(fig, update, frames=len(temps), init_func=init, blit=True, interval=20)
    plt.show()

Posté par
gts2
re : Modélisation de mouvement 12-08-24 à 07:02

Bonjour,

Plutôt (si j'ai bien compris !) :

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# Paramètres
rayon = 5  # Rayon du mouvement des billes
nb_points = 3  # Nombre de billes (3 dans ce cas)

rayon_global = rayon/2  # Rayon du cercle sur lequel les billes sont réparties
vitesse_angulaire = 0.5  # Vitesse angulaire globale du cercle mobile
temps = np.linspace(0, 20, 500)  # Temps pour l'animation

angles_initiaux = np.linspace(0, 2 * np.pi, 6, endpoint=False)  # 6 diamètres réguliers
angles_billes = angles_initiaux[:nb_points]  # On ne sélectionne que 3 angles pour les billes
angles_trace = np.linspace(0, 2 * np.pi, 64, endpoint=False)  # 6 diamètres réguliers

# Configuration de la figure
fig, ax = plt.subplots(figsize=(6, 6))
dim_X = -rayon_global - rayon - 1
dim_Y = rayon_global + rayon + 1
ax.set_xlim(dim_X, dim_Y)
ax.set_ylim(dim_X, dim_Y)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_title('Animation')
ax.grid(True)
ax.axis('equal')

# Points et traînées
points, = ax.plot([], [], 'ro', markersize=5)
trace = [ax.plot([], [], 'b-', lw=1)[0] for _ in range(nb_points)]
cercle, = ax.plot([], [], 'b-')
historique = [[] for _ in range(nb_points)]  # Historique pour les traînées

# Initialisation de l'animation
def init():
    points.set_data([], [])
    cercle.set_data([], [])
    for traînée in trace:
        traînée.set_data([], [])
    return cercle, points, *trace

# Mise à jour de l'animation à chaque frame
def update(frame):
    angle = vitesse_angulaire * temps[frame]
      
    xC = rayon_global * (np.cos(angle) + np.cos(angles_trace))
    yC = rayon_global * (np.sin(angle) + np.sin(angles_trace))
    x = np.cos(angles_billes)*rayon* np.cos(-angle+angles_billes)
    y = np.sin(angles_billes)*rayon* np.cos(-angle+angles_billes)
    
    points.set_data(x, y)
    cercle.set_data(xC, yC)
    
    for i in range(nb_points):
        historique[i].append((x[i], y[i]))
        traînée_x, traînée_y = zip(*historique[i]) if historique[i] else ([], [])
        trace[i].set_data(traînée_x, traînée_y)
    
    return cercle, points, *trace

# Lancement de l'animation
if __name__ == "__main__":
    ani = FuncAnimation(fig, update, frames=len(temps), init_func=init, blit=True, interval=20)
    plt.show()

Posté par
matheux14
re : Modélisation de mouvement 12-08-24 à 08:54

Effectivement, j'ai inversé les deux raisons..

Peu importe, les deux résultats sont amazing !

Merci

Posté par
matheux14
re : Modélisation de mouvement 12-08-24 à 08:55

*Rayons



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !