24.1 El tiempo en un modelo matemático
En una ecuación como x(t)=x₀+vt, la variable t puede tomar cualquier valor real dentro del intervalo estudiado: 1 s, 1,5 s, 1,501 s y todos los valores intermedios. Decimos que el modelo utiliza tiempo continuo.
La continuidad no significa que podamos calcular infinitos estados. Significa que el modelo define, al menos idealmente, un estado para cada instante. Podemos consultar la función en cualquier t que nos interese.
24.2 El tiempo en una computadora
Una computadora ejecuta operaciones una tras otra y almacena una cantidad finita de estados. Para simular elegimos ciertos instantes:
Esta secuencia constituye un tiempo discreto. El programa calcula el estado inicial, avanza al siguiente instante y repite. Entre dos estados almacenados puede existir movimiento físico, aunque el programa no guarde cada instante intermedio.
Discreto no significa necesariamente entero. Los instantes pueden ser 0 s, 0,02 s, 0,04 s y así sucesivamente.
24.3 El paso temporal Δt
La separación entre dos instantes consecutivos es el paso temporal:
Si todos los pasos tienen igual duración, usamos un paso fijo Δt y los instantes cumplen:
El índice n es un contador sin unidad; Δt se mide en segundos y tₙ también. Por ejemplo, con t₀=0 y Δt=0,25 s, el estado número 8 pertenece a t₈=2 s.
24.4 Índice de paso e instante físico
El índice y el tiempo no son intercambiables. n=10 significa “décimo paso”; solo podemos convertirlo a segundos si conocemos t₀ y Δt. Si cambiamos el paso, el mismo índice representa otro instante.
| Índice n | Cálculo | Instante |
|---|---|---|
| 0 | 0 + 0·0,2 | 0 s |
| 1 | 0 + 1·0,2 | 0,2 s |
| 2 | 0 + 2·0,2 | 0,4 s |
| 10 | 0 + 10·0,2 | 2 s |
Comenzar con n=0 resulta conveniente porque el primer elemento de un arreglo también usa índice cero y representa naturalmente el estado inicial.
24.5 Frecuencia de actualización
Otra forma de expresar la resolución temporal es indicar cuántos pasos se realizan por segundo. La frecuencia f y el paso fijo se relacionan mediante:
Δt = 1/f
Un paso de 0,02 s equivale a 50 actualizaciones por segundo; 60 actualizaciones por segundo equivalen aproximadamente a 0,0167 s por paso. La frecuencia se expresa en hertz, donde 1 Hz = 1/s.
24.6 Muestrear una solución conocida
Si conocemos una función exacta estado(t), discretizar puede consistir simplemente en evaluarla en los instantes seleccionados. Esto es muestreo: la función continua no se modifica; elegimos una cantidad finita de sus puntos.
function posicionMRU(tiempoS, posicionInicialM, velocidadMps) {
return posicionInicialM + velocidadMps * tiempoS;
}
const pasoS = 0.25;
const muestras = [];
for (let n = 0; n <= 8; n++) {
const tiempoS = n * pasoS;
muestras.push({
paso: n,
tiempoS,
posicionM: posicionMRU(tiempoS, 3, 2)
});
}
console.log(muestras);Los puntos obtenidos son exactos para esa función salvo el redondeo numérico. Que estén separados no introduce por sí mismo un error en los valores muestreados.
24.7 Muestreo no es integración numérica
Estas tres operaciones pueden ocurrir con frecuencias diferentes. Una simulación puede calcular física 100 veces por segundo, dibujar 60 imágenes por segundo y registrar datos solo 10 veces por segundo.
En el próximo tema construiremos estados mediante Euler. Allí Δt influirá no solo en cuántos puntos vemos, sino también en el error de la aproximación.
24.8 Paso pequeño y paso grande
Reducir Δt produce más estados para un mismo intervalo y permite representar cambios rápidos con mayor detalle. A cambio, exige más cálculos, memoria si guardamos la historia y comprobaciones de eventos más frecuentes.
Un paso grande reduce el trabajo, pero puede ocultar cambios entre muestras. Un móvil podría aparecer antes de una pared en un estado y después de ella en el siguiente sin que ningún estado almacenado coincida con el contacto.
Simular 10 s con Δt=0,1 s requiere 100 avances; con Δt=0,001 s requiere 10 000. La elección es un compromiso relacionado con la escala temporal más rápida del problema.
24.9 Actividad interactiva: continuo frente a discreto
La curva azul representa x(t)=A·sen(2πft). Los puntos naranjas son las únicas muestras disponibles con el Δt elegido y la línea verde une esas muestras. Aumentá el paso y observá cómo una oscilación suave puede parecer más lenta, deformada o incluso inmóvil.
Laboratorio de muestreo temporal
La línea que une muestras es una reconstrucción visual; no contiene los estados intermedios reales.
24.10 Pérdida de información y aliasing
Si muestreamos un cambio periódico con muy pocos puntos, diferentes movimientos continuos pueden producir la misma secuencia discreta. Este fenómeno se denomina aliasing. Por ejemplo, si tomamos una muestra exactamente una vez por período y siempre en la misma fase, todas las posiciones pueden ser iguales: el móvil aparentará estar quieto.
Para reconstruir una señal sinusoidal ideal se necesita una frecuencia de muestreo mayor que el doble de su frecuencia. En una simulación práctica suelen requerirse bastantes más muestras por ciclo para describir bien la forma, estimar velocidades y detectar eventos.
El criterio del doble es un límite teórico de reconstrucción, no una recomendación universal para elegir el paso de un integrador físico.
24.11 Detectar eventos entre pasos
Supongamos que un móvil pasa de x=9 m a x=13 m y hay una pared en x=10 m. Comprobar solamente x===10 no detectará el cruce. Debemos analizar el intervalo entre estados.
function cruzoNivel(posicionAnterior, posicionActual, nivel) {
const ladoAnterior = posicionAnterior - nivel;
const ladoActual = posicionActual - nivel;
return ladoAnterior === 0
|| ladoActual === 0
|| ladoAnterior * ladoActual < 0;
}
console.log(cruzoNivel(9, 13, 10));
console.log(cruzoNivel(4, 7, 10));Detectar el cruce no determina todavía el instante exacto ni la respuesta física. Con velocidad constante podemos interpolar; con trayectorias complejas puede ser necesario resolver una ecuación o subdividir el paso.
24.12 Estimar el instante de cruce
Si suponemos que x cambia linealmente entre dos muestras, calculamos qué fracción del segmento separa la posición anterior del nivel:
tcruce = t₀ + α(t₁ − t₀)
function instanteDeCruceLineal(anterior, actual, nivelM) {
const cambioM = actual.posicionM - anterior.posicionM;
if (cambioM === 0) return null;
const fraccion = (nivelM - anterior.posicionM) / cambioM;
if (fraccion < 0 || fraccion > 1) return null;
return anterior.tiempoS
+ fraccion * (actual.tiempoS - anterior.tiempoS);
}
console.log(instanteDeCruceLineal(
{ tiempoS: 2, posicionM: 9 },
{ tiempoS: 2.5, posicionM: 13 },
10
));El resultado es 2,125 s. La estimación es exacta para movimiento uniforme dentro del intervalo y aproximada si la trayectoria se curva.
24.13 Construir instantes sin acumular el redondeo
Sumar repetidamente un decimal binario puede acumular pequeñas diferencias. En JavaScript, diez sumas de 0,1 no siempre producen exactamente 1. Para una grilla de paso fijo conviene obtener cada instante desde el índice:
const pasoS = 0.1;
let tiempoAcumuladoS = 0;
for (let n = 1; n <= 10; n++) {
tiempoAcumuladoS += pasoS;
}
const tiempoDesdeIndiceS = 10 * pasoS;
console.log(tiempoAcumuladoS);
console.log(tiempoDesdeIndiceS);La multiplicación también usa coma flotante, pero evita que el error de una suma pase a la siguiente. Para comparar instantes calculados utilizamos una tolerancia o trabajamos con un contador entero de pasos.
24.14 No exceder la duración solicitada
Si la duración no es múltiplo de Δt, un bucle puede terminar antes o avanzar más allá. Debemos decidir si aceptamos solo pasos completos o realizamos un último paso más corto.
function dividirIntervalo(duracionS, pasoMaximoS) {
if (duracionS < 0 || pasoMaximoS <= 0) {
throw new RangeError("Duración y paso no son válidos");
}
const pasos = [];
let transcurridoS = 0;
while (transcurridoS < duracionS) {
const restanteS = duracionS - transcurridoS;
const deltaS = Math.min(pasoMaximoS, restanteS);
pasos.push(deltaS);
transcurridoS += deltaS;
}
return pasos;
}
console.log(dividirIntervalo(1, 0.3));El resultado contiene tres pasos de 0,3 s y uno cercano a 0,1 s. Este último paso variable llega al instante final sin sobrepasarlo.
24.15 Segundos y milisegundos en JavaScript
Las ecuaciones del curso usan segundos, pero muchas API del navegador entregan milisegundos. Antes de actualizar el estado hay que convertir:
function segundosEntre(marcaAnteriorMs, marcaActualMs) {
return (marcaActualMs - marcaAnteriorMs) / 1000;
}
const deltaTiempoS = segundosEntre(1250, 1270);
const velocidadMps = 5;
const desplazamientoM = velocidadMps * deltaTiempoS;
console.log(deltaTiempoS);
console.log(desplazamientoM);Veinte milisegundos son 0,02 s, por lo que el desplazamiento es 0,1 m. Usar 20 directamente en una ecuación expresada en segundos produciría un error por un factor de mil.
24.16 Paso fijo y paso variable
Con paso fijo, todos los avances físicos usan el mismo Δt. Esto vuelve reproducible la secuencia y simplifica pruebas. Con paso variable, cada avance usa el tiempo realmente transcurrido u otra duración cambiante.
| Estrategia | Ventaja | Precaución |
|---|---|---|
| Paso fijo | Resultados más previsibles y repetibles. | Debe coordinarse con el ritmo de presentación. |
| Paso variable | Sigue directamente el tiempo transcurrido. | Los cambios bruscos de Δt alteran precisión y estabilidad. |
| Subpasos | Divide intervalos largos en avances controlados. | Aumenta el costo cuando el programa se retrasa. |
Más adelante estudiaremos el bucle de tiempo real, el acumulador y la interpolación visual. En este tema alcanza con distinguir la estrategia temporal del modelo físico.
24.17 Elegir un primer Δt
No existe un paso universal. Debe ser suficientemente pequeño respecto del fenómeno más rápido que queremos representar y de la distancia mínima que no podemos atravesar sin detectarla.
- Identificar el menor período o intervalo relevante del movimiento.
- Estimar la mayor velocidad y cuánto recorrería el móvil durante un paso.
- Considerar el tamaño de obstáculos y regiones de detección.
- Comparar resultados al reducir Δt; si cambian demasiado, el paso original no es adecuado.
- Medir el costo computacional con la cantidad real de móviles y reglas.
Elegir Δt es una decisión del modelo y del algoritmo, no solamente una preferencia visual.
24.18 Validar parámetros temporales
function crearRelojDiscreto({ inicioS = 0, pasoS }) {
if (!Number.isFinite(inicioS)) {
throw new TypeError("inicioS debe ser finito");
}
if (!Number.isFinite(pasoS) || pasoS <= 0) {
throw new RangeError("pasoS debe ser finito y positivo");
}
return {
inicioS,
pasoS,
instante: n => {
if (!Number.isInteger(n) || n < 0) {
throw new RangeError("n debe ser un entero no negativo");
}
return inicioS + n * pasoS;
}
};
}
const reloj = crearRelojDiscreto({ inicioS: 1, pasoS: 0.25 });
console.log(reloj.instante(0));
console.log(reloj.instante(8));Un paso cero impediría avanzar; uno negativo invertiría la dirección temporal sin que el resto del programa necesariamente lo admita. Validar al crear el reloj evita bucles infinitos y estados incoherentes.
24.19 Errores frecuentes
- Confundir n con segundos: el índice solo se convierte en tiempo mediante t₀ y Δt.
- Mezclar milisegundos y segundos: convertir las marcas temporales antes de usarlas en ecuaciones físicas.
- Suponer que dibujar equivale a simular: cálculo, renderizado y registro pueden tener frecuencias distintas.
- Buscar un evento con igualdad exacta: comprobar cruces entre estados consecutivos.
- Elegir Δt por apariencia solamente: también afecta detección, costo y, con integradores, precisión.
- Sumar Δt indefinidamente sin considerar redondeo: conservar el contador entero cuando sea posible.
- Incluir dos veces el extremo: definir claramente si el intervalo es cerrado o semiabierto.
- Creer que más muestras crean información exacta: un método aproximado también posee error numérico.
24.20 Ejercicios propuestos
- Escribí los primeros seis instantes de una simulación que empieza en 2 s y usa Δt=0,5 s.
- Convertí 120 actualizaciones por segundo a paso temporal.
- ¿Cuántos avances completos requiere simular 8 s con Δt=0,04 s?
- Un móvil viaja a 30 m/s. ¿Qué distancia recorre por paso con Δt=0,1 s y con Δt=0,01 s?
- Explicá la diferencia entre muestrear
x(t)y obtener x mediante Euler. - Un objeto pasa de x=4 m en t=1 s a x=10 m en t=1,3 s. Estimá linealmente cuándo cruzó x=7 m.
- Una API informa 16,7 ms entre imágenes. Convertí el intervalo a segundos y calculá su frecuencia aproximada.
- Proponé una prueba para la función
crearRelojDiscreto.
Ver soluciones y explicaciones
- 2; 2,5; 3; 3,5; 4 y 4,5 s, correspondientes a n=0 hasta n=5.
Δt=1/120 s≈0,00833 s, es decir, 8,33 ms.8/0,04=200avances.- 3 m por paso y 0,3 m por paso, respectivamente.
- Muestrear evalúa una solución ya conocida. Euler construye una aproximación del estado siguiente a partir del estado actual y sus tasas de cambio.
- El nivel está a la mitad del recorrido entre 4 y 10 m; se cruza a la mitad del intervalo:
t=1,15 s. 0,0167 sy aproximadamente59,9 Hz.- Comprobar que con inicio 1 s y paso 0,25 s,
instante(8)devuelve 3 s; también verificar que rechaza paso cero e índices negativos.
24.21 Ideas para recordar
- El tiempo continuo admite un estado para cualquier instante del intervalo.
- Una simulación discreta trabaja con una secuencia finita de instantes.
- Con paso fijo,
tₙ=t₀+nΔty la frecuencia es1/Δt. - Muestrear una solución exacta no es lo mismo que integrarla numéricamente.
- Un Δt menor representa cambios rápidos con más detalle, pero exige más trabajo.
- Los eventos pueden ocurrir entre pasos y deben detectarse sobre intervalos.
- El contador de paso ayuda a controlar el redondeo y reproducir la simulación.
- Segundos y milisegundos deben convertirse explícitamente.
En el próximo tema aprenderemos a actualizar posición y velocidad con el método de Euler.