30. Proyecto integrador: simular y analizar una caída libre con JavaScript

Construí una simulación completa desde el modelo físico hasta su verificación: definí el sistema, actualizá el estado, detectá el suelo y compará el resultado numérico con la solución exacta.

30.1 Objetivo y alcance del proyecto

Simularemos un objeto soltado desde una altura conocida. El programa calculará su altura y velocidad mediante pasos de Euler, detendrá la evolución al tocar el suelo y mostrará el error frente a la solución exacta.

El modelo usa movimiento vertical en una dimensión, gravedad uniforme y ausencia de resistencia del aire. El impacto termina el experimento; no se modelan rebote ni deformación.

Este alcance acotado permite integrar los conceptos del curso sin ocultar las decisiones físicas detrás del código.

30.2 Definir sistema, eje y unidades

El sistema es el objeto. Elegimos altura y positiva hacia arriba; el suelo está en y = 0. La aceleración es −g porque apunta hacia abajo.

  • altura en metros;
  • velocidad en m/s;
  • aceleración en m/s²;
  • masa en kg;
  • tiempo y dt en segundos.

La masa permite calcular el peso y la energía, aunque no modifica la aceleración ideal de caída.

30.3 Condiciones iniciales y parámetros

El estado inicial contiene tiempo 0, altura seleccionada y velocidad 0. Los parámetros contienen masa, gravedad y paso temporal. Separarlos facilita reiniciar y repetir experimentos.

function crearExperimento(altura, masa, gravedad, dt) {
  return {
    estado: { tiempo: 0, altura, velocidad: 0, terminado: false },
    parametros: { masa, gravedad, dt }
  };
}

const experimento = crearExperimento(20, 2, 9.8, 0.1);
console.log(experimento.estado.altura + ' m');
console.log(experimento.parametros.dt + ' s');

30.4 Modelo exacto de referencia

Para un objeto soltado, la solución exacta antes del impacto es:

y(t) = h − ½gt²
v(t) = −gt
timpacto = √(2h/g)

Estas ecuaciones servirán para verificar el algoritmo numérico. No las usaremos para actualizar el objeto paso a paso, sino como resultado de referencia.

Desde 20 m con g = 9,8 m/s², el impacto ideal ocurre aproximadamente a los 2,02 s.

30.5 Actualización con Euler semiexplícito

En cada paso calculamos aceleración, actualizamos velocidad y luego altura:

v ← v − g·dt
y ← y + v·dt
t ← t + dt

El orden corresponde a Euler semiexplícito. La aproximación suele llegar un poco antes al suelo porque utiliza la velocidad nueva durante todo el intervalo.

La fuerza peso es −mg y al dividir por masa obtenemos −g. Mantener este razonamiento en el diseño conecta fuerzas y cinemática.

30.6 Detectar y resolver el impacto

Después de un paso, la altura puede ser negativa. Debemos detectar el cruce, fijar y = 0, marcar el experimento como terminado y registrar el motivo.

Una versión precisa interpola el instante dentro del último paso. En este proyecto conservaremos el tiempo numérico del paso y mostraremos su error frente al instante exacto.

si y ≤ 0 → y = 0, terminado = true

Esta regla es un límite del mundo simulado, no una consecuencia automática de Euler.

30.7 Implementar el paso físico

function avanzar(estado, gravedad, dt) {
  if (estado.terminado) return;
  estado.velocidad -= gravedad * dt;
  estado.altura += estado.velocidad * dt;
  estado.tiempo += dt;
  if (estado.altura <= 0) {
    estado.altura = 0;
    estado.terminado = true;
  }
}

const estado = { altura: 10, velocidad: 0, tiempo: 0, terminado: false };
avanzar(estado, 10, 0.1);
console.log(estado.velocidad.toFixed(1) + ' m/s');
console.log(estado.altura.toFixed(1) + ' m');

Después del primer paso, la velocidad es −1,0 m/s y la altura 9,9 m.

30.8 Proyecto interactivo

Ejecutá la caída, avanzá un paso o seleccioná parámetros. La vista muestra el objeto, la trayectoria exacta y un gráfico de altura contra tiempo.

Los resultados aparecen debajo.
Amarillo: objeto numérico. Celeste: curva exacta. Rosa: muestras de Euler.
Tiempo0,00 s
Altura20,00 m
Velocidad0,00 m/s
Energía mecánica392,00 J
Error temporal

Experimento preparado.

30.9 Registrar y analizar resultados

Guardamos una muestra después de cada paso. Con ese historial podemos dibujar la trayectoria, hallar máximos, exportar datos y detectar cuándo apareció un error.

Registrar demasiados puntos consume memoria; registrar muy pocos oculta cambios. Para este proyecto, una muestra por paso mantiene una relación directa con dt.

Además del estado, conviene guardar los parámetros y la versión del algoritmo para poder reproducir el experimento.

30.10 Verificar el proyecto

Las pruebas principales son: t = 0 reproduce la altura inicial; la velocidad se vuelve negativa; la altura no atraviesa el suelo; la masa no cambia el tiempo de caída; reducir dt disminuye el error temporal.

También podemos comprobar energía antes del impacto. La solución exacta conserva E = mgh + ½mv². Euler introduce un error que debe reducirse al disminuir dt.

Si una prueba falla, aislamos fórmula, unidades, orden de actualización y criterio de impacto antes de modificar varios componentes.

30.11 Desafío integrador

Para h = 19,6 m, g = 9,8 m/s² y masa 3 kg, calculá tiempo exacto, velocidad de impacto y energía mecánica inicial.

Ver solución y código

El tiempo es 2 s; la velocidad es −19,6 m/s; la energía inicial es 3·9,8·19,6 = 576,24 J.

const altura = 19.6, gravedad = 9.8, masa = 3;
const tiempo = Math.sqrt(2 * altura / gravedad);
const velocidad = -gravedad * tiempo;
const energia = masa * gravedad * altura;
console.log(tiempo.toFixed(1) + ' s');
console.log(velocidad.toFixed(1) + ' m/s');
console.log(energia.toFixed(2) + ' J');

30.12 Cierre del curso

El proyecto reunió magnitudes, unidades, vectores con signo, cinemática, fuerzas, energía, objetos JavaScript, pasos temporales, Euler, límites y verificación.

  • Definí primero el sistema y sus supuestos.
  • Separá estado, parámetros, física y dibujo.
  • Usá unidades coherentes y nombres claros.
  • Tratà límites y eventos como reglas explícitas.
  • Compará con soluciones conocidas y varios dt.
  • Documentá qué representa y qué omite el modelo.

Esta base permite avanzar hacia los cursos específicos de física para programación y desarrollar simulaciones con más dimensiones, fuerzas e interacciones.