<jupyter_start><jupyter_text>Diagrama de Especiación en Python En este notebook vamos a ver como podemos calcular la fracción molar de todas las especies generadas en la disociación de un ácido poliprótico a lo largo de la escala de pH  CALCULOS PARA EL DIAGRAMA DE ESPECIACION........................................Estas funciones, dado un conjunto de pkas, calculan las fraccionesmolares de cada especie para cada punto en la escala de pH. Se da como ejemplo particular la especiacion de un ácido dipróticoy luego se extiende a la fórmula general de un ácido poliprótico.Para un ácido poliprótico definido genericamente como $H_NA$, donde N es elnúmero de protones capaces de ser intercambiados, si se conocensus constantes de disociación puede calcularse la fracción molarde cada una de las especies con distinto grado de disociación para cada pH.Llamemos P al polinomio definido como\begin{equation}P = [H^+]^N + k_1[H^+]^{(N-1)} + k_1k_2[H^+]^{(N-2)}\ + ... +\ k_1k_2...k_N[H^+]^{(N-N\ =\ 0)}\end{equation}y Llamamos $T_k$ a cada término del polinomio, de forma tal que\begin{equation}P = T_0 + T_1 + T_2 + ... + T_N\end{equation}Vemos que el polinomio tiene N+1 términos, es decir, hay un término en elpolinomio por cada especie en el equilibrio. Si se trabaja con los balances de masa y las ecuaciones de equilibrio puedellegarse a la siguiente expresión:\begin{equation}X_{H_kA} = \frac{T_{N-k}}{P} \ ;\ donde\ k=0,1,2,...,N\end{equation}<jupyter_code>import numpy as np
import pandas as pd
import plotly.express as px<jupyter_output><empty_output><jupyter_text>FuncionesA continuación definimos las funciones que nos permitirán calcular la fracción molar de cada especie para un dado pH<jupyter_code>def generateColNames(protons):
    colNames = []
    for i in range(0,protons+1):
        if(i == 0):
            colNames.append("A")
        elif(i == 1):
            colNames.append("HA")
        else:
            colNames.append("H"+ str(i) + "A")
    return colNames

def constantFromPka(pka):
    return 10**(-pka)

def poliproticSpeciation(pkas, res=10):
    # Ordeno pkas y obtengo ctes
    pkas = sorted(pkas)
    ks = list(map(constantFromPka, pkas))
    N = len(pkas)
    # Genero los nombres de las especies
    colNames = generateColNames(N)
    
    # Genero una lista de valores de pH entre 0 y 14
    pHvals = np.linspace(0, 14, res)
    data = {"pH": pHvals}
    for name in colNames:
        data[name] = []
    # Genero los coeficientes del polinomio
    # [1, k1, k1*k2,...]
    coefs = [1]
    for k in ks:
        coefs.append(coefs[-1]*k)
        
    # calculo las fracciones molares de cada especie:  
    for pH in pHvals:
        # Obtengo la conc de protones al pH dado
        H = 10**(-pH)
        # Calculo los términos del polinomio para ese pH
        pTerms = []
        for i, coef in enumerate(coefs):
            pTerms.append(coef*(H**(N-i)))
        # Uso la fórmula para calcular la fracción
        # molar de cada especie
        for j, name in enumerate(colNames):
            data[name].append(pTerms[N-j]/sum(pTerms))
    return data, colNames<jupyter_output><empty_output><jupyter_text>CálculosReemplaza los siguientes valores con los del ácido de interés<jupyter_code>pkas = [2,4,6]
res  =1000
data, colNames = poliproticSpeciation(pkas, res)
df = pd.DataFrame(data = data)
df<jupyter_output><empty_output><jupyter_text>Gráfico<jupyter_code>fig = px.line(df, x="pH", y=colNames)

fig.update_layout(
    title="Diagrama de especiación",
    xaxis_title="pH",
    yaxis_title="Fracción molar",
    legend_title="Especies",
)
fig.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11077348066298343, 'fraction_numerical': 0.012154696132596685, 'mean_word_length': 3.4158536585365855, 'pattern_counts': {'":': 1, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '329626', 'license': 'MIT', 'n_tokens_mistral': 1345, 'n_tokens_neox': 1280, 'n_words': 391, 'path': 'python-speciation-chart.ipynb', 'repo_name': 'LeandroHornos/python-speciation-diagram', 'size': '3620'}