Buen día. Un gusto saludarte. He preparado para ti un caso integrado
de “Dosificación de Mezclas de Ingeniería” que articula
directamente el quehacer de la Ingeniería Civil (concreto) y la
Ingeniería Agroindustrial (formulación de productos), pues ambas
disciplinas resuelven el mismo problema matemático: combinar
materiales en proporciones estrictas para alcanzar una propiedad
objetivo, minimizando costos y validando restricciones. Es
ideal para consolidar el concepto de función, paso de parámetros,
retorno de múltiples valores y documentación
(docstrings).
En el diseño de mezclas de concreto hidráulico, el ingeniero civil debe garantizar que un volumen específico de concreto cumpla con una resistencia a la compresión característica (\(f'c\)), un asentamiento (workability) y una relación agua/cemento (a/c) máxima por durabilidad. El método del volumen absoluto exige que la suma de los volúmenes individuales de los materiales (cemento, agua, agregados, aire) sea igual al volumen total de la mezcla.
En la formulación de alimentos balanceados o pre-mezclas de fertilizantes NPK, el ingeniero agroindustrial debe combinar materias primas (maíz, soya, salvado; o fuentes de N, P, K) para alcanzar un contenido objetivo de nutriente (por ejemplo, 18 % de Proteína Bruta — PB), respetando restricciones de inclusión máxima (por ejemplo, soya ≤ 30 % por factores antinutricionales) y minimizando el costo de la fórmula.
| Concepto | Ecuación | Variables |
|---|---|---|
| Volumen absoluto (Civil) | \(V_i = \dfrac{m_i}{SG_i \cdot \rho_w}\) | \(m_i\): masa (kg), \(SG_i\): gravedad específica, \(\rho_w = 1000 \text{ kg/m}^3\) |
| Balance de volumen (Civil) | \(\sum V_i + V_{aire} = V_{total}\) | \(V_{aire}\): volumen de aire incluido (m³) |
| Relación a/c | \(\dfrac{a}{c} = \dfrac{m_{agua}}{m_{cemento}}\) | Debe ser ≤ 0.65 para ambientes moderados |
| Balance de nutriente (Agroindustrial) | \(\sum (m_i \cdot N_i) = M_{total} \cdot N_{obj}\) | \(N_i\): nutriente en ingrediente \(i\) (%), \(N_{obj}\): nutriente objetivo (%) |
| Costo total | \(C_T = \sum (m_i \cdot c_i)\) | \(c_i\): costo unitario ($/kg) |
| Costo unitario | \(C_U = \dfrac{C_T}{M_{total}}\) | Por kg de mezcla |
Se propone un sistema modular donde cada función tiene una responsabilidad única. Los estudiantes deben construirlas incrementalmente y luego integrarlas.
volumen_absoluto(masas, gravedades_especificas, densidad_agua=1000)[kg], lista de
SG [adimensional], densidad del agua.[m³] y
volumen total.dosificar_concreto(resistencia_fc, volumen_total, relacion_ac, materiales){"cemento_kg": x, "agua_kg": y, ...}.formular_por_nutriente(nutriente_objetivo, ingredientes, nutrientes_por_ingrediente, restricciones_max){"ingrediente": porcentaje, ...} y verificación del
nutriente resultante.calcular_costo(cantidades, costos_unitarios)(costo_total, costo_por_kg).validar_y_reportar(dosificacion, criterios){"relacion_ac_max": 0.65}).(es_valido: bool, mensajes: list).Instrucciones para tus estudiantes: “No copien código completo de internet. Usen a Kimi como tutor socrático. Copien y peguen estos prompts en una nueva conversación con Kimi y construyan su respuesta paso a paso.”
| Paso | Prompt sugerido para el estudiante | Lo que debe lograr |
|---|---|---|
| A | “En Python, escribe una función llamada
volumen_absoluto que reciba una lista de masas en kg y una
lista de gravedades específicas, y devuelva una lista de volúmenes en m³
usando la fórmula \(V = m / (SG \cdot
1000)\). Incluye un docstring y maneja el error si
las listas tienen distinto tamaño.” |
Función base con validación de entrada. |
| B | “Ahora necesito una función dosificar_concreto que
reciba \(f'c\) en MPa, volumen
total en m³, relación a/c, y un diccionario con las masas unitarias de
cemento, agua, arena y grava para 1 m³. Debe escalar proporcionalmente
al volumen pedido y retornar un diccionario con las masas finales. ¿Cómo
hago para que la función llame a volumen_absoluto
internamente?” |
Función intermedia que invoca a otra función. |
| C | “Kimi, ayúdame a validar dentro de
dosificar_concreto que la relación a/c calculada no supere
0.65. Si la supera, la función debe retornar un mensaje de advertencia
junto con los resultados. ¿Debería usar una tupla como retorno
(resultados, advertencia)?” |
Manejo de múltiples valores de retorno. |
| D | “Necesito la función formular_por_nutriente para
una mezcla de 3 ingredientes. El objetivo es 18 % de proteína. Los
ingredientes son: Maíz 9 %, Soya 44 %, Salvado 12 %. La soya no puede
pasar del 30 %. Explícame la lógica paso a paso y luego escribe la
función que retorne los porcentajes de cada ingrediente.” |
Aplicación agroindustrial con restricciones. |
| E | “Escribe una función calcular_costo que reciba dos
diccionarios: cantidades y precios unitarios. Debe retornar el costo
total y el costo por kilogramo. Luego, escribe una función
generar_reporte que reciba todos los resultados anteriores
e imprima un resumen formateado con f-strings.” |
Funciones de salida y presentación de resultados. |
| F | “Tengo un error: cuando paso un diccionario a mi función, los valores llegan como strings en lugar de números. ¿Cómo hago para validar los tipos de datos al inicio de cada función y convertirlos si es necesario?” | Depuración y robustez del código. |
Datos de entrada: - \(f'c = 21 \text{ MPa}\) - \(V_{total} = 2.5 \text{ m}^3\) - Relación a/c = \(0.55\) - Materiales de referencia para 1 m³: Cemento = 350 kg, Agua = 192.5 kg, Arena = 700 kg, Grava = 1050 kg - Gravedades específicas: Cemento = 3.15, Agua = 1.0, Arena = 2.65, Grava = 2.70 - Aire incluido = 2 % del volumen total (\(0.02 \text{ m}^3\) por cada m³ de concreto)
Resultados que debe devolver el código: | Material | Masa para 2.5 m³ (kg) | Volumen absoluto (m³) | |———-|———————-|———————–| | Cemento | 875.0 | 0.2778 | | Agua | 481.25 | 0.4813 | | Arena | 1750.0 | 0.6604 | | Grava | 2625.0 | 0.9722 | | Aire | — | 0.0500 | | TOTAL | 5731.25 | ≈ 2.4417 (ajuste por aire: ≈ 2.50) |
Datos de entrada: - Nutriente objetivo (PB) = 18 % - Ingredientes y PB: Maíz = 9 %, Soya = 44 %, Salvado = 12 % - Restricción: Soya ≤ 30 %
Resultados que debe devolver el código: | Ingrediente | Porcentaje en fórmula (%) | PB aportada (%) | |————-|—————————|—————–| | Maíz | 64.8 | \(64.8 \times 0.09 = 5.83\) | | Soya | 30.0 | \(30.0 \times 0.44 = 13.20\) | | Salvado | 5.2 | \(5.2 \times 0.12 = 0.62\) | | TOTAL | 100.0 | ≈ 18.0 ✓ |
Nota para el estudiante: Si su código no devuelve exactamente estos valores numéricos (dentro de una tolerancia de ±0.1 %), debe revisar la aritmética de sus funciones.
Copia la siguiente estructura de celdas en un Nuevo Notebook
de Google Colab (colab.research.google.com). El
notebook debe ser entregado con el enlace de compartir en modo
“Comentar” o “Leer”.
# 📐 Programación de Computadores con Python
## Módulo: Funciones y Modularidad
### Caso Integrado: Dosificación de Mezclas de Ingeniería
**Programas:** Ingeniería Civil & Agroindustrial
**Docente:** [Tu nombre]
**Estudiante:** [Nombre del estudiante]
**Fecha:** [Fecha]
---
### Objetivo de aprendizaje
Construir un sistema de funciones en Python que resuelva problemas reales de dosificación en Ingeniería Civil (concreto) y Agroindustrial (formulación), aplicando conceptos de paso de parámetros, retorno de múltiples valores, validación de entrada y documentación de código.
# Solo librerías estándar. No instalar nada externo.
import math
from typing import Dict, List, Tuple, Union
def volumen_absoluto(masas: List[float],
gravedades_especificas: List[float],
densidad_agua: float = 1000.0) -> Tuple[List[float], float]:
"""
Calcula el volumen absoluto de cada material en una mezcla.
Parámetros:
-----------
masas : list
Lista de masas en kilogramos [kg].
gravedades_especificas : list
Lista de gravedades específicas [adimensional].
densidad_agua : float, opcional
Densidad del agua en kg/m³. Por defecto 1000.0.
Retorna:
--------
tuple
(lista_de_volumenes, volumen_total)
"""
# TU CÓDIGO AQUÍ
pass
# Datos de validación Civil
masas_test = [350, 192.5, 700, 1050] # cemento, agua, arena, grava
sg_test = [3.15, 1.0, 2.65, 2.70]
vols, total = volumen_absoluto(masas_test, sg_test)
print("Volúmenes individuales:", vols)
print("Volumen total:", total)
# Resultado esperado aproximado: [0.1111, 0.1925, 0.2642, 0.3889], total ≈ 0.9567 m³ para 1 m³ de material seco
def dosificar_concreto(resistencia_fc: float,
volumen_total: float,
relacion_ac: float,
materiales_referencia: Dict[str, float],
sg_materiales: Dict[str, float],
porcentaje_aire: float = 0.02) -> Tuple[Dict[str, float], str]:
"""
Escala una dosificación de concreto a un volumen dado y valida restricciones.
"""
# TU CÓDIGO AQUÍ
pass
# Usar los datos del Caso de Validación A (sección 4 de este documento)
# Imprimir el diccionario resultante y verificar que la relación a/c es 0.55
def formular_por_nutriente(nutriente_objetivo: float,
ingredientes: List[str],
nutrientes_por_ingrediente: List[float],
restricciones_max: List[float]) -> Tuple[Dict[str, float], float]:
"""
Calcula porcentajes de ingredientes para alcanzar un nutriente objetivo.
"""
# TU CÓDIGO AQUÍ
pass
# Usar los datos del Caso de Validación B (sección 4 de este documento)
# Verificar que la proteína resultante sea ≈ 18 % y la soya ≤ 30 %
def calcular_costo(cantidades: Dict[str, float],
costos_unitarios: Dict[str, float]) -> Tuple[float, float]:
"""Retorna (costo_total, costo_por_kg)."""
pass
def generar_reporte(dosificacion: Dict, costos: Tuple[float, float],
validacion: Tuple[bool, List[str]]) -> None:
"""Imprime un informe técnico formateado."""
pass
# Ejecutar el caso Civil completo: calcular dosificación, costo y reporte
# Ejecutar el caso Agroindustrial completo: calcular formulación, costo y reporte
## 🧠 Reflexión final (responder en esta celda de texto)
1. ¿Qué ventaja tiene descomponer el problema en funciones individuales versus resolver todo en un solo bloque de código?
2. ¿Por qué es útil que una función retorne una tupla `(resultado, advertencia)` en lugar de solo el resultado?
3. Si el cliente (ingeniero civil) pide cambiar la relación a/c máxima de 0.65 a 0.60, ¿en qué parte del código haces el cambio y por qué no necesitas modificar todo el script?
4. ¿Qué dificultad tuviste al interactuar con Kimi y cómo la resolviste?
docstrings.Si deseas, puedo generar ahora el código de solución
completo (para tu llave de respuestas) o una plantilla
de Notebook .ipynb lista para subir a Colab. Solo
indícame y lo preparo.