PROBLEMA 1 – EQUILIBRIO QUÍMICO EN SOLUCIÓN

H2(g) + I2(g) ⇌ 2HI(g) ; Kc = 50.2

Se introducen 0.5 mol de H2 y 0.5 mol de I2

sin HI inicial en 1 L. Analizar Q vs x

Kc <- 50.2

x <- seq(0, 0.5, by = 0.01)

H2 <- 0.5 - x
I2 <- 0.5 - x
HI <- 2 * x

Q <- (HI^2) / (H2 * I2)

(Q - Kc)^2
##  [1] 2.520040e+03 2.519873e+03 2.519343e+03 2.518404e+03 2.517004e+03
##  [6] 2.515084e+03 2.512578e+03 2.509409e+03 2.505491e+03 2.500726e+03
## [11] 2.495003e+03 2.488193e+03 2.480150e+03 2.470707e+03 2.459670e+03
## [16] 2.446817e+03 2.431889e+03 2.414590e+03 2.394573e+03 2.371437e+03
## [21] 2.344712e+03 2.313850e+03 2.278211e+03 2.237043e+03 2.189465e+03
## [26] 2.134440e+03 2.070756e+03 1.996992e+03 1.911496e+03 1.812365e+03
## [31] 1.697440e+03 1.564345e+03 1.410605e+03 1.233930e+03 1.032819e+03
## [36] 8.078227e+02 5.641110e+02 3.167557e+02 1.017857e+02 6.559661e-03
## [41] 1.904400e+02 1.076650e+03 3.606002e+03 1.014830e+04 2.719567e+04
## [46] 7.496644e+04 2.292494e+05 8.678372e+05 5.079614e+06 9.127509e+07
## [51]          Inf
diff_Q_Kc_sq <- (Q - Kc)^2

min_index <- which.min(diff_Q_Kc_sq)
x_min <- x[min_index]
Q_min <- Q[min_index]

cat("El valor de x que minimiza (Q - Kc)^2 es:", x_min, "\n")
## El valor de x que minimiza (Q - Kc)^2 es: 0.39
cat("El valor de Q en ese punto es:", Q_min, "\n")
## El valor de Q en ese punto es: 50.28099
plot(x, Q, type = "l", col = "orange", lwd = 2,
     xlab = "Cambio (x)", ylab = "Cociente de reacción Q",
     main = "Q en función de x")
abline(h = Kc, col = "red", lty = 2)
points(x_min, Q_min, col = "darkgreen", pch = 19)
legend("topright", legend = c("Q(x)", "Kc", "mínimo Q"), 
       col = c("orange", "red", "darkgreen"), lty = c(1,2,NA), pch = c(NA, NA, 19))

PROBLEMA 2 – ANÁLISIS TERMODINÁMICO DEL CO₂ DESDE TABLAS JANAF

Se grafican los datos de Cp (J/mol·K) en función de la temperatura (K)

utilizando datos obtenidos de JANAF y cargados desde GitHub.

library(ggplot2)

url <- "https://raw.githubusercontent.com/Raquelita03/QM215-2025/refs/heads/main/CO2.csv"
co2 <- read.csv(url, sep = ";")
head(co2)
##        T     Cp       S
## 1 100.00 29.106 173.307
## 2 200.00 29.126 193.485
## 3 250.00 29.201 199.990
## 4 298.15 29.376 205.147
## 5 300.00 29.385 205.329
## 6 350.00 29.694 209.880
ggplot(co2, aes(x = T, y = Cp)) +
  geom_point(color = "steelblue", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "pink", lwd = 1) +
  labs(title = "Variación de Cp CO2 vs Temperatura",
       x = "Temperatura (K)",
       y = "Capacidad Calorífica Cp (J/mol·K)") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

PROBLEMA 3 – ANÁLISIS DE LA RELACIÓN LINEAL ENTRE ABSORBANCIA

Y CONCENTRACIÓN DE UNA SOLUCIÓN

Se ajusta un modelo lineal para relacionar absorbancia con concentración

y se estima la concentración para una absorbancia dada.

datos <- data.frame(
  concentracion = c(0.00, 0.02, 0.04, 0.06, 0.08, 0.10),
  absorbancia = c(0.00, 0.18, 0.38, 0.59, 0.81, 1.01)
)
plot(datos$concentracion, datos$absorbancia,
     main = "Absorbancia vs Concentración",
     xlab = "Concentración (mol/L)",
     ylab = "Absorbancia",
     pch = 19, col = "blue")

modelo <- lm(absorbancia ~ concentracion, data = datos)

abline(modelo, col = "red", lwd = 2)

coeficientes <- coef(modelo)
cat("Ecuación ajustada: Absorbancia =", round(coeficientes[1], 4), "+", round(coeficientes[2], 4), "* Concentración\n")
## Ecuación ajustada: Absorbancia = -0.0157 + 10.2143 * Concentración
cat("Pendiente (sensibilidad):", round(coeficientes[2], 4), "absorbancia/(mol/L)\n")
## Pendiente (sensibilidad): 10.2143 absorbancia/(mol/L)
abs_objetivo <- 0.75
concentracion_estimada <- (abs_objetivo - coeficientes[1]) / coeficientes[2]
cat("Concentración estimada para absorbancia 0.75:", round(concentracion_estimada, 4), "mol/L\n")
## Concentración estimada para absorbancia 0.75: 0.075 mol/L
resumen <- summary(modelo)
cat("Coeficiente de determinación R^2:", round(resumen$r.squared, 4), "\n")
## Coeficiente de determinación R^2: 0.9991

PROBLEMA 4 – CINÉTICA DE PRIMER ORDEN EN LA DEGRADACIÓN DE X

Un compuesto X se descompone según una cinética de primer orden.

Se simulan datos, se agrega ruido experimental, se grafican resultados

y se estima el valor de la constante de velocidad k.

k <- 0.25                 # constante de velocidad (min^-1)
X0 <- 0.100               # concentración inicial (mol/L)
tiempo <- seq(0, 20, 1)   # vector de tiempos de 0 a 20 minutos, cada 1 minuto

X_concentracion <- X0 * exp(-k * tiempo)

set.seed(123)  # Para reproducibilidad del ruido
ruido <- rnorm(length(X_concentracion), mean = 0, sd = 0.005)
X_con_ruido <- X_concentracion + ruido

library(ggplot2)

datos <- data.frame(tiempo, X_concentracion, X_con_ruido)

ggplot(datos, aes(x = tiempo)) +
  geom_line(aes(y = X_concentracion), color = "purple", linewidth = 1.2) +
  geom_point(aes(y = X_con_ruido), color = "green", size = 2) +
  labs(title = "Concentración de X vs Tiempo",
       x = "Tiempo (min)",
       y = "Concentración (mol/L)",
       caption = "Línea azul: sin ruido | Puntos rojos: con ruido") +
  theme_minimal()

datos_filtrados <- datos[X_con_ruido > 0, ]  # evitar log de negativos
ln_X <- log(datos_filtrados$X_con_ruido)
t <- datos_filtrados$tiempo

modelo <- lm(ln_X ~ t)
summary(modelo)
## 
## Call:
## lm(formula = ln_X ~ t)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.84454 -0.09758  0.09599  0.26856  1.21739 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2.49992    0.38298  -6.528 6.96e-06 ***
## t           -0.21344    0.03809  -5.604 3.96e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8537 on 16 degrees of freedom
## Multiple R-squared:  0.6625, Adjusted R-squared:  0.6414 
## F-statistic: 31.41 on 1 and 16 DF,  p-value: 3.955e-05
k_estimado <- -coef(modelo)[2]
cat("k estimado:", k_estimado, "\n")
## k estimado: 0.2134423
cat("k teórico:", k, "\n")
## k teórico: 0.25

PROBLEMA 5 – ANÁLISIS DE DATOS DE UNA TITULACIÓN ÁCIDO-BASE

Se grafica el pH en función del volumen de NaOH agregado

y se estima gráficamente el punto de equivalencia.

library(ggplot2)

datos <- read.csv("https://raw.githubusercontent.com/Raquelita03/QM215-2025/refs/heads/main/titulacion_acetico.csv", sep = ";")

print(colnames(datos))
## [1] "vol_NaOH_mL" "pH"
head(datos)
##   vol_NaOH_mL   pH
## 1           0 2.88
## 2           1 3.14
## 3           2 3.41
## 4           3 3.61
## 5           4 3.91
## 6           5 4.14
ggplot(datos, aes(x = vol_NaOH_mL, y = pH)) +
  geom_point(color = "red", size = 2) +
  geom_line(color = "orange", linewidth = 1.2) +
  labs(title = "Curva de titulación CH3COOH vs NaOH",
       x = "Volumen de NaOH agregado (mL)",
       y = "pH") +
  theme_minimal()

delta_pH <- diff(datos$pH) / diff(datos$vol_NaOH_mL)
vol_prom <- (datos$vol_NaOH_mL[-1] + datos$vol_NaOH_mL[-length(datos$vol_NaOH_mL)]) / 2
df_derivada <- data.frame(vol = vol_prom, dpH = delta_pH)

ggplot(df_derivada, aes(x = vol, y = dpH)) +
  geom_line(color = "darkgreen", linewidth = 1.2) +
  geom_point(color = "black", size = 2) +
  labs(title = "Primera derivada de pH vs volumen de NaOH",
       x = "Volumen de NaOH (mL)",
       y = "Derivada (ΔpH / Δvol)") +
  theme_minimal()

indice_max <- which.max(df_derivada$dpH)
vol_equivalencia <- df_derivada$vol[indice_max]
cat("Punto de equivalencia estimado:", vol_equivalencia, "mL\n")
## Punto de equivalencia estimado: 9.5 mL