11. Ecuaciones diferenciales
¿Qué tan rápido cambia la planta antes del evento?
Ecuaciones diferenciales
Usamos tasas de cambio para capturar dinámica de nivel, recuperación y riesgo antes de la sobre-espumación.
1. Pregunta de planta
Una ecuación diferencial describe cómo cambia una variable con el tiempo. En flotación, sirve para hablar de dinámica: nivel, recuperación, riesgo o espuma.
Idea central: no solo preguntamos cuál es el nivel de celda, sino qué tan rápido está subiendo o bajando.
2. Matemática simple
Una derivada temporal mide velocidad de cambio:
dNivel/dt = cambio del nivel por unidad de tiempo
dRiesgo/dt = cambio del score de riesgo por unidad de tiempo
En datos discretos, se aproxima con diferencias:
dNivel/dt aproximado = Nivel_actual - Nivel_anterior
Si el nivel sube rápido y al mismo tiempo el espumante está alto, puede aparecer una condición de alerta antes del evento.
3. Aplicaciones al caso
| Variable dinámica | Pregunta | Alerta temprana |
|---|---|---|
d_nivel | ¿El nivel está subiendo rápido? | Riesgo de desborde o espuma inestable. |
d_score_riesgo | ¿El riesgo se acelera? | Condición anormal emergente. |
d_recuperacion | ¿La recuperación está cayendo? | Pérdida metalúrgica en curso. |
4. Excel: ejercicio guiado
Cambio horario de nivel
=J3-J2
Cambio horario de recuperación
=F3-F2
Cambio horario de score de riesgo
=P3-P2
Alerta simple
=SI(Y(J3-J2>5,L3>40),"Alerta nivel + espumante","Normal")
5. Python: velocidades de cambio
import pandas as pd
archivo = "flotacion_cobre.xlsx"
df = pd.read_excel(archivo)
df["d_nivel"] = df["nivel_celda"].diff()
df["d_recuperacion"] = df["recuperacion_cu"].diff()
df["d_score_riesgo"] = df["score_riesgo"].diff()
alertas = df[
(df["d_nivel"] > 5) &
(df["dosificacion_espumante"] > df["dosificacion_espumante"].quantile(0.75))
]
alertas[["nivel_celda", "d_nivel", "dosificacion_espumante", "evento_sobre_espumacion"]].head()6. Puente hacia Machine Learning
Las tasas de cambio son muy valiosas para modelos de alerta, porque capturan dinámica.
features = [
"flujo_aire", "nivel_celda", "ph", "dosificacion_espumante",
"score_riesgo", "d_nivel", "d_score_riesgo", "d_recuperacion"
]
X = df[features].dropna()
y = df.loc[X.index, "evento_sobre_espumacion"]
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
modelo = LogisticRegression(max_iter=1000)
modelo.fit(X_train, y_train)
pred = modelo.predict(X_test)
print(classification_report(y_test, pred))Importante: en datos reales hay que cuidar el orden temporal. No conviene mezclar futuro con pasado al validar modelos de proceso.
7. Cierre conceptual
Mensaje final: las ecuaciones diferenciales enseñan a pensar en dinámica. Para planta, no basta saber dónde estamos; también importa hacia dónde y qué tan rápido nos estamos moviendo.
