Fundamentos · Tema 06

Procesos continuos y pasos discretos

Cómo representar en una computadora fenómenos que evolucionan continuamente mediante muestras, intervalos y actualizaciones separadas, y qué se gana o se pierde al hacerlo.

01 · Punto de partida

El mundo no espera al próximo ciclo del programa

La temperatura de una habitación, la posición de un vehículo y la carga de una batería pueden cambiar en cualquier instante. Entre las 10:00:00 y las 10:00:01 existen, matemáticamente, infinitos instantes intermedios. Decimos que el tiempo se modela como una variable continua.

Una computadora, en cambio, ejecuta una cantidad finita de operaciones. Un sensor entrega lecturas en ciertos momentos, una animación actualiza la pantalla cuadro por cuadro y una simulación avanza mediante iteraciones. El programa observa y calcula una sucesión discreta de estados.

Esta diferencia plantea preguntas fundamentales:

  • ¿Qué significa que una magnitud sea continua?
  • ¿Cómo elegimos los instantes que representará el programa?
  • ¿Qué información puede ocultarse entre dos muestras?
  • ¿Cómo influye el tamaño del paso en el error y en el costo?
  • ¿Cuándo una aproximación discreta es suficientemente buena?

02 · Dos formas de representar

Continuo no es lo mismo que discreto

Una variable continua puede tomar cualquier valor real dentro de un intervalo. Si t representa tiempo entre 0 y 1 segundo, admite valores como 0.2, 0.203 o √2/2. No hay un “siguiente” número real inmediato después de uno dado.

Una representación discreta selecciona elementos separados y enumerables. Por ejemplo, con un paso de 0.25 s usamos los instantes 0, 0.25, 0.50, 0.75 y 1.

Contraste entre un modelo continuo y una representación discreta.
AspectoContinuoDiscreto
Valores posiblesTodos los del intervalo.Una colección separada de valores.
Ejemplo temporalCualquier instante t.t₀, t₁, t₂, …
RepresentaciónFunción o curva ideal.Arreglo, tabla o secuencia.
Tratamiento computacionalNo puede recorrerse punto por punto.Puede procesarse con un ciclo.

“Continuo” describe los valores permitidos por el modelo, no obliga a que el gráfico sea suave. Una función continua es una noción más específica que estudiaremos después. Del mismo modo, una variable discreta no tiene por qué usar números enteros: 0, 0.25 y 0.50 forman una secuencia discreta.

03 · Del intervalo a una secuencia

Discretizar un proceso

Supongamos que queremos estudiar una función y = f(t) desde un tiempo inicial t₀ hasta un tiempo final T. Elegimos un paso positivo Δt y construimos:

tₙ = t₀ + n · Δt,   n = 0, 1, 2, …

En cada instante calculamos o medimos yₙ = f(tₙ). El subíndice n no representa tiempo físico: es el índice entero de la muestra. Así distinguimos dos avances:

t

Tiempo del modelo

Puede variar continuamente y conserva su unidad: segundos, horas o días.

n

Índice del algoritmo

Toma valores enteros e identifica una posición en la secuencia.

Δt

Tamaño del paso

Indica cuánto tiempo del modelo separa dos estados consecutivos.

Si t₀ = 0 y Δt = 0.2 s, la muestra de índice 3 corresponde a t₃ = 0 + 3 · 0.2 = 0.6 s. Mantener separados índice, instante y unidad evita muchos errores de implementación.

04 · Contar antes de iterar

Intervalos, pasos y puntos

Al dividir un intervalo de longitud T − t₀ en pasos iguales, la cantidad ideal de pasos es:

N = (T − t₀) / Δt

Si N es entero, se generan N + 1 puntos cuando incluimos ambos extremos. Entre 0 y 1 con paso 0.25 hay cuatro pasos, pero cinco puntos:

0 → 0.25 → 0.50 → 0.75 → 1

Cuando la longitud no es múltiplo del paso, el extremo final no coincide con la grilla. Entre 0 y 1 con paso 0.3 aparecen 0, 0.3, 0.6 y 0.9; otro paso completo llegaría a 1.2. El programa debe adoptar una política explícita: detenerse antes, acortar el último paso o permitir que se supere el extremo.

Una construcción robusta de la grilla

function crearGrilla(inicio, fin, paso) {
  if (![inicio, fin, paso].every(Number.isFinite)) {
    throw new TypeError("Los argumentos deben ser finitos");
  }
  if (paso <= 0 || fin < inicio) {
    throw new RangeError("Se requiere fin ≥ inicio y paso > 0");
  }

  const cantidad = Math.floor((fin - inicio) / paso);
  const tiempos = Array.from(
    { length: cantidad + 1 },
    (_, indice) => inicio + indice * paso
  );

  // Incluye el extremo con un último paso posiblemente más corto.
  if (tiempos.at(-1) < fin) tiempos.push(fin);
  return tiempos;
}

console.log(crearGrilla(0, 1, 0.3));
// [0, 0.3, 0.6, 0.8999999999999999, 1]

La aparición de 0.8999999999999999 anticipa otro asunto: los números decimales tampoco siempre se representan exactamente en la computadora. Lo estudiaremos con detalle en el tema 15.

05 · Observar en instantes separados

Muestrear no es observar todo

Tomar muestras significa registrar el valor de un proceso en instantes seleccionados. Si un sensor mide una temperatura cada minuto, la tabla contiene lo observado en esos minutos, pero no determina por sí sola qué ocurrió entre dos lecturas.

Consideremos f(t) = sen(2πt). En todos los tiempos enteros su valor es cero:

f(0) = f(1) = f(2) = f(3) = 0

Una medición por segundo haría parecer que la señal permanece constante, aunque entre las muestras completa una oscilación. Este fenómeno se conoce como aliasing: diferentes comportamientos continuos producen las mismas muestras y se vuelven indistinguibles con esa grilla.

La frecuencia de muestreo debe elegirse según la rapidez con la que puede cambiar el fenómeno. Un valor diario puede ser suficiente para una tendencia climática y completamente inútil para capturar una señal de audio.

06 · Evolución por reglas

Actualizar un estado paso a paso

A veces conocemos directamente f(t) y solo necesitamos evaluarla. En otros problemas no conocemos la posición futura mediante una fórmula cerrada, pero sí una regla de cambio. Si un objeto tiene velocidad constante v, durante un paso Δt su desplazamiento es v · Δt:

posición siguiente = posición actual + velocidad · Δt

Con posición inicial 10 m, velocidad 3 m/s y paso 0.5 s, cada actualización agrega 1.5 m. La secuencia es 10, 11.5, 13, 14.5… En este caso la regla discreta coincide exactamente con el modelo lineal continuo.

function simularMovimiento(posicionInicial, velocidad, duracion, paso) {
  const estados = [];
  let posicion = posicionInicial;

  for (let tiempo = 0; tiempo <= duracion; tiempo += paso) {
    estados.push({ tiempo, posicion });
    posicion += velocidad * paso;
  }
  return estados;
}

console.log(simularMovimiento(10, 3, 2, 0.5));

El orden importa: primero guardamos el estado correspondiente al tiempo actual y luego calculamos el siguiente. Si actualizáramos antes de registrar, asociaríamos la posición futura con el tiempo anterior.

07 · Cuando la razón cambia

Una aproximación local de la evolución

Si la razón de cambio depende del tiempo o del propio estado, podemos considerarla aproximadamente constante durante un paso corto. Para una cantidad y cuya razón es r(t, y), usamos:

yₙ₊₁ = yₙ + r(tₙ, yₙ) · Δt

La fórmula toma la razón al comienzo del paso y la extiende sobre todo el intervalo. Es una forma elemental del método de Euler. No necesitamos desarrollar todavía ecuaciones diferenciales para comprender su lógica: razón por duración produce cambio estimado.

Por ejemplo, supongamos que una cantidad crece a una razón igual a su valor actual y comienza en 1:

Aproximación con Δt = 0.5 y regla y siguiente = y actual + y actual · Δt.
ntₙyₙCambio estimadoyₙ₊₁
00.01.0001.000 · 0.5 = 0.5001.500
10.51.5001.500 · 0.5 = 0.7502.250
21.02.2502.250 · 0.5 = 1.1253.375

Como la razón aumenta dentro de cada intervalo, mantenerla fija desde el comienzo subestima el crecimiento. Reducir el paso permite recalcularla con mayor frecuencia.

08 · Elegir la resolución

Pasos pequeños: más detalle, más trabajo

El tamaño de paso controla la resolución temporal. Si simulamos 10 segundos, un paso de 1 segundo exige 10 actualizaciones; uno de 0.01 segundos exige aproximadamente 1000. Reducir Δt suele mejorar la aproximación, pero aumenta el costo.

Efectos habituales del tamaño del paso.
Paso grandePaso pequeño
Menos cálculos y memoria.Más cálculos y, si se guardan estados, más memoria.
Puede omitir cambios rápidos.Describe con más detalle la evolución.
La aproximación local suele ser más pobre.La aproximación local suele mejorar.
Puede ser suficiente para una vista general.Puede ser necesario para precisión o estabilidad.

“Más pequeño” no equivale a “perfecto”. Persisten el redondeo, la incertidumbre de los datos y el error del método. Además, después de cierto punto, duplicar el trabajo puede aportar una mejora irrelevante para el objetivo.

09 · Relojes y animaciones

El paso del modelo no siempre coincide con el tiempo real

En una simulación podemos decidir que cada iteración representa una hora aunque el cálculo tarde una milésima de segundo. El tiempo simulado pertenece al modelo; el tiempo de ejecución mide cuánto tarda la computadora.

En una animación interactiva ambos tiempos se relacionan, pero los cuadros no llegan siempre a intervalos idénticos. Suponer ciegamente 60 cuadros por segundo hace que un objeto se mueva más lento en un equipo que dibuja menos cuadros. Conviene medir el tiempo transcurrido:

let instanteAnterior;
let posicion = 0;
const velocidad = 120; // píxeles por segundo

function animar(instanteActual) {
  if (instanteAnterior !== undefined) {
    const deltaTiempo = (instanteActual - instanteAnterior) / 1000;
    posicion += velocidad * deltaTiempo;
  }

  instanteAnterior = instanteActual;
  // dibujarObjeto(posicion);
  requestAnimationFrame(animar);
}

requestAnimationFrame(animar);

requestAnimationFrame entrega marcas temporales en milisegundos. Al dividir por 1000 obtenemos segundos, coherentes con la unidad de la velocidad. En simulaciones sensibles, un salto temporal excepcionalmente grande puede subdividirse en varios pasos internos.

10 · Exploración

Laboratorio: cambiar el tamaño del paso

El modelo continuo será y = eᵗ, que comienza en 1 y cuya razón de cambio coincide con su valor. Los puntos representan la aproximación discreta de Euler. Reducí Δt y observá cómo cambia la trayectoria, el número de pasos y el error final.

EXPERIMENTO 06

Una curva, distintas discretizaciones

yₙ₊₁ = yₙ + yₙ · Δt

Los resultados numéricos aparecen debajo del gráfico.
Actualizaciones6 pasos
Valor discreto final11,3906
Valor continuo final20,0855
Error absoluto8,6949

Con Δt = 0,50, la aproximación usa 6 pasos y queda por debajo de la curva continua.

La curva dorada muestra eᵗ. La línea violeta y sus puntos muestran los estados calculados al aplicar la regla discreta desde el inicio de cada paso.

Preguntas para explorar

  1. Reducí el paso de 1 a 0.5 y luego a 0.25. ¿Qué ocurre con el error y con la cantidad de actualizaciones?
  2. Conservá el paso y aumentá el tiempo final. ¿Por qué se acumula una diferencia mayor?
  3. ¿Los puntos discretos pertenecen a la curva continua o representan otra trayectoria?
  4. ¿Un paso dos veces menor produce exactamente la mitad del error? Comprobalo con distintos valores.

11 · Implementación

Simular sin depender de sumas decimales repetidas

Una condición como for (let t = 0; t <= fin; t += paso) es clara, pero acumula error de punto flotante en t. Para una cantidad conocida de pasos conviene iterar con un índice entero y derivar el tiempo:

function euler({ inicial, duracion, paso, razon }) {
  if (paso <= 0 || duracion < 0) {
    throw new RangeError("El paso debe ser positivo");
  }

  const pasosCompletos = Math.floor(duracion / paso);
  const estados = [{ tiempo: 0, valor: inicial }];
  let valor = inicial;

  for (let indice = 0; indice < pasosCompletos; indice += 1) {
    const tiempo = indice * paso;
    valor += razon(tiempo, valor) * paso;
    estados.push({ tiempo: (indice + 1) * paso, valor });
  }

  return estados;
}

const crecimiento = euler({
  inicial: 1,
  duracion: 3,
  paso: 0.5,
  razon: (tiempo, valor) => valor
});

console.log(crecimiento);

Qué debe decidir una simulación general

  • qué unidades usan el tiempo, el estado y la razón;
  • si incluye el estado inicial y el extremo final;
  • qué hace cuando la duración no es múltiplo del paso;
  • si guarda todos los estados o solo el actual;
  • cómo detecta valores no finitos o una evolución inestable.

Estas decisiones no son detalles administrativos: definen el significado de la salida. Una lista sin unidades ni convención temporal puede ser numéricamente correcta y, aun así, resultar imposible de interpretar.

12 · Comprensión

Confusiones frecuentes

«Si la computadora muestra una curva, calculó todos sus puntos»

No. Calculó una cantidad finita de puntos o segmentos y la pantalla rasterizó una cantidad finita de píxeles. La apariencia continua es una representación visual.

«Continuo significa que la variable cambia siempre a una razón constante»

No. Una variable continua puede crecer, disminuir u oscilar con razones variables. “Continuo” se refiere aquí al conjunto de instantes o valores posibles.

«Cuantos más pasos use, el resultado será exacto»

Un paso menor suele reducir el error de discretización, pero no elimina otros errores ni garantiza que el modelo describa bien el fenómeno.

«Diez pasos producen diez puntos»

Si se guardan el estado inicial y el final, diez pasos conectan once puntos. Cada paso es una transición entre dos estados.

«Un cuadro de animación siempre dura 1/60 de segundo»

La frecuencia real puede variar. Para movimientos ligados al tiempo conviene usar la duración medida entre cuadros y manejar pausas o saltos grandes.

13 · Práctica guiada

Ejercicios de comprensión

Ejercicio 1: construir una grilla

Se registra una señal desde t=2 s hasta t=5 s cada 0.5 s. Escribí los instantes, la cantidad de pasos y la cantidad de puntos.

Ver solución razonada

La longitud es 5−2=3 s. Hay 3/0.5=6 pasos y 7 puntos: 2, 2.5, 3, 3.5, 4, 4.5 y 5 segundos.

Ejercicio 2: actualización con razón constante

Un depósito contiene 20 litros y recibe 3 litros por minuto. Simulá 2 minutos con Δt=0.5 min. Construí una tabla con índice, tiempo y volumen.

Ver solución

Cada paso agrega 3 · 0.5 = 1.5 L. Los estados son (0,20), (0.5,21.5), (1,23), (1.5,24.5) y (2,26). Son cuatro pasos y cinco estados.

Ejercicio 3: detectar información perdida

Dos sensores entregan estas muestras: (0,0), (1,0), (2,0). El primero mide una señal constante f(t)=0; el segundo, g(t)=sen(2πt). ¿Puede la tabla distinguirlas? ¿Qué cambiarías?

Ver solución

No puede distinguirlas porque ambas valen cero en tiempos enteros. Se necesita muestrear más frecuentemente y en instantes intermedios, por ejemplo cada 0.25 segundos. Entonces g(0.25)=1 mientras f(0.25)=0.

Ejercicio 4: implementar y comparar

La regla x siguiente = x actual − 0.4 · x actual · Δt aproxima una disminución. Partí de 100, avanzá hasta t=2 con pasos 1 y 0.5 y compará los valores finales.

Ver solución y código

Con paso 1 hay dos actualizaciones: 100 → 60 → 36. Con paso 0.5, cada paso conserva el 80 %: 100 → 80 → 64 → 51.2 → 40.96. Cambiar el paso cambia la aproximación porque la razón se recalcula en más instantes.

function disminuir(valorInicial, duracion, paso) {
  const cantidad = Math.round(duracion / paso);
  let valor = valorInicial;

  for (let i = 0; i < cantidad; i += 1) {
    valor += (-0.4 * valor) * paso;
  }
  return valor;
}

console.log(disminuir(100, 2, 1));   // 36
console.log(disminuir(100, 2, 0.5)); // 40.96

14 · Síntesis

Ideas para recordar

  • Un modelo continuo admite cualquier instante dentro de un intervalo.
  • Una computadora representa el proceso mediante una cantidad finita de estados discretos.
  • La grilla uniforme se expresa como tₙ = t₀ + n · Δt.
  • n es un índice sin unidad; tₙ es un instante y Δt tiene unidad temporal.
  • N pasos conectan N+1 puntos si se incluyen ambos extremos.
  • Las muestras no revelan necesariamente qué sucede entre ellas.
  • Una actualización típica estima estado siguiente = estado actual + razón · paso.
  • Reducir el paso suele aumentar el detalle y disminuir el error de discretización, a cambio de más cálculos.
  • El paso adecuado depende del fenómeno, del método y de la precisión necesaria.

En el próximo tema estudiaremos los intervalos en la recta real: una notación precisa para indicar conjuntos de valores, incluir o excluir extremos y expresar el dominio sobre el que observamos un proceso.