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