Metodología de Validación: el Motor QUAL2K en Python frente al Modelo Original en Excel

El motor de QUAL2K en Python que corre en Hidrolitica se valida comparándolo contra el modelo original en Excel VBA. El procedimiento es directo: se toman los mismos datos de entrada y las mismas condiciones de frontera, calcados al 100%, se corren primero en el libro de Excel original y luego en el motor en la nube, y se comparan los resultados celda por celda. El objetivo no es verificar si la hidrodinámica reproduce mediciones de campo, que es el trabajo propio de la calibración, sino comprobar que nuestra implementación entrega los mismos números que el modelo de referencia. Esa equivalencia es la base sobre la que la plataforma se ofrece como software de simulación de ríos gratis.

Flujo de la Comparación Automatizada

Casos de Prueba

La batería cubre ríos de distinta escala y complejidad, desde un caso mínimo de dos tramos hasta modelos reales con múltiples tramos, fuentes puntuales y fuentes difusas:

CasoUbicaciónTramosFuentes PuntualesFuentes DifusasQué Pone a Prueba
ParaluzBrasil2 tramos00Hidráulica básica y decaimiento de la DBO rápida y lenta
BolderColorado, EE.UU.50 tramos21Carga computacional y arrastre del balance de masa en cascada sobre muchos tramos, con todas las variables activas
Río CaucaColombia17 tramos32Dinámica del nitrógeno amoniacal y su efecto sobre el oxígeno disuelto en un río tropical
Río MeléndezColombia8 tramos10Calibración automática por algoritmo genético en un río urbano que recibe efluente de PTAR

Métricas de Comparación

Para cada variable y cada tramo se calculan tres métricas sobre los resultados de ambos motores:

  • Error absoluto: |Python − Excel|
  • Error relativo: 100 × |Python − Excel| / Excel (no se calcula cuando el valor de referencia de Excel es 0)
  • Error máximo: el mayor error relativo observado entre todos los tramos del modelo

Criterios de Aprobación

Grupo de VariablesUmbral MáximoJustificación
Hidráulica (velocidad U, profundidad H, ancho B, área Ac)< 0.1%Son fórmulas cerradas y deterministas, de modo que se espera una coincidencia prácticamente exacta entre las dos implementaciones.
Oxígeno disuelto y DBO carbonácea< 1.0%Las diferencias provienen del método de integración: el modelo original avanza con Euler, mientras que el motor en Python resuelve analíticamente los términos exponenciales.
Nutrientes (nitrógeno y fósforo)< 2.0%Las tasas están encadenadas entre sí, así que una diferencia pequeña en un proceso se propaga y se amplifica a lo largo de la cadena de reacciones.
Patógenos< 1.0%El decaimiento es de primer orden, por lo que se espera una coincidencia muy cercana a la exacta.
Temperatura< 0.5%Es un dato de entrada que el modelo transporta con muy poco cálculo asociado.

Diferencias Menores Conocidas

Ejecutar la Batería de Pruebas

La batería completa se corre desde la línea de comandos:

python validate_all_models.py

El comando recorre todos los casos de prueba y produce un resumen con el veredicto de cada uno y el error máximo por variable. Los resultados detallados, tramo por tramo, están en Comparación de Modelos.