
# FIXE GLISSE - SYSTEME MASSE RESSORT, ENTRAINÉ PAR UN TAPIS ROULANT
# SIMULE UNE CRAIE AVEC LE TABLEAU QUI SE 'DÉROULE' DESSOUS
# -/\/\/\/\[m]
# –––––––––––––––––> tapis roulant...

import numpy as np
import matplotlib.pyplot as plt

t=0
x=0       # allongement intial
v0=0.1    # vitesse avec laquelle le tapis roulant avance
          # c'est aussi celle avec laquelle le tableau
          # se 'déroule" sous la craie...
v=0       # vitesse de glissement initiale (non glissement)
k=64000   # raideur très importante simulant une craie assez rigide
us=0.5    # coef de fr. statique
ud=0.4    # dynamique
m=0.001   # masse assez faible de la partie de la craie qui va osciller
F=20      # force en newton avec laquelle on appuie sur le tableau
g=9.81

duree=5e-3
n=1000
dt=duree/n

# routine qui calcul l'accélération de la masse m
def acceleration():

    if v==0:                 # si non glissement
        if abs(k*x)<us*F:    # si le ressort n'est pas assez allongé ou comprimé
            return 0         # alors on reste en non glissement

        if k*x>0:            # sinon, si ressort étiré vers la droite
            return -k*x/m+ud*F/m # frottement vers la gauche

        return -k*x/m-ud*F/m # sinon vers la droite, on sort du non glissement.

    if v<0:                  # si glissement vers la gauche
        return -k*x/m+ud*F/m # frottement vers la droite
    return -k*x/m-ud*F/m     # sinon vers la gauche

# on initialise les listes
position=[x]
vitesse=[v]
temps=[t]

# méthode d'Euler classique...
for i in range(n):

    x=x+(v+v0)*dt
    v1=v+acceleration()*dt

    if v1*v<0: # si la vitesse change de signe, on l'annule
        v1=0   # on passe en non glissement

    v=v1

    t=t+dt

    position.append(x) # on "enregistre"
    vitesse.append(v)
    temps.append(t)

# calcul après coup de la fréquence du phénomène
# on aurait pu le faire avant, mais cela aloudit la lecture de la routine
# qui calcule l'accélération !
# on recherche les instants où la position passe par un maximum
# on les "enregistre" et on calcule la fréquence sur les N périodes
periode=[]
for i in range(n-2):
    if position[i+1]>position[i] and position[i+1]>position[i+2]:
        periode.append(temps[i+1])

if len(periode)>1: # si on a au moins une période, on calcule f

    f=round((len(periode)-1)/(periode[len(periode)-1]-periode[0]))
    print("fréquence : ",f,"Hz")
else:
    f=0.0

plt.figure(figsize=(10,4))
plt.grid()

# affichage de la position, avec en rouge les phases de non glissement
# en bleu le glissement.

# on balaie les n valeurs de vitesse et on trace un point de la
# bonne couleur sur le graphe en fonction du glissement ou non
for i in range(n):

    if vitesse[i]==0:
        color='black'
    else:
        color='orange'

    plt.scatter(temps[i]*1000,position[i]*1000,c=color)

titre="Fixe-glisse - fréquence :"+str(f)+" Hz"
plt.title(titre)
plt.xlabel("temps en ms")
plt.ylabel("position en mm")

plt.show()




