import numpy as np
import scipy.special as sc
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider



##Détermination simple avancement

def polynome(a,b,c):
    Delta = float(b**2-4*a*c)
    if Delta<0:
        print('le polynôme n’a pas de racines réelles')
    elif Delta>=0:
        if Delta==0:
            T=-b/(2*a)
            return(T)
        if Delta>0:
            T1=(-b-np.sqrt(Delta))/(2*a)
            T2=(-b+np.sqrt(Delta))/(2*a)
            return[T1,T2]



pKa = 1.8 #pKa de l'acide
C = 1e-2 #concentration de l'acide

print(polynome(C,10**(-pKa),-10**(-pKa))[1]) #renvoie le taux d'avancement

#
# #Partie graphique
#
#
# concentrations = np.linspace(0.00001,0.1,1000)
# avancements=[]
# for i in range(len(concentrations)):
#     avancements = avancements + [polynome(concentrations[i],10**(-pKa),-10**(-pKa))[1]]
#     i=i+1
#
#
# plt.tick_params(labelsize=10)
#
#
#
# plt.xlabel('Concentration en acide, en mol/L' ,fontsize=10)
# plt.ylabel('''Taux d'avancement''',fontsize=10)
#
# plt.title('''Avancement en fonction de la concentration en acide''',fontsize=10)
#
#
# plt.tick_params(labelsize=10)
#
# plt.plot(concentrations,avancements)
#
# plt.show()



# ##Partie graphique avec glider
#
#



N=3024 # nombre initial de sites (la valeur est peu importante, mais la variable doit exister)
parametre_initial=1

## Fonctions

X=np.linspace(0.001,1,N)

def f(x,parametre):
    avancements=[]
    for i in range(len(X)):
        avancements = avancements + [polynome(x[i],10**(-parametre),-10**(-parametre))[1]]
        i=i+1
#
    return(avancements)

## Plot

fig, ax = plt.subplots() # on cree la figure
plt.subplots_adjust(bottom=0.25) # on fait de la place pour le slider

l,=plt.plot(X,f(X,parametre_initial)) # on plot la fonction
plt.xlim(-0.1,1.1)
plt.ylim(-0.1,1.1)
plt.xlabel('''Concentration de l'acide en mol/L''')
plt.ylabel('''Taux d'avancement''')
axparametre = plt.axes([0.15, 0.1, 0.65, 0.03]) # on cree l'emplacement de l'objet slider sur le graphe + parametres geometriques
sd = Slider(axparametre, 'pKa', -2, 7, valinit=parametre_initial, valstep=0.05) # on cree le slider

def update(val): # on update le plot en fonction de la valeur du slider
    parametre = sd.val
    l.set_ydata(f(X,parametre))

sd.on_changed(update) # on affiche le plot qu'on a update

plt.show()


#
#






