import numpy as np ; import matplotlib.pyplot as plt
N=8000 ; e = 0.02 ; L = 0.03 ; w=N*np.pi/30 # paramètres
def acceleration(alpha): # définition de l'accélération
	alpha=alpha*np.pi/180 ; beta=np.arcsin(-e/L*np.sin(alpha)); dep=e*np.cos(alpha)+L*np.cos(beta)
	betaprim=-e*w/L*(np.cos(alpha)/np.cos(beta))
	betasec=(betaprim**2*np.sin(beta)+e/L*w**2*np.sin(alpha))/np.cos(beta)
	depprim=-e*w*np.sin(alpha)-L*betaprim*np.sin(beta)
	depsec=-e*w**2*np.cos(alpha)-L*betasec*np.sin(beta)-L*betaprim**2*np.cos(beta)
	return(depsec) # retourne l'accélération du piston pour une valeur de alpha

# calcul de l'accélération pour une liste de valeurs et tracé
alpha0=0;alpha1=360;pas=0.1;alpha=np.arange(alpha0,alpha1,pas);acc=acceleration(alpha)
plt.plot(alpha, acc) ; plt.title("accélération en m/s² en fonction de alpha (°)")
plt.legend ; plt.grid(True) ; plt.show()

# saisie de l'intervalle de recherche de racine et précision imposée
a=float(input("valeur mini de alpha (°) \n ____: ")); b=float(input("valeur maxi de alpha (°) \n ____: "))
prec=0.01 # précision

# dichotomie, test et avertissement
if acceleration(a)*acceleration(b)< 0:
    for n in range(0,100): # 100 itérations maxi
        m = 0.5*(a+b)
        if acceleration(m)*acceleration(a)>0: # test
            a = m # solution entre m et b
            dd=abs(b-a)
        else:
            b = m # solution entre a et b
            dd=abs(b-a)
        if dd < prec or acceleration(m)==0:
            print("Nbre d’itérations pour atteindre la précision = ",n,"\n la solution est ",round(m,3))
            break
else:
    print('mauvais encadrement')
