# OSCILLATEUR MASSE-RESSORT, SOUMIS À DES FROTTEMENTS SOLIDES import matplotlib.pyplot as plt # paramètres et conditions initiales, changer la masse par exemple... t=0 x=0.1 v=0 k=100 us=0.5 ud=0.4 m=0.2 g=9.81 dt=0.001 # fonction qui retourne l'accélération en tenant compte du glissement ou non def acceleration(): if v==0: # si vitesse (de glissement) nulle if abs(k*x)0: # si le ressort est étiré return -k*x/m+g*ud # frottements vers la droite on sort du non glis. return -k*x/m-g*ud # sinon vers la gauche, on sort aussi du non glis. if v<0: # si glissement vers la gauche return -k*x/m+g*ud # frottements vers la droite return -k*x/m-g*ud # sinon vers la gauche # pour une fois on travaille avec des listes car on ne sait pas quand cela va # finir, cela évite de postuler une durée, on arrête avec un while si cela ne # glisse plus et que le système est à l'équilibre. position=[x] vitesse=[v] temps=[t] # tant que while v+acceleration()!=0: # vitesse non nulle ou accélération non nulle # (on pourrait mettre v!=0 or acceleration()!=0) # on calcule... sinon, on sort : le système ne # bougera plus. x=x+v*dt # "Euler" classique v1=v+acceleration()*dt # on note v1 la nouvelle vitesse pour la comparer # à l'ancienne. if v1*v<0: # attention, il est quasi impossible que la vitesse # "passe" pile à 0. On détecte son annulation v1=0 # par un changement de signe # si la nouvelle vitesse à t+dt (v1) est de signe v=v1 # contraire à celle à t (v), alors on annule la v1 ! t=t+dt position.append(x) # on "enregistre" dans les listes vitesse.append(v) temps.append(t) # on trace... plt.figure(figsize=(10,4)) plt.plot(temps,position) plt.title("Evolution de la position") plt.xlabel("temps en s") plt.ylabel("position en m") plt.grid() plt.show()