Fundamentos · Tema 19

Criterios de parada y tolerancia

Cómo decidir cuándo una aproximación es suficientemente buena, distinguir convergencia de estancamiento y terminar un algoritmo con una razón explícita en lugar de depender de una cantidad arbitraria de repeticiones.

01 · Punto de partida

Un proceso infinito debe convertirse en un programa finito

Muchos métodos matemáticos describen una sucesión que continúa indefinidamente y se acerca a una respuesta. Un programa, en cambio, necesita devolver un resultado después de una cantidad finita de operaciones.

Para aproximar √2 mediante el método de Newton podemos iterar:

xn+1 = ½ (xn + 2/xn)

Desde x₀=1 aparecen 1.5, 1.416666…, 1.414215… y valores cada vez más cercanos. Pero ¿cuándo debe detenerse el ciclo? “Cuando parezca suficiente” no es una instrucción ejecutable.

let x = 1;

while (/* ¿qué condición indica continuar? */) {
  x = (x + 2 / x) / 2;
}

Una regla de parada debe conectar la matemática con la necesidad concreta: precisión requerida, costo disponible y riesgos si el método no se comporta como esperamos.

02 · Tres preguntas diferentes

Aceptación, seguridad y diagnóstico

Una implementación robusta no usa una única condición indistinta. Separa por qué aceptaría el resultado, cuándo debe abandonar y qué información devolverá para explicar lo ocurrido.

01 · ACEPTACIÓN

¿Es suficientemente bueno?

Evalúa error estimado, residuo, intervalo o cambio mediante tolerancias justificadas.

02 · SALVAGUARDA

¿Es seguro continuar?

Limita iteraciones, tiempo y valores no finitos; detecta divergencia o estancamiento.

03 · INFORME

¿Por qué terminó?

Distingue convergencia, presupuesto agotado, dato inválido y fallo numérico.

Alcanzar el máximo de iteraciones no equivale a converger. Ambos eventos terminan el ciclo, pero solo el primero es una salida de seguridad. El programa debe comunicar esa diferencia al código que consume el resultado.

03 · Qué cantidad comparar

Cuatro criterios frecuentes

La tolerancia ε es un umbral. Su significado depende de la cantidad a la que se aplica:

|xₙ − x*| ≤ εError verdadero, si la solución x* es conocida.
|xₙ − xₙ₋₁| ≤ εCambio entre aproximaciones consecutivas.
|f(xₙ)| ≤ εResiduo para resolver f(x)=0.
bₙ − aₙ ≤ εAncho de un intervalo que contiene la solución.

Estas expresiones no son intercambiables. Un cambio pequeño puede acompañar un residuo grande; un residuo pequeño puede corresponder a un error grande si la función es casi horizontal; un intervalo pequeño es útil solamente si sabemos que conserva una solución.

Ventajas y limitaciones de distintos criterios.
CriterioVentajaLimitación
Error verdaderoMide exactamente lo que interesa.La respuesta suele ser desconocida.
Cambio de pasoBarato y siempre disponible.Puede detectar estancamiento, no exactitud.
ResiduoComprueba la ecuación original.Su relación con el error depende del problema.
Ancho de intervaloPuede proporcionar una cota rigurosa.Requiere un método que mantenga el encierro.

04 · La escala del problema

Tolerancia absoluta y tolerancia relativa

Una tolerancia absoluta mide una distancia en las unidades del resultado:

|aproximación − referencia| ≤ εabs

ε_abs=0.01 puede ser razonable para una longitud medida en metros si aceptamos un centímetro. Pero la misma distancia tiene distinta importancia frente a un resultado de 0.001 o de 1 000 000.

La tolerancia relativa compara con la escala:

|a − b| ≤ εrel · max(|a|, |b|)

Cerca de cero, el lado derecho también se acerca a cero y puede exigir una precisión imposible o innecesaria. Por eso suele combinarse:

|a − b| ≤ εabs + εrel · max(|a|, |b|)

Tolerancia absoluta

Protege cerca de cero

Define un piso de error aceptable con unidades concretas.

Tolerancia relativa

Se adapta a la magnitud

Exige aproximadamente la misma cantidad de cifras significativas en distintas escalas.

05 · Una señal útil pero incompleta

El cambio entre iteraciones no siempre es el error

Detener cuando |xₙ−xₙ₋₁| es pequeño funciona bien en muchos métodos convergentes, pero responde “¿cuánto cambió el algoritmo?”, no “¿cuán lejos está la solución?”.

La regla lenta xₙ₊₁=xₙ+10⁻¹² cambia muy poco en cada paso aunque se encuentre lejos de cualquier objetivo. También un cálculo de punto flotante puede producir xₙ₊₁===xₙ porque el incremento ya no es representable, no porque haya alcanzado una solución.

const grande = 1e16;
const siguiente = grande + 1;

console.log(siguiente === grande); // true
// Cambio almacenado cero, pero no se comprobó ninguna ecuación.

06 · Volver al problema original

Residuo, error y condicionamiento

Al resolver f(x)=0, el residuo r=f(x̃) indica cuánto incumple la aproximación la ecuación. Es computable sin conocer la raíz exacta.

Sin embargo, residuo y error no son iguales. Consideremos f(x)=10⁻⁸(x−3). En x=1003, el error respecto de la raíz es 1000, pero el residuo vale apenas 10⁻⁵. Una función muy plana transforma errores grandes en residuos pequeños.

Si conocemos una cota inferior m>0 para la magnitud de la pendiente cerca de la raíz, puede obtenerse una cota aproximada:

|x̃ − x*| ≤ |f(x̃)| / m

Esta relación muestra por qué la escala y el condicionamiento importan. Normalizar el residuo mediante una magnitud característica también evita que las unidades o coeficientes decidan accidentalmente cuándo parar.

07 · Diseñar una política explícita

Criterios combinados: AND, OR y prioridades

Combinar condiciones exige decidir su lógica. Con AND, todas deben cumplirse; con OR, basta una. El resultado puede cambiar de forma importante:

const pasoAceptable = cambio <= toleranciaPaso;
const residuoAceptable = residuo <= toleranciaResiduo;

// Más exigente: confirma ambas señales.
const aceptarConAnd = pasoAceptable && residuoAceptable;

// Más permisivo: requiere justificar cualquiera de las dos.
const aceptarConOr = pasoAceptable || residuoAceptable;

Una política habitual es aceptar solo cuando cambio y residuo cumplen sus umbrales, mientras cualquier salvaguarda —valor no finito, tiempo o máximo de iteraciones— detiene con estado de fallo o resultado incompleto.

calcular candidatovalidar finitudmedir cambio y residuoevaluar aceptaciónrevisar presupuesto

El orden también importa. Antes de declarar convergencia hay que descartar NaN e infinitos. Además, el estado devuelto debe incluir qué condición concreta produjo la salida.

08 · Cuando seguir ya no ayuda

Precisión de máquina, estancamiento y divergencia

Una tolerancia menor que la resolución disponible no obliga a obtener más precisión: puede crear un ciclo interminable. Cerca de una magnitud dada, Number posee una separación finita entre valores representables.

  • Estancamiento: el nuevo estado coincide con el anterior sin satisfacer el criterio principal.
  • Ciclo: reaparecen estados anteriores, por ejemplo alternando entre dos valores.
  • Divergencia: una medida como el residuo o la magnitud crece persistentemente.
  • Valor inválido: surge NaN, Infinity o una salida fuera del dominio.
if (!Number.isFinite(candidato)) {
  return { estado: 'fallo', motivo: 'valor-no-finito' };
}

if (Object.is(candidato, actual) && residuo > tolerancia) {
  return { estado: 'fallo', motivo: 'estancamiento' };
}

if (candidato === anteriorAnterior) {
  return { estado: 'fallo', motivo: 'ciclo-de-dos' };
}

Detectar divergencia universalmente es difícil. Puede observarse crecimiento sostenido durante varias iteraciones, pero algunos métodos atraviesan transitorios grandes antes de converger. El diagnóstico debe expresarse como criterio operativo, no como certeza matemática injustificada.

09 · Precisión con un propósito

Elegir tolerancias y límites de recursos

La tolerancia no debería elegirse copiando un número como 1e-12 sin contexto. Depende de:

  • las unidades y la escala de la salida;
  • la incertidumbre de los datos de entrada;
  • el efecto del error en decisiones posteriores;
  • la estabilidad y precisión del método;
  • el costo de cada iteración y el tiempo disponible.

Si una medición de entrada tiene incertidumbre de ±0.1, exigir que el cálculo interno cambie menos de 10⁻¹⁵ puede consumir recursos sin mejorar el significado físico del resultado.

Presupuestos de seguridad y su función.
LímiteProtege contraAl agotarse
Máximo de iteracionesCiclos infinitos y convergencia demasiado lenta.Devolver “no convergió dentro del presupuesto”.
Tiempo máximoIteraciones de costo variable.Interrumpir de forma controlada.
Magnitud máximaDesbordamiento y trayectorias explosivas.Informar divergencia operativa.
Evaluaciones máximasFunciones costosas o servicios externos.Conservar el mejor candidato obtenido.

Un límite de recursos no es un criterio de calidad. Es una protección que debe producir un estado diferente de “éxito”.

10 · Exploración

Laboratorio: ¿cuándo se detiene el método?

Compará reglas de parada al aproximar √S. El gráfico muestra, en escala logarítmica, el cambio entre pasos y el residuo. El punto rojo indica la iteración en que la política seleccionada finaliza.

EXPERIMENTO 19

La condición decide el final

Newton para x² − S = 0

Los resultados aparecen debajo del gráfico.
Aproximación1,414213562
Iteraciones5
Residuo final4,441e−16
SalidaTolerancia alcanzada

El cambio y el residuo cumplen la tolerancia seleccionada.

La altura representa el orden de magnitud: cuanto más baja una serie, menor es la medida. Los valores iguales a cero se muestran en el piso del gráfico.

Preguntas para explorar

  1. Con Newton, compará cambio, residuo, AND y OR. ¿Siempre finalizan en la misma iteración?
  2. Reducí el máximo de iteraciones. ¿Cómo se diferencia “presupuesto agotado” de “tolerancia alcanzada”?
  3. Compará Newton y bisección con 10⁻¹². ¿Qué método necesita más pasos?
  4. Usá la iteración amortiguada y una tolerancia estricta. ¿Un cambio pequeño garantiza rápidamente un residuo pequeño?

11 · Contratos claros en el código

Devolver resultado, calidad y motivo

Una función numérica debería devolver más que el valor. El consumidor necesita saber si se alcanzó la precisión solicitada:

function raizNewton(S, opciones = {}) {
  const {
    inicial = Math.max(1, S),
    toleranciaAbsoluta = 1e-12,
    toleranciaRelativa = 1e-10,
    maxIteraciones = 100
  } = opciones;

  if (!(S >= 0) || !Number.isFinite(S)) {
    return { ok: false, motivo: 'entrada-invalida' };
  }
  if (S === 0) {
    return { ok: true, valor: 0, iteraciones: 0, residuo: 0 };
  }

  let actual = inicial;
  for (let iteracion = 1; iteracion <= maxIteraciones; iteracion += 1) {
    const siguiente = (actual + S / actual) / 2;
    if (!Number.isFinite(siguiente)) {
      return { ok: false, motivo: 'valor-no-finito', iteracion };
    }

    const cambio = Math.abs(siguiente - actual);
    const umbral = toleranciaAbsoluta
      + toleranciaRelativa * Math.max(Math.abs(actual), Math.abs(siguiente));
    const residuo = Math.abs(siguiente * siguiente - S);

    if (cambio <= umbral && residuo <= toleranciaAbsoluta) {
      return { ok: true, valor: siguiente, iteraciones: iteracion, residuo };
    }
    if (Object.is(siguiente, actual)) {
      return { ok: false, valor: actual, motivo: 'estancamiento', iteracion };
    }
    actual = siguiente;
  }

  return { ok: false, valor: actual, motivo: 'max-iteraciones' };
}

Este ejemplo todavía requiere adaptar la escala del residuo para objetivos muy grandes o pequeños, pero establece un contrato: ok distingue aceptación de fallo y motivo conserva información diagnóstica.

Validar también las opciones

Las tolerancias deben ser finitas y no negativas; el máximo de iteraciones debe ser un entero positivo. Si las opciones son inválidas, conviene rechazarlas antes de comenzar:

function opcionesValidas(tolerancia, maxIteraciones) {
  return Number.isFinite(tolerancia)
    && tolerancia >= 0
    && Number.isSafeInteger(maxIteraciones)
    && maxIteraciones > 0;
}

12 · Comprensión

Confusiones frecuentes

«Alcanzar el máximo de iteraciones significa converger»

No. Es una salvaguarda. El resultado puede ser útil como mejor aproximación disponible, pero debe informarse que no alcanzó el criterio solicitado.

«Si dos iteraciones son iguales, encontré la respuesta exacta»

Pueden coincidir por redondeo de punto flotante. Hay que comprobar el residuo o una propiedad independiente.

«Una tolerancia más pequeña siempre mejora el resultado»

Puede superar la precisión de los datos o de la representación, aumentar el costo y provocar estancamiento sin aportar información útil.

«Residuo pequeño significa error pequeño»

La relación depende del condicionamiento. Una función muy plana puede tener residuo pequeño lejos de la raíz.

«Number.EPSILON es la tolerancia correcta para cualquier cálculo»

Describe la separación alrededor de 1. La escala del problema, el algoritmo y la incertidumbre requieren umbrales específicos.

«Combinar criterios con AND u OR es equivalente»

AND exige todos los criterios y suele detener más tarde. OR acepta el primero que se cumpla y necesita justificar que cualquiera sea suficiente.

13 · Práctica guiada

Ejercicios de comprensión

Ejercicio 1: absoluta y relativa

Compará a=1 000 000 y b=1 000 001 con tolerancia absoluta 0.01 y relativa 2·10⁻⁶.

Ver solución razonada

La diferencia absoluta es 1, mayor que 0.01. El umbral relativo es aproximadamente 2·10⁻⁶·1 000 001≈2, por lo que la diferencia sí resulta aceptable en términos relativos.

Ejercicio 2: cambio pequeño engañoso

La iteración xₙ₊₁=xₙ+10⁻¹² busca resolver x=100 desde cero. ¿Por qué |xₙ₊₁−xₙ|<10⁻⁹ es un mal criterio?

Ver solución

Se cumple desde el primer paso porque el algoritmo avanza lentamente, aunque el error sea casi 100. El cambio mide velocidad del proceso, no distancia al objetivo. Debe comprobarse también |x−100| o un residuo equivalente.

Ejercicio 3: bisección

Un intervalo inicial tiene ancho 8 y se divide por la mitad en cada paso. ¿Cuántas bisecciones garantizan un ancho no mayor que 0.01?

Ver solución

Buscamos 8/2ⁿ≤0.01, es decir 2ⁿ≥800. Como 2⁹=512 y 2¹⁰=1024, se requieren 10 bisecciones.

Ejercicio 4: interpretar una salida

Un método devuelve {ok:false, valor:1.4142, motivo:'max-iteraciones'}. ¿Puede usarse el valor?

Ver solución

Es el mejor candidato devuelto, pero no cumplió el criterio dentro del presupuesto. Su uso depende del riesgo y de medidas adicionales como residuo o cota. No debe presentarse como convergencia confirmada.

Ejercicio 5: función de comparación

Implementá una comparación con tolerancias absoluta y relativa.

Ver solución y código
function suficientementeCerca(a, b, absTol = 1e-12, relTol = 1e-9) {
  if (!Number.isFinite(a) || !Number.isFinite(b)) return a === b;
  const diferencia = Math.abs(a - b);
  const escala = Math.max(Math.abs(a), Math.abs(b));
  return diferencia <= absTol + relTol * escala;
}

14 · Síntesis

Ideas para recordar

  • Un criterio de parada traduce “suficientemente bueno” a una condición verificable.
  • Aceptación, salvaguarda y diagnóstico cumplen funciones diferentes.
  • Error verdadero, cambio de paso, residuo y ancho de intervalo no son equivalentes.
  • Las tolerancias absoluta y relativa se complementan en escalas distintas.
  • Un cambio pequeño puede indicar lentitud o estancamiento, no exactitud.
  • Un residuo pequeño debe interpretarse según el condicionamiento del problema.
  • AND y OR producen políticas de aceptación diferentes.
  • La precisión de máquina impone un límite a las tolerancias alcanzables.
  • Los presupuestos de iteraciones y tiempo son salvaguardas, no pruebas de convergencia.
  • Una API numérica debe devolver valor, medidas de calidad y motivo de finalización.

En el último tema integraremos estas ideas en un proyecto completo para aproximar, medir y visualizar: diseñaremos el experimento, controlaremos el error y comunicaremos los resultados.