Experimentos confiables · Tema 25

Aproximación numérica de límites con JavaScript

Aprendé a diseñar tablas bilaterales, reconocer patrones y controlar los errores que aparecen al representar números reales con precisión finita.

01 · Alcance

Una aproximación aporta evidencia, no una demostración

Una computadora solo puede evaluar una cantidad finita de entradas representables. Por eso, ningún experimento numérico recorre todos los valores arbitrariamente próximos a un punto.

Sin embargo, una exploración bien diseñada sirve para:

  • formular un candidato para el límite;
  • comparar el comportamiento izquierdo y derecho;
  • detectar crecimiento sin cota, saltos u oscilaciones;
  • comprobar un resultado algebraico;
  • descubrir errores de implementación o inestabilidad numérica.

02 · Límites finitos

Muestrear desde ambos lados

Para explorar limx → a f(x), elegimos distancias positivas h y evaluamos:

Una secuencia práctica utiliza potencias de diez:

h = 10−1, 10−2, 10−3, …

Para f(x) = x² + 1 en a = 2:

Aproximación bilateral del límite 5.
hf(2 − h)f(2 + h)
0,14,615,41
0,014,96015,0401
0,0014,9960015,004001

03 · Diseño de pasos

Usar varias escalas y conservar la distancia real

Un único valor de h no muestra una tendencia. Conviene registrar para cada nivel:

  • la distancia solicitada;
  • las entradas realmente representadas;
  • las dos salidas;
  • la diferencia entre lados;
  • la diferencia respecto de un candidato, si existe.

Las potencias de diez son fáciles de leer, pero no tienen un privilegio matemático. También pueden usarse pasos geométricos como hₙ = h₀/2ⁿ.

Alternar secuencias ayuda a detectar patrones que una sola grilla podría ocultar, especialmente en funciones oscilatorias.

04 · Diagnóstico lateral

No promediar antes de comparar

El promedio:

[f(a − h) + f(a + h)]/2

puede ser útil como estimación exploratoria cuando ambos lados parecen converger al mismo valor. Pero puede esconder una discontinuidad.

Para una función con:

f(x) = −1 si x < 0;    f(x) = 1 si x ≥ 0

el promedio lateral es siempre cero, aunque la función nunca se aproxima a cero desde ninguno de los lados.

05 · Candidato finito

Medir estabilización, no igualdad exacta

Si proponemos un candidato L, calculamos errores:

e₋(h) = |f(a − h) − L|    y    e₊(h) = |f(a + h) − L|

La evidencia es favorable cuando ambos errores disminuyen al reducir h. No exigimos que las salidas sean exactamente iguales a L.

Sin candidato previo, podemos observar diferencias entre niveles consecutivos. Que las últimas muestras cambien poco es una señal de estabilización, pero no una prueba: una convergencia lenta o una meseta temporal puede engañar.

Una tolerancia debe expresarse explícitamente y relacionarse con la escala del problema.

06 · Firmas numéricas

Reconocer distintos comportamientos

Patrones que puede sugerir una tabla bilateral.
ObservaciónInterpretación posiblePrecaución
Ambos lados se acercan al mismo númeroLímite finitoPuede ser una estabilización temporal.
Cada lado se estabiliza en un número distintoSaltoNo ocultarlo mediante un promedio.
Las magnitudes crecen al reducir hLímite infinitoDescartar desbordamiento artificial.
Los signos o valores cambian persistentementeOscilaciónProbar secuencias alternativas.
Aparecen NaN o valores ausentesProblema de dominio o cálculoNo constituye por sí solo una clasificación.

07 · Entradas sin cota

Para x → ±∞ aumentamos la magnitud

En un límite al infinito no reducimos h. Evaluamos entradas de magnitud creciente:

x = ±10, ±10², ±10³, …

Las dos direcciones deben mantenerse separadas. Para f(x) = 3 + 2/x:

f(−10ⁿ) → 3    y    f(10ⁿ) → 3

Para , en cambio, la cola negativa tiende a −∞ y la positiva a +∞.

Conviene utilizar escalas logarítmicas para visualizar valores distribuidos en muchos órdenes de magnitud.

08 · Reformulación

La fórmula equivalente puede ser más confiable

Para aproximar:

limh → 0 [√(1 + h) − 1]/h

la expresión directa resta dos números muy cercanos. Racionalizando:

[√(1 + h) − 1]/h = 1/[√(1 + h) + 1]

La segunda forma evita cancelación y se aproxima de manera estable a 1/2.

Otros recursos útiles son:

  • Math.log1p(x) para calcular ln(1 + x) con x pequeño;
  • Math.expm1(x) para calcular eˣ − 1 con x pequeño;
  • normalizar polinomios antes de evaluar cocientes en entradas enormes.

09 · Límite de la representación

Un paso demasiado pequeño deja de acercarse

JavaScript utiliza normalmente números IEEE 754 de doble precisión. Cerca de un número grande, la separación entre valores representables también es mayor.

Puede ocurrir:

a + h === a

aunque matemáticamente h > 0. Desde ese momento, reducir h ya no genera una nueva entrada y puede incluso evaluar exactamente en el punto excluido.

Number.EPSILON mide la separación relativa alrededor de 1; no es una tolerancia universal para cualquier escala.

También debemos controlar:

  • desbordamiento hacia Infinity;
  • subdesbordamiento hacia cero;
  • errores de redondeo decimal;
  • cancelación al restar cantidades próximas.

10 · Criterios de detención

Detenerse con un informe, no con una certeza falsa

Un explorador numérico debe finalizar cuando ocurra alguna condición controlada:

  • se alcanzó la cantidad máxima de niveles;
  • las entradas dejaron de cambiar por precisión;
  • la función salió del dominio;
  • apareció un valor no finito;
  • las diferencias quedaron debajo de una tolerancia durante varios niveles.

El resultado debería expresarse como «evidencia compatible con un límite cercano a L», junto con las muestras y advertencias. La palabra «demostrado» no corresponde a un criterio puramente numérico.

11 · Diseño del resultado

Conservar evidencia y advertencias

En lugar de devolver solamente un número, una herramienta puede producir:

{ candidato, muestras, error, ladosCompatibles, advertencias }

Esta estructura permite distinguir:

  • el valor propuesto;
  • las observaciones que lo respaldan;
  • la calidad de la estabilización;
  • los problemas de dominio o precisión;
  • la diferencia entre conclusión matemática y heurística.

12 · Exploración interactiva

Laboratorio: comparar ocho escalas

Elegí un comportamiento y avanzá entre niveles. El gráfico conserva las series izquierda y derecha para evitar que un promedio oculte información.

EXPERIMENTO 25

Muestras, patrón y advertencia

f(x) = x² + 1, x → 2

Las muestras y el diagnóstico aparecen debajo.
Muestra izquierda4,61
Muestra derecha5,41
Candidato5
PatrónConvergencia bilateral

Ambos lados se aproximan a 5; la tabla respalda el resultado algebraico.

Violeta representa la muestra izquierda o negativa y naranja la derecha o positiva. En el caso infinito se grafica el logaritmo de la magnitud.

Preguntas para explorar

  1. ¿Qué diferencia numérica existe entre el límite finito y el hueco?
  2. ¿Por qué el promedio del salto sería engañoso?
  3. ¿Cómo cambia la escala vertical para el límite infinito?
  4. ¿Las ocho muestras bastan para demostrar que una función oscila?

13 · Implementación

Generar una tabla bilateral

function explorarLimite(funcion, a, niveles = 8) {
  const muestras = [];

  for (let n = 1; n <= niveles; n++) {
    const h = 10 ** -n;
    const izquierda = a - h;
    const derecha = a + h;
    muestras.push({
      n,
      h,
      izquierda,
      valorIzquierdo: funcion(izquierda),
      derecha,
      valorDerecho: funcion(derecha),
      pasoRepresentable: izquierda !== a && derecha !== a
    });
  }
  return muestras;
}

console.log(explorarLimite(x => x ** 2 + 1, 2));

Detectar un paso agotado

function primerPasoNoRepresentable(a, maxNivel = 25) {
  for (let n = 1; n <= maxNivel; n++) {
    const h = 10 ** -n;
    if (a + h === a || a - h === a) {
      return { n, h, advertencia: "el paso ya no modifica a" };
    }
  }
  return null;
}

console.log(primerPasoNoRepresentable(1));

Comparar una forma directa y otra estable

const directa = h => (Math.sqrt(1 + h) - 1) / h;
const estable = h => 1 / (Math.sqrt(1 + h) + 1);

for (const h of [1e-4, 1e-8, 1e-12, 1e-16]) {
  console.log({ h, directa: directa(h), estable: estable(h) });
}

Devolver un diagnóstico prudente

const resultado = {
  candidato: 5,
  ladosCompatibles: true,
  nivelesAnalizados: 8,
  demostrado: false,
  advertencias: [
    "El diagnóstico se basa en una cantidad finita de muestras"
  ]
};

console.log(resultado);

14 · Comprensión

Confusiones frecuentes

«Evaluar una vez muy cerca calcula el límite»

Una muestra no describe la tendencia, el otro lado ni posibles oscilaciones.

«Cuanto menor sea h, mejor será siempre el resultado»

Pasos demasiado pequeños pueden sufrir cancelación o dejar de modificar la entrada representada.

«Promediar los lados elimina el error»

Puede ocultar un salto con valores laterales opuestos.

«Infinity significa que el límite es infinito»

También puede aparecer por desbordamiento o división exacta por cero.

«Si las últimas cifras se repiten, la convergencia está demostrada»

El redondeo o una estabilización temporal pueden producir cifras repetidas.

«Number.EPSILON sirve como tolerancia universal»

Es una referencia relativa alrededor de uno. La tolerancia debe considerar la escala y el objetivo del cálculo.

15 · Práctica guiada

Ejercicios de comprensión

Ejercicio 1: tabla bilateral

Construí tres niveles para (x² − 4)/(x − 2) alrededor de a = 2. ¿Qué candidato sugieren?

Ver solución

Para x ≠ 2, la expresión es x + 2. Las dos columnas se aproximan a 4, aunque la función original no esté definida en el punto.

Ejercicio 2: no promediar

Las muestras izquierdas se acercan a −3 y las derechas a 3. ¿Por qué cero no es un candidato válido?

Ver solución

Cero es solo el promedio. Los límites laterales son diferentes y no existe un límite bilateral.

Ejercicio 3: límite al infinito

Diseñá entradas para explorar (2x + 1)/x cuando x → +∞.

Ver solución

Podemos usar x = 10, 10², 10³, …. La forma 2 + 1/x muestra que las salidas se aproximan a 2.

Ejercicio 4: cancelación

Explicá por qué (√(1 + h) − 1)/h puede fallar para h muy pequeño.

Ver solución

Se restan números casi iguales y se pierden cifras significativas. La forma 1/(√(1 + h) + 1) es más estable.

Ejercicio 5: paso representable

¿Qué debe hacer el programa si detecta que a + h === a?

Ver solución

Debe detener esa dirección, registrar una advertencia y evitar presentar evaluaciones repetidas como nueva evidencia.

Ejercicio 6: pensar como programador

Indicá al menos tres problemas del siguiente aproximador:

function limite(funcion, a) {
  return funcion(a + Number.EPSILON);
}

console.log(limite(x => 1 / x, 0));
Ver solución

Solo evalúa el lado derecho, usa un único paso, trata Number.EPSILON como distancia universal, no comprueba dominio ni estabilidad y devuelve una muestra como si fuera el límite.

16 · Cierre del curso

Ideas para recordar

  • Una aproximación numérica aporta evidencia, no una demostración.
  • Los límites finitos requieren muestras separadas desde izquierda y derecha.
  • Los límites al infinito se exploran aumentando la magnitud de las entradas.
  • Un promedio nunca debe ocultar diferencias laterales.
  • Las fórmulas equivalentes pueden tener distinta estabilidad numérica.
  • Un paso demasiado pequeño puede dejar de producir una entrada diferente.
  • El resultado debe incluir muestras, candidato, calidad y advertencias.
  • El análisis algebraico y el experimento computacional se complementan.

Con este tema completaste el recorrido por límites, asíntotas y continuidad. Estas herramientas forman la base conceptual para estudiar posteriormente derivadas, integrales y métodos computacionales de cálculo.