Fundamentos · Tema 06

Condicionamiento, estabilidad y convergencia

Tres ideas para distinguir si la dificultad proviene del problema, del algoritmo o de la forma en que las aproximaciones avanzan hacia la solución.

01 · Punto de partida

¿Dónde se origina un resultado poco confiable?

Cuando una salida cambia demasiado al modificar ligeramente una entrada, podemos culpar al código, a los datos o al método. Sin embargo, existen tres fenómenos distintos:

κ

Condicionamiento

Describe cuánto responde la solución exacta del problema ante pequeñas perturbaciones de los datos.

A

Estabilidad

Describe si el algoritmo introduce o amplifica errores innecesariamente durante el cálculo.

xₙ→x*

Convergencia

Describe si las aproximaciones se acercan a la solución al aumentar iteraciones o resolución.

Esta separación es esencial para diagnosticar. Un algoritmo excelente no puede recuperar información que un problema extremadamente sensible perdió en los datos. A la inversa, un problema bien condicionado puede resolverse mal con una implementación inestable.

02 · Sensibilidad del problema

¿Qué significa que un problema esté condicionado?

Imaginemos un problema representado por y = f(x). El dato real es x, pero recibimos x + Δx. Aun si evaluáramos f con aritmética exacta, la salida cambiaría:

Δy = f(x + Δx) − f(x)

Bien condicionado

La salida cambia de manera comparable

Pequeñas perturbaciones de entrada producen pequeñas perturbaciones de salida.

Mal condicionado

La salida amplifica la perturbación

Un cambio diminuto en los datos puede producir una diferencia relativa muy grande.

“Bien” y “mal” no son propiedades absolutas sin contexto. Dependen del punto donde evaluamos, de la forma de medir los errores y de la precisión que exige la aplicación.

03 · Medidas de sensibilidad

Número de condición absoluto y relativo

Para una función derivable de una variable, el cambio local cumple aproximadamente:

|Δy| ≈ |f′(x)| |Δx|

Por eso, una medida absoluta de condición es:

κabs(x) = |f′(x)|

Si queremos relacionar errores relativos y x ≠ 0, f(x) ≠ 0, obtenemos:

κrel(x) = |x f′(x) / f(x)|

La interpretación aproximada es:

error relativo de salida ≈ κrel × error relativo de entrada
Lectura orientativa del número de condición relativo.
κInterpretaciónEfecto aproximado
Menor que 1La perturbación relativa se atenúaSe pierden menos cifras relativas
Cercano a 1La perturbación se conserva en escalaEntrada y salida tienen errores comparables
Mucho mayor que 1La perturbación se amplificaPueden perderse cifras significativas
Infinito o no definidoPunto singular o escala relativa inadecuadaSe requiere otro análisis

04 · Comparar funciones

Ejemplos de números de condición

Potencia f(x) = xⁿ

Como f′(x) = nxⁿ⁻¹, el número relativo es:

κrel = |x · nxn−1 / xn| = |n|

Elevar al cuadrado duplica aproximadamente el error relativo; elevar a la décima potencia lo multiplica por diez.

Recíproco f(x) = 1/x

Para x ≠ 0, el número relativo es 1. Aunque la función crece cerca de cero, un pequeño error relativo en x produce aproximadamente el mismo error relativo en 1/x.

Función f(x) = 1/(1−x)

Su número relativo es:

κrel(x) = |x / (1 − x)|

Cerca de x = 1, el denominador se aproxima a cero y el condicionamiento empeora rápidamente.

function condicionReciprocoDesplazado(x) {
  if (x === 1) return Infinity;
  return Math.abs(x / (1 - x));
}

for (const x of [0, 0.5, 0.9, 0.99, 0.999999]) {
  console.log(x, condicionReciprocoDesplazado(x));
}

05 · Un problema inherentemente sensible

Condicionamiento de una resta

Para calcular x − y con perturbaciones independientes en ambos datos, una medida relativa aproximada es:

κ ≈ (|x| + |y|) / |x − y|

Si x e y son cercanos, el denominador es pequeño y el número de condición crece.

Sensibilidad de la resta cuando los operandos se acercan.
xyx − yκ aproximado
10281.5
109119
109.990.011999
109.9999990.000001aprox. 20 millones

La cancelación estudiada en el tema anterior es la manifestación computacional de esta sensibilidad. A veces podemos reformular el problema; otras veces la pequeña diferencia es precisamente el dato buscado y necesitamos entradas de mayor precisión.

06 · Dos formas de medir un algoritmo

Error hacia adelante y error hacia atrás

Sea y = f(x) la respuesta exacta y ỹ la respuesta calculada.

Error hacia adelante
Mide la distancia entre la salida calculada ỹ y la salida exacta y.
Error hacia atrás
Busca una entrada cercana x + Δx para la cual la salida calculada sea exacta: ỹ = f(x + Δx).
adelante: |ỹ − f(x)|     atrás: buscar Δx con ỹ = f(x + Δx)

Ejemplo: raíz cuadrada

Si deseamos √2 y obtenemos ỹ = 1.4142:

  • el error hacia adelante compara 1.4142 con Math.sqrt(2);
  • el error hacia atrás observa que 1.4142 es exactamente la raíz del dato perturbado 1.4142² = 1.99996164.
const dato = 2;
const calculada = 1.4142;

const errorAdelante = Math.abs(calculada - Math.sqrt(dato));
const datoPerturbado = calculada ** 2;
const errorAtras = Math.abs(datoPerturbado - dato);

console.log({ errorAdelante, datoPerturbado, errorAtras });

07 · Comportamiento del algoritmo

Estabilidad numérica

Un algoritmo es numéricamente estable si los errores introducidos durante su ejecución no crecen de manera innecesaria. Una definición especialmente útil es la estabilidad hacia atrás: el resultado calculado es la solución exacta de un problema ligeramente perturbado.

Esto no garantiza por sí solo un error hacia adelante pequeño. Si el problema está mal condicionado, una pequeña perturbación hacia atrás puede producir una gran diferencia de salida.

error hacia adelante ≲ condición × error hacia atrás

Problema bien condicionado

Algoritmo estable

Combinación favorable: esperamos una solución precisa.

Problema mal condicionado

Algoritmo estable

El algoritmo hace lo posible, pero los datos limitan la precisión alcanzable.

Problema bien condicionado

Algoritmo inestable

Una reformulación o método diferente puede mejorar mucho el resultado.

Problema mal condicionado

Algoritmo inestable

Se combinan sensibilidad inherente y errores evitables.

08 · Mismo problema, algoritmos distintos

Evaluar √(x+1) − √x

Las expresiones directa y racionalizada resuelven el mismo problema:

√(x+1) − √x = 1 / (√(x+1) + √x)

Para x grande, la forma directa resta cantidades cercanas y pierde cifras. La forma racionalizada evita esa operación.

function formaDirecta(x) {
  return Math.sqrt(x + 1) - Math.sqrt(x);
}

function formaEstable(x) {
  return 1 / (Math.sqrt(x + 1) + Math.sqrt(x));
}

for (const x of [1, 1e8, 1e12, 1e16]) {
  console.log(x, formaDirecta(x), formaEstable(x));
}

El condicionamiento pertenece a la función que queremos evaluar en el punto dado. La diferencia entre ambas implementaciones revela la estabilidad de la forma de cálculo.

09 · Aproximaciones sucesivas

Convergencia

Un método iterativo produce una sucesión x₀, x₁, x₂, …. Decimos que converge a x* si el error tiende a cero:

limn→∞ xn = x*    equivalente a    |xn − x*| → 0

En un método basado en una discretización, como integración o ecuaciones diferenciales, el parámetro puede ser el tamaño de paso h. En ese caso buscamos que la aproximación converja cuando h → 0.

Comportamientos posibles de una secuencia.
ComportamientoDescripción
ConvergenteEl error disminuye y tiende a cero.
DivergenteLas aproximaciones se alejan o crecen sin límite.
OscilanteAlternan entre regiones sin acercarse a un único valor.
EstancadoDejan de cambiar por precisión finita sin haber alcanzado la solución.

10 · Velocidad asintótica

Orden de convergencia

Si eₙ = |xₙ − x*|, decimos informalmente que el método tiene orden p cuando, cerca de la solución:

en+1 ≈ C enp
Órdenes de convergencia frecuentes.
OrdenNombreComportamiento aproximado
p = 1, 0 < C < 1LinealEl error se reduce por un factor aproximadamente constante.
1 < p < 2SuperlinealLa reducción mejora en cada iteración.
p = 2CuadráticaEl número de cifras correctas puede duplicarse cerca de la solución.

La bisección converge linealmente: el intervalo se reduce a la mitad. Newton-Raphson suele converger cuadráticamente cerca de una raíz simple si se cumplen sus condiciones.

function estimarOrden(errores) {
  const ordenes = [];
  for (let n = 2; n < errores.length; n++) {
    const numerador = Math.log(errores[n] / errores[n - 1]);
    const denominador = Math.log(errores[n - 1] / errores[n - 2]);
    ordenes.push(numerador / denominador);
  }
  return ordenes;
}

console.log(estimarOrden([0.1, 0.01, 0.0001, 1e-8]));

11 · Métodos discretos

Consistencia, estabilidad y convergencia

En métodos que reemplazan un problema continuo por pasos discretos aparecen tres preguntas relacionadas:

Consistencia
¿La ecuación discreta se aproxima a la ecuación original cuando el paso tiende a cero?
Estabilidad
¿Los errores y perturbaciones permanecen controlados mientras avanza el cálculo?
Convergencia
¿La solución discreta completa se acerca a la solución exacta?

Un método puede ser localmente razonable pero amplificar errores de un paso al siguiente. También puede ser estable y resolver con precisión una discretización que no representa correctamente el problema. En los temas de integración y ecuaciones diferenciales volveremos sobre esta relación.

12 · Diagnóstico

No confundir los tres conceptos

Preguntas para ubicar el origen de una dificultad numérica.
ConceptoObjetoPregunta principalQué podemos cambiar
CondicionamientoProblema y datos¿La solución es sensible a perturbaciones?Datos, formulación o precisión
EstabilidadAlgoritmo¿El cálculo amplifica errores evitables?Algoritmo, forma algebraica u orden
ConvergenciaSecuencia o discretización¿Las aproximaciones se acercan a la solución?Parámetros, paso, inicio o método

La estrategia profesional consiste en analizar los tres niveles. Cambiar de algoritmo no arregla datos insuficientes; aumentar iteraciones no arregla una sucesión divergente; aumentar decimales mostrados no arregla inestabilidad.

13 · Exploración interactiva

Laboratorio: sensibilidad cerca de una singularidad

Estudiaremos f(x) = 1/(1−x) con x = 1−10⁻ᵏ. A medida que k crece, x se acerca a 1 y el número de condición aumenta. Después perturbamos la entrada con Δx = 10ᵖ.

EXPERIMENTO 06

Amplificación de una perturbación

x = 1 − 10⁻¹ = 0,9

Los resultados numéricos aparecen debajo.
f(x)10
Número de condición9
Error relativo previsto1e−11
Error relativo observado1e−11

La perturbación permanece controlada a esta distancia de la singularidad.

Preguntas para explorar

  1. Mantené fija la perturbación y acercá x a 1. ¿Cómo cambia κ?
  2. Compará el error relativo previsto con el observado cuando la perturbación es pequeña.
  3. ¿Qué sucede cuando la perturbación lleva la entrada exactamente a 1?
  4. ¿Ese resultado extremo es culpa del algoritmo de división o del problema?

14 · Método de análisis

Evaluar un método numérico paso a paso

  1. 1
    Definir las medidas.

    Elegir errores absolutos o relativos y las unidades relevantes.

  2. 2
    Perturbar los datos.

    Observar cómo responde la solución exacta o una referencia de alta precisión.

  3. 3
    Analizar el algoritmo.

    Buscar cancelación, escalas extremas y crecimiento de errores intermedios.

  4. 4
    Estudiar la convergencia.

    Registrar errores, residuos o diferencias al aumentar iteraciones o disminuir el paso.

  5. 5
    Comparar alternativas.

    Contrastar formulaciones, valores iniciales y algoritmos con costos semejantes.

  6. 6
    Documentar límites.

    Indicar rangos válidos, tolerancias y situaciones en las que el método puede fallar.

function experimentarPerturbacion(funcion, x, perturbacion) {
  const y = funcion(x);
  const yPerturbado = funcion(x + perturbacion);
  const errorEntrada = Math.abs(perturbacion) / Math.abs(x);
  const errorSalida = Math.abs(yPerturbado - y) / Math.abs(y);

  return {
    x,
    perturbacion,
    errorRelativoEntrada: errorEntrada,
    errorRelativoSalida: errorSalida,
    amplificacionObservada: errorSalida / errorEntrada
  };
}

console.log(experimentarPerturbacion(x => 1 / (1 - x), 0.99, 1e-8));

15 · Comprensión

Confusiones frecuentes

«Mal condicionado significa que el algoritmo está mal programado»

El condicionamiento pertenece al problema. Una implementación perfecta seguirá reflejando la sensibilidad de los datos.

«Un algoritmo estable siempre produce una respuesta precisa»

Si el problema está mal condicionado o los datos son imprecisos, un algoritmo estable puede tener un error hacia adelante grande.

«Convergencia rápida implica estabilidad»

Son propiedades distintas. Un método puede converger rápidamente cerca de la solución y comportarse mal ante redondeos o valores iniciales inadecuados.

«Si las iteraciones no cambian, el método convergió»

Puede haber estancamiento por punto flotante. Debemos examinar el residuo, una cota o la teoría del método.

«El número de condición siempre es una constante del problema»

Con frecuencia depende del punto y de la medida utilizada. Una misma función puede estar bien condicionada en una región y mal condicionada en otra.

16 · Práctica guiada

Ejercicios

Ejercicio 1: número de condición de una potencia

Calculá el número de condición relativo de f(x) = x⁵ para x ≠ 0.

Ver solución

f′(x) = 5x⁴, por lo que |x f′(x)/f(x)| = |5x⁵/x⁵| = 5. Un error relativo pequeño en la entrada se amplifica aproximadamente por cinco.

Ejercicio 2: sensibilidad de una resta

Estimá κ = (|x|+|y|)/|x−y| para x = 100.01 e y = 100.

Ver solución

κ = 200.01/0.01 = 20 001. La pequeña diferencia es muy sensible a errores relativos de los operandos.

Ejercicio 3: clasificar afirmaciones

Indicá si cada frase se refiere a condicionamiento, estabilidad o convergencia:

  1. El intervalo se reduce a la mitad en cada iteración.
  2. Una perturbación de 0.001 % cambia la salida un 10 %.
  3. Una forma racionalizada evita restar raíces cercanas.
Ver solución
  1. Convergencia: describe la reducción de las aproximaciones.
  2. Condicionamiento: describe sensibilidad del problema.
  3. Estabilidad: compara formas algorítmicas para evitar error innecesario.

Ejercicio 4: orden de convergencia

Una sucesión presenta errores 0.1, 0.01, 0.0001 y 10⁻⁸. ¿Qué orden sugiere?

Ver solución razonada

Cada error es aproximadamente el cuadrado del anterior: 0.01 = 0.1², 0.0001 = 0.01². Sugiere convergencia cuadrática, p ≈ 2.

Ejercicio 5: experimento computacional

Implementá una función que estime la amplificación de una perturbación y comparala con κ = |x/(1−x)| para varios valores cercanos a 1.

Ver una posible solución
const f = x => 1 / (1 - x);
const condicion = x => Math.abs(x / (1 - x));
const perturbacionRelativa = 1e-10;

for (const x of [0.5, 0.9, 0.99, 0.999]) {
  const dx = x * perturbacionRelativa;
  const errorSalida = Math.abs(f(x + dx) - f(x)) / Math.abs(f(x));
  console.log({
    x,
    condicion: condicion(x),
    amplificacion: errorSalida / perturbacionRelativa
  });
}

17 · Síntesis

Ideas para recordar

  • El condicionamiento mide la sensibilidad inherente del problema ante perturbaciones.
  • El número de condición relativo estima la amplificación de errores relativos pequeños.
  • El error hacia adelante mide la salida; el error hacia atrás interpreta el resultado como exacto para datos perturbados.
  • Un algoritmo estable controla los errores que introduce durante el cálculo.
  • Un problema mal condicionado limita la precisión incluso con un algoritmo estable.
  • Convergencia significa que el error tiende a cero al refinar la aproximación.
  • El orden de convergencia describe la velocidad asintótica de esa reducción.
  • Condicionamiento, estabilidad y convergencia deben analizarse por separado y en conjunto.

En el próximo tema definiremos tolerancias y criterios de parada para convertir estas medidas en decisiones robustas: cuándo aceptar una aproximación y cuándo detener un algoritmo.