import numpy as np ; import matplotlib.pyplot as plt

# saisie des parametres
N=float(input("vitesse de rotation en tr/mn : "));w=N*np.pi/30
e=float(input("valeur de l'excentrique en mm : "));em=e/1000
L=float(input("longueur de la bielle en mm : "));Lm=L/1000
rapport=str(round(L/e,1)) # pour afficher le rapport à 1 décimale dans le titre
# pour 1 tour avec un pas de calcul de 1°"
t=np.arange(0,120/N,120/N/720) # plage temps pour 2 tour
alpha=np.arange(0,4*np.pi,4*np.pi/720) # plage alpha de 2 pi

beta=np.arcsin(-e/L*np.sin(alpha)) # angle de bielle beta fonction de alpha
dep=e*np.cos(alpha)+L*np.cos(beta) # calcul de X fonction de alpha et beta
betaprim=-em*w/Lm*(np.cos(alpha)/np.cos(beta)) # calcul de dérivée beta fonction de alpha
betasec=(betaprim**2*np.sin(beta)+e/L*w**2*np.sin(alpha))/np.cos(beta) # calcul de beta seconde
depprim=-em*w*np.sin(alpha)-Lm*betaprim*np.sin(beta) # calcul de X' fonction de alpha et beta
depsec=-em*w**2*np.cos(alpha)-Lm*betasec*np.sin(beta)-Lm*betaprim**2*np.cos(beta) # calcul de X"

# affichage des courbes exactes et approchées
plt.subplot(221) # Graphique matrice 2x2 - haut gauche
plt.title("Angle de bielle en ° L/e="+rapport) # titre
plt.plot(t, 180/np.pi*beta,label="exacte") ; plt.xlabel("t (s)") #nom de l'axe
plt.plot(t,-180/np.pi*e/L*np.sin(alpha),label="approchée") # beta=-e/L sin(alpha)
plt.legend() ;plt.grid(True) # affichage labels et grille
plt.subplot(223) # haut droite
plt.title("Position du piston en mm L/e="+rapport) # titre
plt.plot(t, dep,label="exacte"); plt.xlabel("t (s)")
plt.plot(t,L+e*np.cos(alpha),label="approchée") # X=L+e cos(alpha)
plt.legend(); plt.grid(True)
plt.subplot(222) # bas gauche
plt.title("Vitesse piston en m/s") ; plt.plot(t, depprim,label="exacte")
plt.xlabel("t (s)") ; plt.plot(t,-em*w*np.sin(alpha),label="approchée") # X' approché
plt.legend(); plt.grid(True)
plt.subplot(224) # bas droite
plt.title("accélération piston en m/s²")
plt.plot(t, depsec,label="exacte")
plt.xlabel("t (s)") ; plt.plot(t,-em*w**2*np.cos(alpha),label="approchée") # X" approché
plt.legend() ; plt.grid(True) # affichage des légendes et de la grille
plt.tight_layout(); plt.show() # Adaptation de l'Affichage
