import numpy as np
import matplotlib.pyplot as plt



# Exemple d'import des données (à remplacer par vos données)
# t = np.array([...])
# sigma = np.array([...])
# sigma0 = ...
# sigma_inf = ...
# C0 = ...


# -------------------------------------------------------------
# PARTIE 1 : Calcul de x(t) et C(t)
# -------------------------------------------------------------


# Avancement réduit : x(t)
x = (sigma - sigma0) / (sigma_inf - sigma0)


# Concentration en ester : C(t)
C = C0 * (1 - x)


# Tracé de C(t)
plt.figure()
plt.plot(t, C)
plt.xlabel("Temps (s)")
plt.ylabel("Concentration en ester C (mol/L)")
plt.title("Évolution de la concentration en ester")
plt.grid()
plt.show()


# -------------------------------------------------------------
# PARTIE 2 : Calcul de la vitesse volumique de réaction
# -------------------------------------------------------------

V = np.gradient(x, t) # dx/dt

# -------------------------------------------------------------
# PARTIE 3 : Régression linéaire sur ln(V) = n ln(C) + ln(k)
# -------------------------------------------------------------

lnC = np.log(C)
lnV = np.log(V)


# Régression linéaire avec polyfit
coeffs = np.polyfit(lnC, lnV, 1)
pente = coeffs[0]
intercept = coeffs[1]


# Calcul de R²
lnV_pred = pente * lnC + intercept
ss_res = np.sum((lnV - lnV_pred)**2)
ss_tot = np.sum((lnV - np.mean(lnV))**2)
R2 = 1 - ss_res/ss_tot

# Résultats
n = pente
k = np.exp(intercept)

print("Ordre global n =", round(n, 3))
print("Constante de vitesse k =", k)
print("Coefficient de détermination R² =", round(R2, 4))

# Tracé de la régression
plt.figure()()
plt.scatter(lnC, lnV)
plt.plot(lnC, pente * lnC + intercept)
plt.xlabel("ln(C)")
plt.ylabel("ln(V)")
plt.title("Régression de ln(V) en fonction de ln(C)")
plt.grid()
plt.show()