
# 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)<us*m*g: # et que la loi de Coulomb est respectée
            return 0        # alors cela ne glisse pas

                            # sinon la condition de non glissement non respectée
        if 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()



