Ver demo en vivo — corre simulaciones de vuelo reales desde el navegador, sin instalar nada.
La demo corre en el tier gratuito de Render: si nadie la visitó en los últimos 15 minutos, la primera carga puede tardar 30-60 segundos mientras el servicio "despierta".
Simulador de vuelo de 6 grados de libertad (6DOF) para un cohete de ~10 kg, con motor de simulación en Fortran y una capa de análisis estadístico en Python. El proyecto caracteriza la dispersión de trayectoria de vuelo bajo incertidumbre en condiciones de lanzamiento, viento y parámetros del vehículo, siguiendo y extendiendo la metodología de Box, Bishop & Hunt (2011).
Responder tres preguntas concretas mediante una campaña Monte Carlo de 5000 corridas:
- ¿Qué tan dispersa es la trayectoria de vuelo? — caracterizado mediante elipses de confianza de Hotelling T².
- ¿Qué parámetros de entrada explican esa dispersión? — análisis de sensibilidad con coeficientes de regresión estandarizados (β*) y correlación de Spearman.
- ¿En qué régimen aerodinámico vuela el cohete? — determinación del espacio de operación en Reynolds y Mach, como punto de partida para una validación posterior por CFD en la región donde el modelo aerodinámico lineal deja de ser válido.
- Integración numérica RKF45 (Runge-Kutta-Fehlberg de paso adaptativo)
- Actitud representada con cuaterniones (sin singularidades de gimbal lock)
- Modelo aerodinámico linealizado de Barrowman
- Viento modelado como proceso estocástico de Ornstein-Uhlenbeck bidireccional, con ruido gaussiano vía generador Taus88
Dashboard web que envuelve el simulador Fortran, sin necesidad de tocar la terminal:
- Modo determinista: corre una trayectoria individual con los parámetros elegidos en la barra lateral.
- Modo Monte Carlo: corre N trayectorias con dispersión estadística en geometría, masas y condiciones iniciales.
- Trayectoria 3D con conos de orientación del vehículo y, en modo Monte Carlo, la elipse de dispersión al 95% proyectada sobre el punto de aterrizaje.
- Animación sincronizada del vuelo completo: escena 3D + paneles 2D de ángulo de ataque, velocidad, viento y velocidad angular, con indicador de apogeo.
- Landing footprint: dispersión de puntos de impacto coloreada por la variable de interés (viento, ángulo inicial, etc.), con elipse de confianza al 95%.
La app está containerizada con Docker (ver Dockerfile), lo que permite correrla de forma reproducible en cualquier sistema sin depender de un entorno conda preinstalado — es también como se despliega la demo en vivo.
Opción A — con Docker (recomendado, no requiere conda ni gfortran instalados):
docker build -t cohetefa05-mc --load .
docker run -p 8501:8501 cohetefa05-mcAbrir http://localhost:8501.
Opción B — con conda (requiere gfortran instalado):
conda env create -f environment.yml
conda activate cohetefa05-mc
cd src/fortran && make && cd ../..
streamlit run app/streamlit_app.pyNotebook principal: notebooks/01_exploracion_montecarlo.ipynb,
apoyado en funciones puras de src/analysis/utils.py:
- Carga y parseo de datos de campaña Monte Carlo
- Cálculo de elipses de confianza (Hotelling T², no gaussiana ingenua)
- Regresión estandarizada para identificar parámetros dominantes
- Identificación del espacio Reynolds-Mach relevante para CFD
Monte_Carlo_Flight_Sensitivity/
├── app/ # Dashboard interactivo (Streamlit)
│ ├── streamlit_app.py
│ └── core/ # Runner de Fortran, parsers, visualizaciones
├── notebooks/
│ └── 01_exploracion_montecarlo.ipynb # Notebook principal de análisis
├── src/
│ ├── fortran/ # Motor de simulación 6DOF
│ └── analysis/ # Funciones de análisis (Python)
├── data/
│ └── sample/ # Datos de muestra (N=5000 corridas)
├── docs/
│ ├── metodologia.md # Metodología científica detallada
│ └── bitacora_debugging.md # Bitácora de bugs encontrados y resueltos
├── tests/ # Tests de regresión
├── Dockerfile # Build reproducible de la app (multi-stage)
├── requirements-docker.txt # Dependencias Python minimas para el contenedor
├── .dockerignore
└── environment.yml # Especificación del entorno conda (desarrollo/notebook)
Requiere conda (Anaconda o Miniconda).
conda env create -f environment.yml
conda activate cohetefa05-mcRegistrar el entorno como kernel de Jupyter:
python -m ipykernel install --user --name cohetefa05-mc --display-name "Python (cohetefa05-mc)"Abrir el notebook y seleccionar el kernel "Python (cohetefa05-mc)":
jupyter labEl kernel muere silenciosamente al graficar con matplotlib, sin traceback de Python.
Causa: conflicto entre los runtimes de OpenMP de Intel MKL (usado por numpy/scipy) y
LLVM OpenMP (usado internamente por matplotlib/freetype) al cargarse ambos en el mismo
proceso — Windows termina el proceso sin dejar registro de error.
Solución: fijar la variable de entorno KMP_DUPLICATE_LIB_OK=TRUE. Si el problema persiste
tras crear el entorno con environment.yml, edita el archivo kernel.json del kernel
registrado (normalmente en %APPDATA%\jupyter\kernels\cohetefa05-mc\kernel.json) y agrega:
"env": {
"KMP_DUPLICATE_LIB_OK": "TRUE"
}Los datos de muestra en data/sample/ ya están incluidos en el repositorio — no es
necesario compilar el Fortran para correr el notebook. Para regenerarlos:
cd src/fortran
make runEl Makefile detecta el sistema operativo automáticamente y genera el binario correspondiente
(cohetefa05.exe en Windows, cohetefa05 en Linux/Mac).
Ver data/README.md para el detalle de columnas de cada archivo.
La metodología completa (justificación de las elipses de Hotelling, interpretación de las
poblaciones de crash, y el espacio Re-Ma para CFD) está documentada en
docs/metodologia.md.
Aldo Heraclio de la Isla — estudiante de maestría en Física, Universidad Autónoma de Zacatecas (UAZ). Este proyecto forma parte de un portafolio técnico orientado a roles de análisis y ciencia de datos.
Ver LICENSE.