#Problema 1
Kc <- 50.2
concentraciones <- function(x) {
  H2 <- 0.5 - x
    I2 <- 0.5 - x
      HI <- 2 * x
        return(data.frame(x = x, H2 = H2, I2 = I2, HI = HI))
        }

        x_vals <- seq(0.001, 0.499, by = 0.001)

        Q_vals <- (2 * x_vals)^2 / ((0.5 - x_vals)^2)

        diff_squared <- (Q_vals - Kc)^2

        min_index <- which.min(diff_squared)
        x_eq <- x_vals[min_index]
        Q_eq <- Q_vals[min_index]

        cat("x de equilibrio:", x_eq, "\n")
## x de equilibrio: 0.39
        cat("Q (≈ Kc) en equilibrio:", Q_eq, "\n")
## Q (≈ Kc) en equilibrio: 50.28099
        resultado_concentraciones <- concentraciones(x_eq)
        print(resultado_concentraciones)
##      x   H2   I2   HI
## 1 0.39 0.11 0.11 0.78
#Problema 2
#install.packages("readr")
#install.packages("ggplot2")

library(readr)
library(ggplot2)

url_github_csv <- "https://raw.githubusercontent.com/SandyGonzalez-QM/QM215/main/CO2.csv"

df_co2 <- read_csv(url_github_csv)
## `curl` package not installed, falling back to using `url()`
## Rows: 61 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (2): T, Cp
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
message("--- Primeras filas del dataframe de CO2 ---")
## --- Primeras filas del dataframe de CO2 ---
print(head(df_co2))
## # A tibble: 6 × 2
##       T    Cp
##   <dbl> <dbl>
## 1  100   29.2
## 2  200   32.4
## 3  298.  37.1
## 4  300   37.2
## 5  400   41.3
## 6  500   44.6
message("\n--- Estructura del dataframe de CO2 ---")
## 
## --- Estructura del dataframe de CO2 ---
print(str(df_co2))
## spc_tbl_ [61 × 2] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ T : num [1:61] 100 200 298 300 400 ...
##  $ Cp: num [1:61] 29.2 32.4 37.1 37.2 41.3 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   T = col_double(),
##   ..   Cp = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr> 
## NULL
message("\n--- Nombres de las columnas en el dataframe ---")
## 
## --- Nombres de las columnas en el dataframe ---
print(names(df_co2)) # ¡Confirma que aquí ves 'T' y 'Cp'!
## [1] "T"  "Cp"
grafico_Cp_T_final <- ggplot(df_co2, aes(x = T, y = Cp)) + 
    geom_point(color = "darkgreen", size = 2) +
          geom_smooth(method = "loess", se = FALSE, color = "blue", linetype = "solid", linewidth = 1) +
              labs(
                  title = "Capacidad Calorífica Molar ($C_p$) del $CO_2$ vs. Temperatura", 
                      x = "Temperatura (K)", # Etiqueta del eje X.
                          # Etiqueta del eje Y usando notación matemática para las unidades ($J~mol^{-1}~K^{-1}$).
                              y = expression(C[p]~~(J~mol^{-1}~K^{-1}))
                                ) +
                                    theme_minimal() +
                                        theme(
                                            plot.title = element_text(hjust = 0.5, face = "bold", size = 14), 
                                                axis.title = element_text(face = "bold", size = 12), 
                                                    axis.text = element_text(size = 10), 
                                                        panel.grid.major = element_line(color = "grey80", linetype = "dotted"), 
                                                            panel.grid.minor = element_blank() 
                                                              )

                                                            
                                                              message("\n--- Gráfico de la Capacidad Calorífica del CO2 ---")
## 
## --- Gráfico de la Capacidad Calorífica del CO2 ---
                                                              print(grafico_Cp_T_final)
## `geom_smooth()` using formula = 'y ~ x'

# Problema 3 
#install.packages("ggplot2")
library(ggplot2)

datos_espectro <- data.frame(
  C = c(0.00, 0.02, 0.04, 0.06, 0.08, 0.10),
  Abs = c(0.00, 0.18, 0.38, 0.59, 0.81, 1.01)
)

grafico_dispersión <- ggplot(datos_espectro, aes(x = C, y = Abs)) +
  geom_point(color = "darkred", size = 3) +
  labs(
    title = "Curva de Calibración: Absorbancia vs. Concentración",
    x = "Concentración (mol/L)",
    y = "Absorbancia"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    axis.title = element_text(face = "bold", size = 12)
  )

print(grafico_dispersión)

modelo_regresion <- lm(Abs ~ C, data = datos_espectro)

coeficientes <- coef(modelo_regresion)
intercepto <- coeficientes["(Intercept)"]
pendiente <- coeficientes["C"]

cat(sprintf("\nEcuación de la Recta de Calibración Ajustada: Absorbancia = %.4f + %.4f * Concentración\n", intercepto, pendiente))
## 
## Ecuación de la Recta de Calibración Ajustada: Absorbancia = -0.0157 + 10.2143 * Concentración
cat(sprintf("El valor de la pendiente es %.4f. En espectrofotometría, representa el producto de la absortividad molar (ε) y la longitud del paso de luz (b).\n", pendiente))
## El valor de la pendiente es 10.2143. En espectrofotometría, representa el producto de la absortividad molar (ε) y la longitud del paso de luz (b).
cat("Significa que la absorbancia aumenta en %.4f unidades por cada aumento de 1 mol/L en la concentración.\n", pendiente)
## Significa que la absorbancia aumenta en %.4f unidades por cada aumento de 1 mol/L en la concentración.
##  10.21429
grafico_regresion <- grafico_dispersión +
  geom_abline(intercept = intercepto, slope = pendiente, color = "blue", linetype = "dashed", linewidth = 1)
print(grafico_regresion)

absorbancia_muestra <- 0.75

concentracion_estimada <- (absorbancia_muestra - intercepto) / pendiente

cat(sprintf("\nPara una absorbancia de %.2f, la concentración estimada es de %.4f mol/L.\n",
            absorbancia_muestra, concentracion_estimada))
## 
## Para una absorbancia de 0.75, la concentración estimada es de 0.0750 mol/L.
r_squared <- summary(modelo_regresion)$r.squared

cat(sprintf("\nEl valor de R-cuadrado (R^2) del modelo es: %.4f\n", r_squared))
## 
## El valor de R-cuadrado (R^2) del modelo es: 0.9991
if (r_squared > 0.99) {
  cat("Un R^2 tan alto indica un ajuste excelente del modelo lineal a los datos, lo cual es consistente con la Ley de Beer-Lambert.\n")
} else {
  cat("El valor de R^2 indica qué tan bien los datos se ajustan a la línea de regresión; un valor más cercano a 1 indica un mejor ajuste.\n")
}
## Un R^2 tan alto indica un ajuste excelente del modelo lineal a los datos, lo cual es consistente con la Ley de Beer-Lambert.
#Problema 4

X0 <- 0.100        # Concentración inicial (mol/L)
k_teorico <- 0.25  # Constante de velocidad (min^-1)
tiempo <- seq(0, 20, by = 1)  # Tiempo de 0 a 20 minutos en pasos de 1 min

X_teorico <- X0 * exp(-k_teorico * tiempo)

set.seed(123)  # Semilla para reproducibilidad
ruido <- rnorm(length(tiempo), mean = 0, sd = 0.005)
X_con_ruido <- X_teorico + ruido

plot(tiempo, X_con_ruido, type = "o", col = "blue", pch = 16,
     xlab = "Tiempo (min)", ylab = "Concentración de X (mol/L)",
     main = "Descomposición de X (cinética de primer orden)")
lines(tiempo, X_teorico, col = "red", lty = 2, lwd = 2)
legend("topright", legend = c("Datos experimentales", "Modelo teórico"),
       col = c("blue", "red"), lty = c(1, 2), pch = c(16, NA), lwd = 2)

ln_X <- log(X_con_ruido)
## Warning in log(X_con_ruido): Se han producido NaNs
modelo <- lm(ln_X ~ tiempo)  
pendiente <- coef(modelo)[2]
k_estimado <- -pendiente 

cat("\n--- Resultados del ajuste ---\n")
## 
## --- Resultados del ajuste ---
cat("Valor teórico de k:", k_teorico, "min⁻¹\n")
## Valor teórico de k: 0.25 min⁻¹
cat("Valor estimado de k:", round(k_estimado, 4), "min⁻¹\n")
## Valor estimado de k: 0.2134 min⁻¹
#Problema 5

if (!requireNamespace("ggplot2", quietly = TRUE)) {
  install.packages("ggplot2")
}
library(ggplot2)

url_github <- "https://raw.githubusercontent.com/SandyGonzalez-QM/QM215/main/titulacion_acetico.csv"

datos_titulacion <- read.csv(url_github)

cat("Datos cargados (primeras 6 filas):\n")
## Datos cargados (primeras 6 filas):
print(head(datos_titulacion))
##   vol_NaOH_mL   pH
## 1           0 2.88
## 2           1 3.14
## 3           2 3.41
## 4           3 3.65
## 5           4 3.89
## 6           5 4.22
cat("\n")
curva_titulacion_plot <- ggplot(datos_titulacion, aes(x = vol_NaOH_mL, y = pH)) +
  geom_point(color = "blue", size = 2) + # Puntos de datos
  geom_line(color = "red", linewidth = 0.8) +   # Línea conectando los puntos
  labs(
    title = "Curva de Titulación de Ácido Acético con NaOH",
    x = "Volumen de NaOH agregado (mL)",
    y = "pH"
  ) +
  theme_minimal() + 
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) + # Centrar y poner en negrita el título
  scale_x_continuous(breaks = seq(0, max(datos_titulacion$vol_NaOH_mL), by = 2)) # Ajustar los ticks del eje X

print(curva_titulacion_plot)

delta_pH <- diff(datos_titulacion$pH)
delta_vol_NaOH <- diff(datos_titulacion$vol_NaOH_mL)
primera_derivada <- delta_pH / delta_vol_NaOH

indice_punto_equivalencia_derivada <- which.max(primera_derivada)

volumen_equivalencia_estimado <- datos_titulacion$vol_NaOH_mL[indice_punto_equivalencia_derivada] + (delta_vol_NaOH[indice_punto_equivalencia_derivada] / 2)

cat("\n")
cat("--- Detección del Punto de Equivalencia ---\n")
## --- Detección del Punto de Equivalencia ---
cat("Observando la curva de titulación (pH vs. volumen de NaOH agregado),\n")
## Observando la curva de titulación (pH vs. volumen de NaOH agregado),
cat("el pH cambia drásticamente en un rango específico. Para esta titulación de un ácido débil con una base fuerte,\n")
## el pH cambia drásticamente en un rango específico. Para esta titulación de un ácido débil con una base fuerte,
cat("el punto de equivalencia se encuentra en un pH > 7. Gráficamente, se corresponde con el punto de mayor pendiente.\n")
## el punto de equivalencia se encuentra en un pH > 7. Gráficamente, se corresponde con el punto de mayor pendiente.
cat("\n")
cat("Basado en los datos y la visualización, el mayor cambio de pH ocurre alrededor de:\n")
## Basado en los datos y la visualización, el mayor cambio de pH ocurre alrededor de:
cat(paste0("Volumen de NaOH = ", datos_titulacion$vol_NaOH_mL[indice_punto_equivalencia_derivada], " mL a ", datos_titulacion$vol_NaOH_mL[indice_punto_equivalencia_derivada + 1], " mL.\n"))
## Volumen de NaOH = 11 mL a 12 mL.
cat(paste0("El pH en ", datos_titulacion$vol_NaOH_mL[indice_punto_equivalencia_derivada], " mL es ", datos_titulacion$pH[indice_punto_equivalencia_derivada], " y en ", datos_titulacion$vol_NaOH_mL[indice_punto_equivalencia_derivada + 1], " mL es ", datos_titulacion$pH[indice_punto_equivalencia_derivada + 1], ".\n"))
## El pH en 11 mL es 6.73 y en 12 mL es 7.42.
cat("\n")
cat(paste0("Por lo tanto, el **volumen de NaOH estimado para el punto de equivalencia es aproximadamente ", datos_titulacion$vol_NaOH_mL[12], " mL**.\n")) 
## Por lo tanto, el **volumen de NaOH estimado para el punto de equivalencia es aproximadamente 11 mL**.