# -*- coding: utf-8 -*-
# Created on Tue Nov 16 06:35:00 2021
# @author: mhebding

""" Déterminer l'état final d'un système chimique à l'équilibre """

## Position du problème ##

# Equation de réaction
'A + B -> C + D' # en général B sera H2O le solvant, dont l'activité vaut 1
# Tableau d'avancement à l'équilibre
'C0-x / 1 // x / x'
# Condition d'équilibre
'x**2/(C0-x) = K'
# Polynome en x
'x**2+K*x-K*C0=0'

## Résolution ##

K = 10**-4.8
C0 = 0.01

def delta(K,C0):
    return K**2+4*K*C0

def racine(K,C0):
    assert delta(K,C0) >= 0
    x1 = 0.5*(-K+delta(K,C0)**0.5)
    x2 = 0.5*(-K-delta(K,C0)**0.5)
    if x1<0:
        solution = x2
    elif x1>C0:
        solution = x2
    else:
        solution = x1
    return round(solution,3)

def etat_final(K,C0):
    x = racine(K,C0)
    liste_concentrations_finales = []
    liste_concentrations_finales.append(round(C0-x,3))
    liste_concentrations_finales.append(1)
    liste_concentrations_finales.append(x)
    liste_concentrations_finales.append(x)
    return liste_concentrations_finales



## Pour aller plus loin ##

import matplotlib.pyplot as plt

def K(): # Influence de la valeur de la constante d'équilibre K sur xeq
    C0 = 0.1
    liste_x = []
    liste_alpha = []
    liste_K = [10**-4*i for i in range(1,100000,10)]
    for K in liste_K:
        x = racine(K,C0)
        liste_x.append(x)
        alpha = x/C0
        liste_alpha.append(alpha)
    plt.figure()
    plt.plot(liste_K, liste_x, label='xeq')
    plt.plot(liste_K, liste_alpha, label='alpha')
    plt.title ("Influence de K (C0 = 0.1)")
    plt.legend()
    #plt.text(10,0.05,'Si K augmente :\n • xf ---> C0 = 0.1\n • donc transformation totale\n • déjà le cas vers K = 10\n • K>10**4 semble suffisant')
    plt.show()

def C0_xeq(): # Influence de la valeur de la concentration initiale C0 sur xeq
    K=1
    liste_x = []
    liste_C0 = [10**-3*i for i in range(1,1000)]
    for C0 in liste_C0:
        x = racine(K,C0)
        liste_x.append(x)
    plt.figure()
    plt.plot(liste_C0, liste_x)
    plt.title ("Influence de C0 (K = 1)")
    plt.xlabel("C0")
    plt.ylabel("xf")
#    plt.text(0.5,0.1,'Si C0 augmente :\n • xf augmente\n • équilibre déplacé vers la droite')
    plt.show()

def C0_alpha(): # Influence de la valeur de la concentration initiale C0 sur alpha
    K=1
    liste_alpha = []
    liste_C0 = [10**-3*i for i in range(1,1000)]
    for C0 in liste_C0:
        x = racine(K,C0)
        alpha = x/C0
        liste_alpha.append(alpha)
    plt.figure()
    plt.plot(liste_C0, liste_alpha)
    plt.title ("Influence de C0 (K = 1)")
    plt.xlabel("C0")
    plt.ylabel("alpha")
#    plt.text(0.4,0.9,'Si C0 augmente :\n• alpha diminue\n• le rendement augmente en diluant')
    plt.show()

C0_xeq()
C0_alpha()