pH de soluções de NaOH com base na molaridade
Ao trabalhar com concentrações químicas, a natureza logarítmica da escala de pH frequentemente torna a visualização de dados complicada. Se você plotar o pH contra a Molaridade em uma escala linear padrão, obterá uma curva em forma de “taco de hóquei” que mascara a relação proporcional dos íons.
Neste post, usaremos Python e matplotlib para visualizar o pH do Hidróxido de Sódio (NaOH) de 0 até uma concentração altamente concentrada de 3 Molar, comparando escalas Linear e Logarítmica para ver qual fornece melhor entendimento.
A lógica química
Como o NaOH é uma base forte, ele se dissocia completamente. Para calcular o pH com precisão em uma ampla faixa—especialmente quando excedemos 1,0M—calculamos o pOH primeiro:
$$pOH = -\log_{10}[OH^-]$$$$pH = 14 - pOH$$Curiosamente, em 3M de NaOH, o pOH é negativo ($\approx -0.48$), o que significa que o pH na verdade sobe para 14,48, quebrando a regra comum de “0 a 14” dos livros didáticos.
A implementação em Python
Usamos numpy para gerar nossas faixas de concentração e matplotlib.pyplot com o estilo ggplot para uma aparência limpa e profissional. Note que geramos dois gráficos separados para destacar as diferentes perspectivas.
#!/usr/bin/env python3
# SPDX-License-Identifier: CC0-1.0
import numpy as np
import matplotlib.pyplot as plt
# Define o estilo como ggplot
plt.style.use('ggplot')
def calculate_ph(molarity):
"""Calcula o pH para uma dada molaridade de NaOH incluindo a auto-ionização da água."""
kw = 1e-14
# Solução quadrática para [OH-] para lidar com baixas concentrações com precisão
oh_conc = (molarity + np.sqrt(molarity**2 + 4 * kw)) / 2
poh = -np.log10(oh_conc)
return 14 - poh
# Dados para o Gráfico Linear (0 a 3M)
x_linear = np.linspace(0, 3, 1000)
y_linear = calculate_ph(x_linear)
# Dados para o Gráfico Logarítmico (0,01 a 3M)
# Usar logspace garante um plotagem suave em escala logarítmica
x_log = np.logspace(np.log10(0.01), np.log10(3), 1000)
y_log = calculate_ph(x_log)
# Criar Gráfico em Escala Linear
plt.figure(figsize=(10, 6))
plt.plot(x_linear, y_linear, color='#E24A33', linewidth=2.5, label='pH Value')
plt.title('pH of NaOH Solution (Linear Scale: 0M to 3M)', fontsize=14, fontweight='bold')
plt.xlabel('Molarity of NaOH (mol/L)', fontsize=12)
plt.ylabel('pH', fontsize=12)
plt.ylim(7, 15)
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.tight_layout()
plt.savefig('ph_linear_scale.png', dpi=300)
plt.close()
# Criar Gráfico em Escala Logarítmica
plt.figure(figsize=(10, 6))
plt.plot(x_log, y_log, color='#348ABD', linewidth=2.5, label='pH Value')
plt.xscale('log')
plt.title('pH of NaOH Solution (Log Scale: 0.01M to 3M)', fontsize=14, fontweight='bold')
plt.xlabel('Molarity of NaOH (Logarithmic Scale mol/L)', fontsize=12)
plt.ylabel('pH', fontsize=12)
plt.ylim(11.5, 15) # Faixa focada para a janela de 0,01M-3M
plt.grid(True, which="both", linestyle='--', alpha=0.7)
plt.legend()
plt.tight_layout()
plt.savefig('ph_log_scale.png', dpi=300)
plt.close()
# Para fins do requisito do sistema de fornecer um único nome de arquivo "principal" na tag,
# salvarei também uma versão combinada.
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 12))
# Gráfico Linear
ax1.plot(x_linear, y_linear, color='#E24A33', linewidth=2.5)
ax1.set_title('Linear Scale (0M to 3M)', fontsize=14, fontweight='bold')
ax1.set_ylabel('pH')
ax1.set_ylim(7, 15)
# Gráfico Logarítmico
ax2.plot(x_log, y_log, color='#348ABD', linewidth=2.5)
ax2.set_xscale('log')
ax2.set_title('Logarithmic Scale (0.01M to 3M)', fontsize=14, fontweight='bold')
ax2.set_xlabel('Molarity of NaOH (mol/L)')
ax2.set_ylabel('pH')
ax2.set_ylim(11.5, 15)
plt.tight_layout()
plt.savefig('pH NaOH molarity.svg', dpi=300)