Aquí tienes la guía completa, lista para entregar a tus estudiantes.


Análisis Hidráulico de Canales de Riego con Python

Curso: Programación de Computadores con Python — Ing. Civil & Agroindustrial


1. Planteamiento de la situación de interés

Contexto

Un equipo de ingenieros civiles y agroindustriales debe diseñar un canal trapezoidal de riego para abastecer cultivos en una zona rural. El canal debe suministrar suficiente caudal para distintas demandas de agua de los cultivos, y además operar en un régimen hidráulico seguro (subcrítico), que evita erosión y daños en la estructura.

Marco teórico

Ecuación de Manning — relaciona la geometría del canal con el caudal transportado:

\[Q = \frac{1}{n} \cdot A \cdot R^{2/3} \cdot S^{1/2}\]

Donde: - Q = caudal (m³/s) - n = coeficiente de rugosidad de Manning (adimensional) - A = área de la sección transversal (m²) - R = radio hidráulico (m) = A / P - S = pendiente longitudinal del canal (m/m)

Geometría del canal trapezoidal:

\[A = (b + z \cdot y) \cdot y \qquad P = b + 2y\sqrt{1+z^2} \qquad T = b + 2 \cdot z \cdot y\]

Donde b = base, y = tirante (profundidad del agua), z = talud lateral, T = ancho superficial.

Número de Froude — clasifica el régimen de flujo:

\[Fr = \frac{V}{\sqrt{g \cdot D_h}} \qquad \text{con} \quad D_h = \frac{A}{T}, \quad V = \frac{Q}{A}\]

Condición Régimen
Fr < 1 Subcrítico (flujo tranquilo) ✅ recomendado para riego
Fr = 1 Crítico
Fr > 1 Supercrítico (flujo rápido) ⚠️ riesgo de erosión

Demanda hídrica agroindustrial — Cada cultivo tiene una demanda en mm/día, que se convierte a caudal (m³/s) según el área sembrada:

\[Q_{cultivo} = \frac{ETo \cdot K_c \cdot A_{cultivo}}{86400}\]

Donde ETo = evapotranspiración de referencia (mm/día), Kc = coeficiente de cultivo, A_cultivo = área en m².


2. Modelo de solución — construcción interactiva del código con Claude

El estudiante debe construir el programa conversando con Claude, enviando estas instrucciones en orden:

Paso 1 — Funciones geométricas “Escribe en Python tres funciones: calcular_area(b, z, y), calcular_perimetro(b, z, y) y calcular_ancho_superficial(b, z, y), con sus respectivos docstrings y usando la fórmula de Manning para canal trapezoidal.”

Paso 2 — Función de caudal y velocidad “Ahora escribe la función calcular_caudal(b, z, y, n, S) que use las funciones anteriores para calcular Q y V, y retorne ambos valores. Incluye la verificación de que los parámetros sean positivos con condicionales.”

Paso 3 — Clasificación del régimen “Escribe la función clasificar_regimen(Fr) que use estructuras condicionales (if/elif/else) para retornar un string con el nombre del régimen y una advertencia si es supercrítico.”

Paso 4 — Análisis por rango de tirantes (estructura repetitiva) “Escribe la función analizar_canal(b, z, n, S, y_min, y_max, paso) que use un ciclo for o while para iterar sobre distintos valores de tirante y entre y_min y y_max, calcule Q, V, Fr y régimen para cada tirante, y almacene los resultados en una lista de diccionarios.”

Paso 5 — Demanda agroindustrial “Agrega la función calcular_demanda_cultivo(nombre, ETo, Kc, area_ha) que convierta la demanda del cultivo a m³/s, y una función verificar_abastecimiento(Q_canal, cultivos) que use un ciclo for para evaluar con condicionales si el caudal del canal abastece cada cultivo.”

Paso 6 — Programa principal “Escribe el programa principal que llame todas las funciones con los datos del problema, imprima una tabla de resultados y muestre si cada cultivo es abastecido.”


3. Valores de entrada y resultados de validación

Parámetros del canal

b = 0.80 m        (ancho de plantilla)
z = 1.5           (talud, relación H:V)
n = 0.014         (concreto liso)
S = 0.0008        (pendiente m/m)
y_min = 0.20 m
y_max = 1.20 m
paso = 0.20 m

Tabla de resultados esperados

y (m) A (m²) P (m) R (m) Q (m³/s) V (m/s) Fr Régimen
0.20 0.220 1.521 0.145 0.0434 0.197 0.148 Subcrítico
0.40 0.560 2.242 0.250 0.1538 0.275 0.147 Subcrítico
0.60 1.020 2.963 0.344 0.3538 0.347 0.152 Subcrítico
0.80 1.600 3.684 0.434 0.6633 0.415 0.158 Subcrítico
1.00 2.300 4.606 0.499 1.0668 0.464 0.159 Subcrítico
1.20 3.120 5.127 0.609 1.6474 0.528 0.171 Subcrítico

(Valores redondeados a 3 decimales. Pequeñas diferencias en el último decimal son aceptables.)

Cultivos a evaluar (con y = 0.80 m → Q ≈ 0.663 m³/s)

Cultivo: Maíz      | ETo=5.2 mm/día | Kc=1.05 | Área=40 ha  → Q_dem ≈ 0.025 m³/s ✅
Cultivo: Arroz     | ETo=6.0 mm/día | Kc=1.20 | Área=350 ha → Q_dem ≈ 0.292 m³/s ✅
Cultivo: Palma     | ETo=5.5 mm/día | Kc=1.10 | Área=600 ha → Q_dem ≈ 0.420 m³/s ✅
Cultivo: Caña      | ETo=5.8 mm/día | Kc=1.25 | Área=800 ha → Q_dem ≈ 0.671 m³/s ❌

El canal con y = 0.80 m no alcanza a abastecer la caña de azúcar; el estudiante debe encontrar el tirante mínimo que sí lo permita (respuesta: y ≈ 0.81 m).


4. Guía para Google Colab

# 🌊 CANAL DE RIEGO — Análisis Hidráulico con Python
## Notebook de Google Colab

### Estructura del Notebook (una celda por sección)

---

### CELDA 1 — Encabezado y bibliotecas
```python
# Análisis Hidráulico de Canal de Riego
# Curso: Programación de Computadores con Python
# Ingenierías Civil y Agroindustrial

import math

print("=" * 55)
print("  ANÁLISIS HIDRÁULICO DE CANAL TRAPEZOIDAL DE RIEGO")
print("=" * 55)

CELDA 2 — Funciones geométricas

(El estudiante pega aquí las funciones del Paso 1)

def calcular_area(b, z, y):
    ...

def calcular_perimetro(b, z, y):
    ...

def calcular_ancho_superficial(b, z, y):
    ...

CELDA 3 — Funciones hidráulicas

(Pasos 2 y 3: caudal, velocidad, Froude y clasificación)

def calcular_caudal(b, z, y, n, S):
    ...

def clasificar_regimen(Fr):
    ...

CELDA 4 — Análisis por tirantes (ciclo repetitivo)

(Paso 4: iterar sobre rango de tirantes)

def analizar_canal(b, z, n, S, y_min, y_max, paso):
    ...

CELDA 5 — Demanda de cultivos

(Paso 5: demanda y verificación)

def calcular_demanda_cultivo(nombre, ETo, Kc, area_ha):
    ...

def verificar_abastecimiento(Q_canal, cultivos):
    ...

CELDA 6 — Programa principal y salida de resultados

# ── Parámetros del canal ──────────────────────────
b = 0.80
z = 1.5
n = 0.014
S = 0.0008

# ── Análisis hidráulico ───────────────────────────
resultados = analizar_canal(b, z, n, S, 0.20, 1.20, 0.20)

print(f"\n{'y(m)':>6} {'A(m²)':>7} {'Q(m³/s)':>9} {'Fr':>7} {'Régimen':>14}")
print("-" * 50)
for r in resultados:
    print(f"{r['y']:>6.2f} {r['A']:>7.3f} {r['Q']:>9.4f} {r['Fr']:>7.3f} {r['regimen']:>14}")

# ── Cultivos ──────────────────────────────────────
cultivos = [
    {"nombre": "Maíz",  "ETo": 5.2, "Kc": 1.05, "area_ha": 40},
    {"nombre": "Arroz", "ETo": 6.0, "Kc": 1.20, "area_ha": 350},
    {"nombre": "Palma", "ETo": 5.5, "Kc": 1.10, "area_ha": 600},
    {"nombre": "Caña",  "ETo": 5.8, "Kc": 1.25, "area_ha": 800},
]

Q_diseño = 0.663   # m³/s para y = 0.80 m
verificar_abastecimiento(Q_diseño, cultivos)

CELDA 7 — Reto de diseño (opcional, nivel avanzado)

# Encontrar el tirante mínimo para abastecer TODOS los cultivos
# Usar un ciclo while e ir aumentando y en pasos de 0.01 m
# hasta que Q_canal >= Q_demanda_total

```


Consejos pedagógicos para el docente

El flujo de construcción guiado con Claude permite que el estudiante llegue a cada función con una comprensión clara del “¿para qué sirve este bloque?”. La dependencia entre funciones (calcular_areacalcular_caudalanalizar_canal) hace que el alumno experimente de forma natural la modularidad como ventaja real, no como abstracción. La celda final de reto (tirante mínimo con while) es un buen instrumento de evaluación diferenciada.