32. Tolerancias numéricas, conservación y casos límite

Las leyes físicas son exactas dentro del modelo; los cálculos digitales no. Una tolerancia bien definida distingue el redondeo inevitable de un error físico o algorítmico.

32.1 Exactitud física y aproximación numérica

Si el impulso externo es nulo, el modelo exige P⃗f = P⃗i. Sin embargo, una computadora representa muchos números reales mediante aproximaciones binarias finitas.

La tolerancia pertenece al método numérico y a los datos, no modifica la ley de conservación.

32.2 Por qué aparece el error de punto flotante

Valores sencillos en decimal, como 0,1, no siempre tienen una representación binaria finita. Operaciones sucesivas acumulan pequeñas diferencias.

console.log(0.1 + 0.2);       // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false

Esto no indica una falla de JavaScript, sino una propiedad del formato numérico utilizado.

32.3 No comparar resultados calculados con igualdad exacta

La expresión momentoInicial === momentoFinal puede fallar por una diferencia irrelevante o, en un vector, ni siquiera comparar lo que se pretende. Se calcula primero un residuo:

r = |valor calculado − valor esperado|

Luego r se contrasta con un umbral documentado.

32.4 Tolerancia absoluta

Una tolerancia absoluta fija el error máximo permitido en las unidades de la magnitud:

|a − b| ≤ εabs

Es esencial cerca de cero, donde no existe una escala relativa fiable. Por ejemplo, puede interpretarse que un residuo de momento menor que 10−8 kg·m/s es numéricamente nulo.

32.5 Tolerancia relativa

La tolerancia relativa adapta el umbral al tamaño de los valores:

|a − b| ≤ εrel · máx(|a|, |b|)

Funciona bien lejos de cero: admite un error proporcional semejante para problemas expresados a escalas muy distintas.

32.6 Comparación combinada

Una regla robusta combina ambos criterios:

|a − b| ≤ εabs + εrel · máx(|a|, |b|)
Cerca de ceroDomina εabs y evita dividir por una escala casi nula.
Valores grandesDomina el término relativo y el umbral crece con el problema.

32.7 Elegir una escala física

Para vectores de momento puede usarse:

escalaP = máx(|P⃗i|, |P⃗f|, Σ|p⃗k|)

La suma de módulos individuales evita una escala cero cuando grandes momentos opuestos se cancelan en el total.

32.8 Comparar vectores

Para dos vectores se usa la norma de su diferencia:

rv = |a⃗ − b⃗| = √[(ax − bx)² + (ay − by)²]

Comparar solo los módulos |a⃗| y |b⃗| no detecta direcciones distintas.

32.9 Las tolerancias tienen dimensiones

εabs debe expresarse en la misma unidad que el residuo. No se compara directamente un residuo de momento con una tolerancia elegida para velocidad.

ResiduoUnidad
Momentokg·m/s
Restituciónm/s
EnergíaJ
Normal unitariaAdimensional

32.10 Decidir si existe aproximación

En vez de exigir gn < 0 sin margen, se define una tolerancia de velocidad:

gn < −εvChoque: existe aproximación significativa.
|gn| ≤ εvContacto en reposo relativo dentro de tolerancia.
gn > εvSeparación: no aplicar impulso.

32.11 Normal casi nula

Para discos, n⃗ = r⃗B − r⃗A. Si los centros coinciden o están extremadamente cerca, normalizar amplifica el error:

n̂ = n⃗/|n⃗|   no es fiable cuando |n⃗| ≈ 0

El programa debe usar una normal previa válida, una dirección relativa disponible o informar que la geometría es degenerada.

32.12 Velocidad relativa casi cero

Si los cuerpos comparten velocidad normal, la restitución no aporta información útil y el impulso calculado debe ser cero. Dividir por gn para “medir e” produciría inestabilidad.

No intentes calcular un cociente relativo cuando el denominador está dentro de la tolerancia de cero.

32.13 Razones de masa extremas

Si una masa es muchísimo mayor que otra, fórmulas algebraicamente equivalentes pueden perder precisión al restar números cercanos. La forma impulsiva suele ser clara:

j = −(1 + e)gn/(1/mA + 1/mB)

Una pared ideal puede representarse directamente con masa inversa cero, evitando almacenar Infinity como masa.

32.14 Extremos de restitución

  • e = 0: la velocidad relativa normal final debe ser cero.
  • e = 1: la energía cinética del modelo liso se conserva.
  • e apenas fuera de [0, 1] por entrada o redondeo debe validarse según el modelo, no recortarse silenciosamente.

Si se admite e > 1, el diagnóstico energético debe reconocer una interacción activa.

32.15 Penetraciones y tiempos casi nulos

Una simulación puede encontrar cuerpos separados por −10−12 m debido al redondeo. Es distinto de una penetración macroscópica.

Se necesita una tolerancia geométrica, una corrección posicional que no agregue energía y un límite de eventos con Δt aproximadamente cero.

32.16 Cancelación y energía

Restar dos energías grandes y casi iguales puede perder cifras significativas. Para un choque normal resulta más estable comprobar también:

ΔK = −½μ(1 − e²)gn,i²

Usar dos caminos de cálculo independientes ayuda a descubrir errores y cancelaciones problemáticas.

32.17 Rechazar valores no finitos

NaN contamina todos los cálculos posteriores y las comparaciones con él siempre resultan falsas. Las entradas y salidas críticas deben validarse con Number.isFinite.

function exigirFinito(valor, nombre) {
  if (!Number.isFinite(valor)) {
    throw new Error(`${nombre} debe ser un número finito`);
  }
  return valor;
}

const masa = exigirFinito(2.5, "masa");
console.log(`Masa validada: ${masa} kg`);

try {
  exigirFinito(NaN, "velocidad");
} catch (error) {
  console.log(`Valor rechazado: ${error.message}`);
}

32.18 Procedimiento de auditoría robusta

Validar valores y unidades
Calcular residuos físicos
Elegir escalas representativas
Aplicar tolerancias combinadas
Clasificar casos límite
Informar valores y decisiones

32.19 Actividad interactiva: redondeo y tolerancias

El laboratorio calcula un choque unidimensional exacto, redondea las velocidades finales y comprueba el resultado aproximado.

Laboratorio de precisión numérica

A está a la izquierda de B: debe cumplirse vAi > vBi. Compará cada residuo con εabs + εrel·escala.

ResultadovAfvBf
Exacto+0,200000 m/s+3,200000 m/s
Redondeado0 m/s+3 m/s
Umbral de momento0,020 kg·m/s
Umbral de restitución0,015 m/s
Energía exacta final15,40 J
Energía redondeada final13,50 J
Momento
1,000
Restitución
0,000
Energía
1,900
Momento: no cumple
Restitución: cumple
Energía esperada: no cumple

El redondeo elegido no satisface todas las auditorías. Conservá más decimales o revisá la tolerancia.

32.20 Utilidades con JavaScript

function casiIguales(a, b, absoluta = 1e-9, relativa = 1e-9) {
  if (!Number.isFinite(a) || !Number.isFinite(b)) return false;
  const escala = Math.max(Math.abs(a), Math.abs(b));
  return Math.abs(a - b) <= absoluta + relativa * escala;
}

function vectoresCasiIguales(a, b, absoluta = 1e-9, relativa = 1e-9) {
  const diferencia = Math.hypot(a.x - b.x, a.y - b.y);
  const escala = Math.max(Math.hypot(a.x, a.y), Math.hypot(b.x, b.y));
  return diferencia <= absoluta + relativa * escala;
}

console.log(casiIguales(0.1 + 0.2, 0.3));
console.log(vectoresCasiIguales(
  { x: 10, y: -4 },
  { x: 10 + 1e-10, y: -4 - 1e-10 }
));

32.21 Errores frecuentes y ejercicios

Errores frecuentes

  • Usar === con resultados calculados.
  • Elegir una tolerancia absoluta única para cualquier escala y magnitud.
  • Dividir por un valor casi cero para calcular un error relativo.
  • Comparar módulos de vectores y olvidar su dirección.
  • Recortar silenciosamente entradas inválidas.
  • Usar una normal casi nula o una masa infinita almacenada literalmente.
  • Aumentar la tolerancia hasta ocultar un error real.

Ejercicios propuestos

  1. Decidí si 1,0000001 y 1 cumplen con εabs = 10−8 y εrel = 10−6.
  2. Repetí para 0 y 10−7. ¿Qué término domina?
  3. Calculá el residuo entre (3, 4) y (3,0003; 3,9996).
  4. Explicá por qué dos momentos opuestos requieren una escala distinta de |P⃗ total|.
  5. Clasificá gn = −5·10−10 m/s con εv = 10−9 m/s.
  6. En el laboratorio, aumentá los decimales hasta que las tres auditorías cumplan.
  7. Escribí una prueba que rechace NaN, Infinity y masa cero.
Ver soluciones y orientaciones
  1. La diferencia es 10−7; el umbral es aproximadamente 1,01·10−6. Cumplen.
  2. El umbral es aproximadamente 10−8; la diferencia 10−7 no cumple. Cerca de cero domina εabs.
  3. r = √[(−0,0003)² + (0,0004)²] = 0,0005.
  4. |P⃗| puede ser cero por cancelación aunque los términos individuales sean grandes; conviene incluir Σ|p⃗k|.
  5. Está dentro de la banda de reposo relativo: no se procesa como choque.
  6. Con los datos iniciales, un decimal reproduce exactamente 0,2 y 3,2 y elimina los residuos mostrados.
  7. Usá Number.isFinite para cada número y exigí masa > 0.

32.22 Ideas para recordar

  • Las ecuaciones físicas son exactas dentro del modelo; sus evaluaciones digitales son aproximadas.
  • Una comparación robusta combina tolerancias absoluta y relativa.
  • La escala debe representar la magnitud física y sus términos relevantes.
  • Cada residuo conserva sus propias unidades.
  • Los vectores se comparan mediante la norma de su diferencia.
  • Los valores cercanos a cero requieren decisiones explícitas.
  • Entradas no finitas y geometrías degeneradas deben rechazarse.
  • Una tolerancia debe justificar el error esperado, no ocultar fallos.

En el próximo tema integraremos el curso en un laboratorio de colisiones en una y dos dimensiones.