Será que é possível estudar para o vestibular e ainda aprender Python? Sim, claro!
Neste artigo, analisaremos uma questão da prova de 2020. É uma questão de química, mas que pode ser resolvida mais com raciocínio do que com química em si.
Tópicos
O enunciado
Abaixo o enunciado da questão, retirado da prova amarela regular aplicada em 2020:
A sacarase (ou invertase) é uma enzima que atua no intestino humano hidrolisando o dissacarídeo sacarose nos monossacarídeos glicose e frutose. Em um estudo cinético da reação de hidrólise da sacarose (C12H22O11), foram dissolvidos 171 g de sacarose em 500 mL de água. Observou-se que, a cada 100 minutos de reação, a concentração de sacarose foi reduzida à metade, qualquer que fosse o momento escolhido como tempo inicial. As massas molares dos elementos H, C e O são iguais a 1, 12 e 16 g.mol−1, respectivamente. Qual é a concentração de sacarose depois de 400 minutos do início da reação de hidrólise?
As opções são:
A. 2,50 × 10−3 mol.L−1
B. 6,25 × 10−2 mol.L−1
C. 1,25 × 10−1 mol.L−1
D. 2,50 × 10−1 mol.L−1
E. 4,27 × 10−1 mol.L−1
Vamos reconhecer algumas coisas na questão. Primeiro, o padrão ENEM de ter uma história com informações que não são necessárias para resolução da questão. Neste artigo, vou considerar que o leitor tem nível de ensino médio, seja como um aluno, ou um interessado em ciências mas sem formação avançada na área, ou mesmo um professor voltado para ensino médio. Logo, o início da questão pode parecer um tanto desafiador. Afinal, que diabos é hidrólise, dissacarídeo, monossacarídeo…? Não necessariamente o aluno vai estar acostumado com essas palavras.
Três passos para entender questões
O primeiro passo, então, é reconhecer conceitos fundamentais que vão permitir focar no cerne da questão em si. Assim, reconhecemos que é uma questão de cinética (“… estudo cinético…”). Nesse momento, algumas palavras-chave devem vir à mente:
- ordem de reação (primeira, segunda, zero…);
- lei de velocidade;
- catalisador;
- tempo de meia-vida.
Boa parte das questões de cinética de nível médio focam nessas palavras-chave então, se você é estudante e vai fazer ENEM, em cinética é o que precisa saber.
Assim, o segundo passo é verificar qual a palavra-chave que se conecta com a questão. Observe o trecho “…a cada 100 minutos de reação, a concentração de sacarose foi reduzida à metade…”. Ora, basicamente o que está sendo dito é que o tempo de meia-vida da reação é de 100 minutos. Usando o artigo da Wikipedia sobre meia-vida como referência, temos a seguinte explicação para o termo: se a quantidade que decai possui um valor no início do processo, na meia-vida a quantidade terá metade deste valor.
Já sabemos que é uma questão de cinética, mais especificamente sobre meia-vida. O último passo antes de partir para resolução é observar o sistema de unidades da questão e o que foi fornecido. Negligenciar esta etapa é fonte significativa de erros. Veja que a pergunta é sobre concentração e as opções estão em mol.L-1. No entanto, não foi dada a concentração inicial e, sim, a massa inicial. Logo, haverá uma conta para achar a concentração inicial, que envolverá o volume. O volume fornecido está em mL mas as opções estão em litro. Logo, haverá uma conversão de unidades.
Pronto, já sabemos tudo que precisamos e agora é só fazer as contas. Observe que, após reconhecer o contexto e o tópico da questão, todo o resto tem papel apenas figurativo. Raramente, no ENEM, o aluno efetivamente precisa entender o cenário que foi apresentado e toda a “enrolação”. Capturando as palavras-chave, a questão usualmente se torna substituir valores em equações simples ou desenvolver raciocínios simples.
Vamos pro Python!
Resolvendo a questão
Comecemos importando as bibliotecas que usaremos. O papel de cada uma será explicado durante o artigo:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as plticker
from molmass import Formula
Observe que, ao final do enunciado, foram fornecidas as massas molares dos elementos constituintes da sacarose. O objetivo é permitir que o aluno possa calcular a massa molar da sacarose, necessária para calcular a concentração inicial da solução. Tal cálculo é bem simples, basta multiplicar cada massa molar de elemento pela quantidade de vezes que aparece na fórmula e somar os valores obtidos. Mas…
Pense. Você está com um computador dezenas de ordens de grandeza mais potente que sua calculadora de bolso. Milhões de químicos malucos no mundo todo fazem contas de massa molar o tempo todo. Certamente algum já se deu o trabalho de facilitar sua rotina criando algum pacote que torne mais rápida tal conta. Para isso, existe o molmass
. Veja como é simples: passamos uma string com a fórmula do composto para a classe Formula
do molmass
e solicitados o atributo mass
:
formula = Formula('C12H22O11')
formula.mass # g/mol
342.297037
Temos como vantagem o fato de o pacote utilizar massas molares para os elementos sem qualquer arredondamento, evitando propagação de erros por arredondamentos intermediários.
Veja que coloquei na forma de comentário a unidade. É uma boa prática deixar explícito o sistema de unidades do código. Já escrevi aqui no site sobre o pacote pint
que permite trabalhar com unidades no próprio código, fazendo conversões automaticamente. Poderia utilizar aqui neste artigo também, mas vou fazer as conversões passo a passo para tornar este artigo mais didático, mais próximo ao que o estudante faria no papel.
Vamos, agora, criar variáveis para cada informação do enunciado. Novamente, perceba o cuidado em colocar as unidades. É um simples detalhe que ajuda outras pessoas a entenderem seu código e ajuda a perceber problemas de inconsistências de unidades (análise dimensional). E, ainda, ajuda uma outra pessoa muito importante: seu próprio “eu” futuro, que nem vai se lembrar no que estava pensando no momento que escreveu o código 😉
massa = 171 # g
volume = 500 # mL
meia_vida = 100 # min
tempo = 400 # min
Já vimos que é necessário que o volume esteja em litro. Assim, podemos redefinir a variável volume
para que ela seja o próprio valor que possui no momento vezes 10-3. Afinal, o prefixo m em mL significa exatamente 10-3 x L:
volume = volume * 1E-3 # mL para L
O 1E-3
no código tem o mesmo significado que 1 x 10-3. Essa notação E é muito utilizada em calculadoras e programas de computador para potências de 10.
Agora já temos o suficiente para calcular a concentração molar inicial de sacarose. Das aulas de química:
Veja que, caso não se lembre da fórmula, apenas com as unidades você pode descobrir como arranjar as quantidades de forma a fornecer a unidade desejada. No caso, mol/ℓ. Então, vamos fazer tal conta:
concentracao_inicial = massa / (formula.mass * volume)
concentracao_inicial # mol/l
0.9991322244486738
Agora, vamos lidar com a meia-vida e terminar de resolver a questão. O conceito de meia-vida é simples e podemos chegar à resposta apenas com raciocínio. Já vimos que, após cada período de meia-vida, a concentração cai pela metade. Assim:
Logo, após 400 min, a concentração inicial foi dividida por 16:
concentracao_inicial / 16 # mol/l
0.06244576402804211
Chegamos em nossa resposta! Letra B, 6,25 x 10-2 mol L-1. Mas vamos deixar o código um pouco melhor e mais geral.
Generalizando a resolução
Observe, no esquema acima, que há uma relação que envolve potências de 2 e a quantidade de períodos de meia-vida que se passaram. Assim, podemos generalizar um pouco mais nossa resolução. A quantidade de períodos de meia-vida pode ser facilmente calculada:
qtd_meias_vidas = tempo / meia_vida
qtd_meias_vidas
4.0
E, com isso, calcular a concentração final:
concentracao_final = concentracao_inicial / 2**qtd_meias_vidas
concentracao_final # mol/l
0.06244576402804211
Mesmo resultado de antes, mas veja que agora não aparece o “número mágico” 16. Conseguimos expressar o problema com base em seus fundamentos. E, claro, podemos apresentar o resultado de forma mais amigável, sem tantos números que, na realidade, não são significativos, e com a unidade. Para isso, um pouco de formatação de strings:
print(f'{concentracao_final:.2E} mol/L')
6.24E-02 mol/L
Bem melhor.
Porém… pense! Seria muito interessante se conseguíssemos alguma forma de simplesmente fornecer os dados de entrada e o resultado aparecer. Para isso servem computadores: para perder horas vendo vídeos no YouTube e para automatizar tarefas repetitivas.
Já sabemos os fundamentos do problema, então, podemos escrever uma função que pega os dados concentração inicial, meia-vida e tempo e retorna a concentração final:
def concentracao_apos_qtd_meia_vidas(concentracao_inicial, meia_vida, tempo):
qtd_meias_vidas = tempo / meia_vida
return concentracao_inicial / 2**qtd_meias_vidas
concentracao_apos_qtd_meia_vidas(concentracao_inicial, meia_vida, tempo)
0.06244576402804211
Agora temos uma função que automatiza todo o trabalho que desenvolvemos. Pode ser utilizada em qualquer exercício similar. Pode, inclusive, ser colocada em um script Python e ser reaproveitada em outros contextos que, matematicamente, sejam similares, conforme veremos a seguir.
Já que estamos aqui, vamos entender um pouco mais de cinética.
Um pouco mais sobre cinética
Diversas simplificações são feitas no estudo de química em nível de ensino médio. Uma delas é abordar o conceito de tempo de meia-vida como sendo atrelado a reações de cinética de primeira ordem.
Conceitualmente, qualquer ordem pode ter uma expressão para tempo de meia-vida. No entanto, o conceito é mais importante do ponto de vista prático realmente em cinéticas de primeira ordem como, por exemplo, em decaimento radioativo ou no acompanhamento da concentração de alguns fármacos na corrente sanguínea. Vamos, então, lembrar de pontos importantes de cinética de primeira ordem e relacionar com a questão.
Considerando uma espécie química qualquer A, se ela sofre uma tranformação qualquer que obedece uma cinética de primeira ordem, então as seguintes equações são válidas:
Consegue reconhecer as potências de 2 vistas anteriormente em alguma dessas equações?
Assim, podemos escrever funções que fornecem a constante de velocidade para a reação e a concentração de A (na questão, sacarose) após um tempo qualquer. Nas funções, utilizei a biblioteca NumPy para as funções ln (log
) e exponencial (exp
):
def constante_velocidade_primeira_ordem(meia_vida):
return np.log(2) / meia_vida
def concentracao(concentracao_inicial, meia_vida, tempo):
constante_velocidade = constante_velocidade_primeira_ordem(meia_vida)
return concentracao_inicial * np.exp(-constante_velocidade * tempo)
constante_velocidade_primeira_ordem(meia_vida) # unidade será min^-1
0.006931471805599453
concentracao(concentracao_inicial, meia_vida, tempo) # mol/l
0.06244576402804211
Obviamente, o resultado obtido é o mesmo de antes. Mas, agora, utilizamos um conhecimento mais aprofundado do assunto. Veja, é perfeitamente possível resolver a questão sem entrar no mérito de ordem de reação (como fizemos antes). Porém, sabendo que se trata de uma questão de cinética de primeira ordem, podemos explorar um pouco mais. Vamos visualizar o que significa “diminuir pela metade a concentração” graficamente e, com a visualização, entender o que quer dizer decaimento exponencial, termo muito utilizado em cinéticas de primeira ordem.
Primeiro, vamos obter as concentrações de sacarose após 5 tempos de meia-vida consecutivos para ter alguns pontos de referência no gráfico:
tempos = np.array([tempo for tempo in range(0, 501, 100)])
concentracoes = concentracao(concentracao_inicial, meia_vida, tempos)
concentracoes
array([0.99913222, 0.49956611, 0.24978306, 0.12489153, 0.06244576, 0.03122288])
Consegue encontrar um padrão nos valores acima?
Agora, vamos utilizar a biblioteca Matplotlib para construir um gráfico. No gráfico, quero que os pontos acima tenham destaque e quero uma curva que mostre o perfil de uma função exponencial. Segue o código:
# configurando o Matplotlib para o gráfico para ficar mais apresentável
params = {
'lines.linewidth': 2.5,
'axes.labelsize': 16,
'axes.titlesize': 16,
'xtick.labelsize': 14,
'ytick.labelsize': 14,
'figure.autolayout': True,
'figure.titlesize': 24,
'figure.figsize': (12, 8),
'legend.shadow': False,
'legend.fontsize': 14,
}
plt.rcParams.update(params)
.
fig, ax = plt.subplots()
# criando pontos para uma curva teórica
t = np.array([tempo for tempo in range(0, 551, 20)])
c = concentracao(concentracao_inicial, meia_vida, t)
ax.plot(t, c, zorder=1, label='Curva teórica - cinética 1ᵃ ordem')
# os pontos de meia-vida criados anteriormente
ax.scatter(tempos, concentracoes, color='red', s=60, zorder=2,
label='Pontos de meia-vida')
# criando um grid com espaçamento adequado para facilitar a leitura do gráfico
loc = lambda x: plticker.MultipleLocator(base=x)
ax.xaxis.set_major_locator(loc(50))
ax.yaxis.set_major_locator(loc(0.25))
ax.yaxis.set_minor_locator(loc(0.125))
ax.grid(b=True, axis='both', which='major',
linestyle='--', linewidth=1.5)
ax.grid(b=True, which='minor', axis='both', linestyle=':', linewidth=1.0)
ax.set_axisbelow(True)
# identificando adequadamente o gráfico e seus componentes
ax.set_xlabel('Tempo / min')
ax.set_ylabel('Concentração / $mol \cdot L^{-1}$')
fig.suptitle('Inversão da sacarose')
plt.legend()
plt.show()
Acompanhe cada ponto vermelho no gráfico obtido. Veja que, a cada 100 min (nosso tempo de meia-vida da questão), a concentração cai pela metade do valor que tinha antes de passados os 100 min. Utilize as linhas de grade para facilitar sua leitura. Qualquer intervalo de 100 min poderia ser utilizado, por conveniência se partiu do valor de 0 min.
Como já dito anteriormente, o exemplo mais comum de cinética de primeira ordem é o decaimento radioativo, vemos no gráfico o motivo pelo qual usualmente esse decaimento é dito exponencial.
Afinal, o que é inversão da sacarose?
Para finalizar, vamos entender o que é a tal hidrólise e porque a enzima pode ser chamada de invertase. Sim, é uma enzima pois o final é “ase” e enzimas são catalisadores. Lembra das palavras-chave que mostrei no início como sendo importantes em cinética? Tá lá catalisadores…
Sempre que for estudar alguma reação, escreva a equação da mesma com as estruturas. Sempre. Sem exceções.
O que você faria então? Bom, provavelmente jogaria no Google os nomes das substâncias, olharia as estruturas e as copiaria para montar a equação. Ou gastaria seu suado dinheiro comprando programas para desenhar estruturas químicas. Mas o tempo urge e a preguiça reina. A vida seria mais fácil se pudéssemos colocar os nomes das substâncias e o computador montasse a equação. E é o que faremos.
O artigo ficaria muito longo e denso se fosse detalhar como pacotes de química funcionam internamente para passar ao computador toda a informação presente em uma estrutura química para a desenhar. Se as aulas de orgânica já devem ter te traumatizado com as regras de nomenclatura, imagine codificar aqueles nomes. Vou explicar brevemente, mas se quiserem um artigo só sobre isso, deixe nos comentários do artigo ou nas redes sociais.
Simplificadamente, há uma especificação de nome SMILES que incorpora em uma string toda a informação necessária para reprodução de uma dada estrutura química. E, felizmente, há imensos bancos de dados online, como o PubChem, de onde tais SMILES podem ser extraídos para milhões de compostos químicos. O pacote pubchempy
permite fazer uma busca no PubChem de forma programática.
Assim, vamos buscar pelos nomes das substâncias e armazenar cada SMILE em uma lista. O enunciado diz que a sacarose é transformada em frutose e glicose. Mas, claro, os nomes devem estar em inglês para que a busca seja feita. Segue o código:
import pubchempy
names = ('sucrose', 'water', 'fructose', 'glucose')
smiles = []
for name in names:
smiles.append(pubchempy.get_compounds(name,'name')[0].isomeric_smiles)
smiles
['C([C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)O[C@]2([C@H]([C@@H]([C@H](O2)CO)O)O)CO)O)O)O)O', 'O', 'C1[C@H]([C@H]([C@@H](C(O1)(CO)O)O)O)O', 'C([C@@H]1[C@H]([C@@H]([C@H](C(O1)O)O)O)O)O']
Por incrível que pareça, esse emaranhado de símbolos é toda a informação necessária para (re)construir cada estrutura.
Agora, precisamos de algum pacote que seja capaz de entender esses SMILES e transformar em figuras das estruturas na forma de uma equação. Aqui entra o RDKit:
from rdkit.Chem import AllChem
from rdkit.Chem.Draw import IPythonConsole
IPythonConsole.ipython_useSVG=True
IPythonConsole.molSize = 550,200
reaction = AllChem.ReactionFromSmarts(f'{smiles[0]}.{smiles[1]}>>{smiles[2]}.{smiles[3]}',
useSmiles=True)
reaction
Eis nossa equação da reação de forma praticamente sem esforço.
Traduzindo o enunciado (com algumas simplificações de linguagem): é uma hidrólise pois há a quebra de uma ligação química na presença de água (do grego – hidro: água, lysis: quebra). A sacarose é um açúcar em linguagem cotidiana. O nome mais formal da classe de compostos na qual os açúcares se incluem é carboidratos, compostos formados por carbono, hidrogênio e oxigênio, também chamados de sacarídeos. Veja na estrutura da sacarose que há dois ciclos unidos por ligações envolvendo um átomo de oxigênio. Cada um dos grupos ligados é um monossacarídeo. Portanto, a sacarose é um dissacarídeo (dois monossacarídeos ligados). Espero que tenha ajudado a decifrar o enunciado. Consulte seu professor de química mais próximo para mais detalhes e uma linguagem mais rigorosa.
Por que a enzima se chama invertase? Se você já estudou orgânica, deve se lembrar que existe o conceito de quiralidade e deve reconhecer que nas estruturas apresentadas há diversos centros quirais em átomos de carbono. Quando um feixe de luz polarizada, conceito visto em física, passa por uma solução contendo espécies quirais o ângulo de polarização pode ser alterado. Veja a figura a seguir:
Princípio de funcionamento de um polarímetro. 1. Fonte de luz; 2. Luz não polarizada; 3. Polarizador; 4. Luz polarizada; 5. Amostra da solução; 6. Rotação da luz devido a moléculas quirais; 7. Analisador giratório; 8. Detector. Fonte: Wikipedia
No caso da questão, quando se tem uma solução apenas com sacarose a luz polarizada é desviada em um direção. No entanto, à medida que a sacarose se transforma na mistura de frutose e glicose, o ângulo de desvio diminui por mudança na direção do desvio. Daí a ideia de inversão, se refere à mudança na direção da luz polarizada. Novamente, simplifiquei bem a linguagem para deixar o texto mais acessível, consulte seu professor de física ou química mais próximo para mais detalhes e uma linguagem mais rigorosa.
Conclusão e mais questões do ENEM
Impressionante como tanta informação pode ser extraída de um enunciado, certo? A questão em si é simples mas, a cada vez que se questiona algo, novos conhecimentos são adquiridos.
E aí? Aprendeu mais Python ou mais química? Para mais questões de ENEM resolvidas com Python clique aqui.
Divulgue esse artigo com estudantes e com quem mais quiser. Acompanhe o Ciência Programada nas redes sociais para saber quando mais artigos serão lançados.
Até a próxima!