{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": true }, "source": [ "# Capacité numérique du mercredi 18/09/24 \n", "# Slip-Stick et vibrations d'une corde de violon" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sauver ce fichier dans votre espace de travail et inscrire votre nom ci-dessous\n", "# Nom :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Slip-Stick : Modélisation d'une corde de violon\n", "\n", "\n", "Le mouvement d'une corde de violon déplacée par un archet fait apparaître une alternance de phase d'adhérence et de glissement (\"stick-slip\") :\n", "\n", "\n", "\n", "\n", "Nous allons étudier une situation expérimentale qui modélise cette situation :\n", "\n", "\n", "\n", "\n", "Le solide S1 est entraîné à une vitesse constante $\\vec{v}_0$ par un moteur. Le solide S2 frotte sur S1 et est retenu à gauche par un dynamomètre qui est ici représenté par un ressort de raideur $k$ et de longueur à vide $l_0$.\n", "\n", "On appelle $f_s$ le coefficient de frottement statique entre les deux solides, et $f_d$ le coefficient de frottement dynamique. La masse de S2 est notée $m$.\n", "\n", "Ce mouvement de stick-slip peut aussi modéliser le crissement d'une craie sur un tableau (ou d'une chaise sur le sol). La hauteur du son émis est alors directement liée à la fréquence du phénomène de stick-slip.\n", "\n", "*L'objectif de ce TP est de comprendre la situation étudiée et de prédire la fréquence du phénomène de stick-slip en fonction des différents paramètres de l'expérience.*\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Modélisation\n", "\n", "**Question 1**\n", "> Dans la modélisation, quel solide (S1 ou S2) joue le rôle de la corde ? de l'archet ? \n", "> Qui joue le rôle du ressort dans la situation réelle ?\n", "> Quelle est la différence entre la situation réelle de la vidéo et la situation modélisée ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 2**\n", "> Représenter sur le schéma les différentes forces s'appliquant sur S2." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 3**\n", "> Lorsque S1 est en situation d'adhérence, que vaut $v= \\frac{dx}{dt}$ ? A quelle condition sur $x$ sort-on de l'adhérence et rentre-t-on en glissement ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 4**\n", "> Lorsque S1 est en situation de glissement, quelle est l'équation différentielle vérifiée par $x$ ? A quelle condition sur $v=\\frac{dx}{dt}$ (que l'on exprimera d'abord sous forme d'une égalité, puis d'une inégalité) va-t-on sortir du glissement ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Résolution numérique\n", "\n", "On s'aperçoit ainsi que selon l'état (adhérence ou glissement) du système, l'équation à résoudre pour déterminer l'évolution de $x(t)$ diffère : comme ces états vont se succéder, il faudra à chaque fois résoudre les équations, en prenant en compte les continuités de $x$ et $\\frac{dx}{dt}$ pour raccorder les solutions. Ce travail, s'il est possible, est toutefois laborieux... et la résolution numérique va nous permettre ici de visualiser rapidement le mouvement du solide $S1$.\n", "\n", "### Conditions initiales\n", "\n", "Dans un premier temps, on va exécuter le code ci-dessous, qui importe les modules Python nécessaires. Les valeurs numériques des différents paramètres du problème sont rentrées dans les unités du système international." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from math import sqrt\n", "\n", "v0=0.01 # en m/s\n", "fs=0.8\n", "fd=0.7\n", "\n", "k=40000 # en N/m\n", "\n", "m=0.1 # en kg liée à la pression exercée \n", "g=9.81 # en m/s2\n", "\n", "\n", "t=[0] # t correspond à la liste des instants de calcul de la position x et de la vitesse xp (pour \"xpoint\")\n", "tf=0.1 # en s, instant final de l'étude\n", "dt=0.00001 # dt est le pas de calcul en s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 5**\n", "> Rappeler le compromis à faire sur le choix de $dt$ pour qu'il soit adapté à la résolution numérique." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On a ensuite besoin d'une variable ```etat``` qui indiquera l'état dans lequel se situe S2 :\n", "- l'état d'adhérence sera caractérisé par ```etat=0```\n", "- l'état de glissement sera caractérisé par ```etat=1```\n", "\n", "Par ailleurs, on va créer deux listes : ```l_x```et ```l_xp``` correspondant aux valeurs de $x$ et $\\frac{dx}{dt}$ évalués aux instants indiqués dans la liste ```t```. On aura donc :\n", "$$\\mbox{l_x[i]}=x\\left(t=t[i]\\right)$$\n", "$$\\mbox{l_xp[i]}=\\frac{dx}{dt}(t=t[i])$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 6**\n", "> Compléter le code suivant pour définir l'état initial, correspondant au solide S1, placé sur le tapis, adhérent, en x=0." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "etat=### \n", "\n", "l_x=[0]\n", "l_xp=#### " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Détermination de l'état du système\n", "\n", "Le problème à résoudre est donc :\n", "\n", "\n", "\n", "Ainsi, à chaque nouvelle estimation de $x$ et $\\frac{dx}{dt}$, il faut vérifier si le système reste dans le même état ou s'il change d'état.\n", "\n", "On définit alors la fonction ```state(x,xp,etat)``` qui retourne la valeur actualisée de ```etat``` à partir de la position ```x``` et de la vitesse ```xp```, nouvellement calculées, de S2.\n", "\n", "**Question 7**\n", "> Compléter le code suivant qui définit la fonction ```state```." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def state(x,xp,etat):\n", " if etat==1 and xp>v0:\n", " return ####\n", " elif ####### and ##### :\n", " return 1\n", " else : #########" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Résolution en cas d'adhérence\n", "\n", "Lorque S2 est en état d'adhérence, il faut résoudre :\n", "$$\\frac{dx}{dt}=v_0$$\n", "\n", "**Question 8**\n", "> Discrétiser cette équation pour donner la relation entre ```l_x[i+1]```, ```l_x[i]``` et les autres paramètres du problème, lors de l'état d'adhérence." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Résolution en cas de glissement\n", "\n", "Lors du glissement de S2, il faut résoudre l'équation d'ordre 2 :\n", "\n", "$$m \\frac{d^2x}{dt^2}=- kx+f_d mg$$\n", "\n", "Pour résoudre ce type d'équation avec la méthode d'Euler, on va se ramener à une équation différentielle d'ordre 1, en posant le vecteur :\n", "$$Y= \\begin{bmatrix} x \\\\ \\dot{x}\\end{bmatrix}$$\n", "\n", "**Question 9**\n", "> Montrer que $Y$ suit une équation différentielle d'ordre 1 de type :\n", "> $$\\dot{Y} = F(Y)$$ \n", "> où $ F : \\mathbb{R}^2 \\rightarrow \\mathbb{R}^2$ est une fonction dont on donnera l'expression $F(u,v)$ et dont l'on complètera la définition dans le code ci-dessous." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def F(u,v):\n", " return ###" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Résolution entière\n", "\n", "**Question 10**\n", "> Compléter le code ci-dessous pour effectuer la résolution du problème et l'affichage de la position et la vitesse au cours du temps. A quoi correspondent les traits horizontaux présents dans les deux tracés ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "l_etat=[etat]\n", "\n", "while t[-1] Exécuter le code et expliquer avec précision ce qu'il fait.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "t_x=np.array(l_x)\n", "n=t_x.size\n", "\n", "spectre=np.fft.fft(t_x) # calcul du spectre\n", "freq=np.fft.fftfreq(n,d=dt) # création de la liste des fréquences où est calculé le spectre.\n", "\n", "plt.close()\n", "plt.figure()\n", "plt.plot(freq[0:int(len(freq)/100)],np.abs(spectre[0:int(len(freq)/100)]))\n", "# on réduit la liste des fréquences pour la visualisation\n", "plt.xlabel(\"Fréquence en Hz\")\n", "plt.ylabel(\"Spectre en Amplitude\")\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "max_spec=np.max(np.abs(spectre[1:int(len(freq)/100)]))\n", "for i in range(1,int(len(freq)/100)):\n", " if np.abs(spectre)[i]==max_spec:\n", " imax=i\n", " \n", "f=freq[imax]\n", "print(\"La fréquence du slip-stick est\",str(f)[0:4],\"Hz\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": false, "title_cell": "", "title_sidebar": "Contents", "toc_cell": true, "toc_position": {}, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 2 }