Fundamentos · Tema 20

Proyecto integrador: aproximar, medir y visualizar

Un experimento numérico completo con JavaScript: plantear el problema, implementar dos métodos, registrar cada iteración, controlar el error, visualizar la convergencia y comunicar qué podemos concluir.

01 · El desafío final

Construir una herramienta que explique su resultado

El proyecto consiste en aproximar la raíz cuadrada de un número no negativo S sin usar Math.sqrt dentro de los algoritmos. No buscamos solamente obtener un decimal: queremos saber cómo fue producido, cuánto puede confiarse en él y por qué terminó el cálculo.

ENTRADA

Definir

Objetivo S, método, tolerancia y máximo de iteraciones.

PROCESO

Aproximar

Ejecutar Newton o bisección y conservar la trayectoria.

MEDICIÓN

Evaluar

Calcular cambio, residuo, cota y error de validación.

SALIDA

Comunicar

Mostrar tabla, gráfico, estado final y motivo de parada.

La raíz exacta se utilizará mediante Math.sqrt(S) únicamente para validar y medir el error del experimento. Los métodos no pueden consultarla para producir su aproximación ni decidir cuándo detenerse.

02 · Antes del código

Requisitos y criterios de aceptación

Escribir requisitos evita adaptar el objetivo después de observar los resultados. La herramienta deberá:

  1. aceptar un número finito S≥0;
  2. implementar Newton y bisección de manera independiente;
  3. registrar aproximación, cambio, residuo, cota y error de validación;
  4. detenerse por tolerancia, estancamiento, fallo o máximo de iteraciones;
  5. mostrar una tabla y un gráfico comparables;
  6. distinguir una salida aceptada de una ejecución incompleta;
  7. funcionar con objetivos menores y mayores que 1.

Adoptaremos una escala mixta para no exigir la misma distancia absoluta en todos los tamaños:

umbral(x) = ε · (1 + |x|)

Para Newton exigiremos cambio pequeño y residuo escalado. Para bisección aceptaremos cuando la mitad del intervalo que encierra la raíz quede dentro del umbral. Son garantías diferentes y el informe debe conservar esa diferencia.

03 · Traducir el problema

La raíz como ecuación y como intervalo

Buscar √S equivale a encontrar un x≥0 que satisfaga:

f(x) = x² − S = 0

Esta formulación proporciona el residuo |x²−S|. También permite construir un intervalo inicial:

a₀ = 0    y    b₀ = max(1, S)

Si S≥0, entonces a₀²≤S≤b₀². La raíz queda encerrada entre ambos extremos. Para S=0 podemos responder inmediatamente.

Las unidades merecen atención: si S representa un área en m², su raíz representa una longitud en m. El residuo está en m² y no debería compararse sin escala con una tolerancia expresada en m.

04 · Dos caminos complementarios

Newton y bisección

Newton

Rapidez local

Actualiza x mediante (x+S/x)/2. Cerca de la raíz suele duplicar aproximadamente los dígitos correctos por iteración.

Bisección

Garantía por encierro

Divide un intervalo y conserva la mitad que contiene la raíz. Avanza de forma predecible y produce una cota directa.

Intercambios principales entre los métodos del proyecto.
PropiedadNewtonBisección
Información usadaFórmula específica para la raíz.Orden y cambio de signo o encierro.
Velocidad típicaMuy rápida cerca de la solución.El ancho se divide por 2.
Garantía naturalResiduo y cambio estimados.La raíz permanece en [a,b].
Riesgo generalDepende del inicio y de la función.Más iteraciones.

Comparar métodos no busca declarar un vencedor universal. Muestra que velocidad, robustez, costo y garantía son dimensiones diferentes.

05 · Separar responsabilidades

Arquitectura del experimento

Mezclar cálculo, dibujo y manipulación de controles dificulta probar el proyecto. Organizaremos el flujo en componentes:

VALIDAREntrada y opciones
EJECUTARNewton o bisección
REGISTRARTraza por iteración
ANALIZARError y diagnóstico
PRESENTARTabla y gráfico

Cada método devolverá un objeto con la misma forma:

{
  metodo: 'newton',
  ok: true,
  motivo: 'tolerancia',
  valor: 1.414213562373095,
  iteraciones: 5,
  traza: [
    { iteracion: 0, valor: 1, cambio: null, residuo: 1 },
    // ...
  ]
}

Una interfaz común permite comparar, tabular y graficar sin incorporar condiciones específicas del método en cada componente visual.

06 · Núcleo numérico

Implementar métodos que conserven evidencia

Newton registra cada candidato y aplica un criterio combinado:

function aproximarNewton(S, tolerancia, maxIteraciones) {
  if (S === 0) return resultadoExacto('newton', 0);

  let x = Math.max(1, S);
  const traza = [crearFila(0, x, null, S)];

  for (let n = 1; n <= maxIteraciones; n += 1) {
    const siguiente = (x + S / x) / 2;
    const cambio = Math.abs(siguiente - x);
    const residuo = Math.abs(siguiente * siguiente - S);
    traza.push(crearFila(n, siguiente, cambio, S));

    const pasoOk = cambio <= tolerancia * (1 + Math.abs(siguiente));
    const residuoOk = residuo <= tolerancia * (1 + S);
    if (pasoOk && residuoOk) {
      return completar('newton', true, 'tolerancia', traza);
    }
    if (Object.is(siguiente, x)) {
      return completar('newton', false, 'estancamiento', traza);
    }
    x = siguiente;
  }
  return completar('newton', false, 'max-iteraciones', traza);
}

En bisección, la evidencia principal es el intervalo:

function aproximarBiseccion(S, tolerancia, maxIteraciones) {
  let a = 0;
  let b = Math.max(1, S);
  const traza = [];

  for (let n = 0; n <= maxIteraciones; n += 1) {
    const medio = (a + b) / 2;
    const cota = (b - a) / 2;
    traza.push(crearFila(n, medio, n ? cota : null, S, cota));

    if (cota <= tolerancia * (1 + Math.abs(medio))) {
      return completar('biseccion', true, 'intervalo', traza);
    }
    if (n === maxIteraciones) break;
    if (medio * medio <= S) a = medio;
    else b = medio;
  }
  return completar('biseccion', false, 'max-iteraciones', traza);
}

07 · No reducir la calidad a un solo número

Medir cambio, residuo, cota y error

Cada fila de la traza puede contener varias medidas:

Cambio
|xₙ−xₙ₋₁|. Describe cuánto avanzó el método.
Residuo
|xₙ²−S|. Mide cuánto incumple la ecuación.
Cota
En bisección, (b−a)/2 limita el error del punto medio.
Error de validación
|xₙ−Math.sqrt(S)|. Evalúa el experimento sin guiar el método.

El error relativo de validación puede escribirse como:

error relativo = |xₙ − √S| / max(√S, escala mínima)

Para S=0 se necesita una escala mínima o un tratamiento especial. Como la respuesta cero puede devolverse exactamente, el proyecto resuelve ese caso antes de iterar.

08 · Convertir la traza en explicación

Tabla para exactitud, gráfico para tendencia

La tabla permite inspeccionar valores concretos y el motivo de cada paso. El gráfico permite comparar velocidades y reconocer regímenes. Ninguno sustituye al otro.

Como el error puede pasar de unidades a 10⁻¹⁵, una escala vertical lineal comprimiría las últimas iteraciones. Usaremos el logaritmo decimal del error:

altura proporcional a log₁₀(error)

En esa escala, bajar una unidad vertical significa reducir el error aproximadamente diez veces. Una línea con descenso pronunciado indica una rápida ganancia de cifras correctas.

Decisiones de comunicación del proyecto.
ElementoDecisiónRazón
Eje horizontalNúmero de iteraciónCompara costo en pasos.
Eje verticalError absoluto logarítmicoMuestra varios órdenes de magnitud.
Dos coloresUno por métodoPermite seguir trayectorias superpuestas.
Tabla recortadaPrimeras y últimas filasEvita saturar sin ocultar el final.

09 · Antes de confiar

Plan de pruebas y casos frontera

Las pruebas deben cubrir casos diseñados, no solamente valores aleatorios:

Casos mínimos para validar el proyecto.
EntradaQué debería ocurrirQué pone a prueba
S=0Resultado exacto 0 sin división problemática.Caso especial.
S=1Resultado exacto o inmediato.Raíz representable.
S=2Aproximación conocida y residuo pequeño.Caso no exacto.
S=0.01Resultado cercano a 0.1.Escala menor que uno.
S=10 000Resultado cercano a 100.Escala grande.
S<0 o infinitoRechazo explícito.Validación de entrada.
Máximo muy pequeñoEstado “presupuesto agotado”.Contrato de salida.
function verificarResultado(resultado, S, tolerancia) {
  if (!resultado.ok) return false;
  const residuo = Math.abs(resultado.valor ** 2 - S);
  return residuo <= tolerancia * (1 + S);
}

console.assert(verificarResultado(aproximarNewton(2, 1e-10, 50), 2, 1e-10));
console.assert(aproximarNewton(-1, 1e-10, 50).motivo === 'entrada-invalida');

10 · Proyecto en funcionamiento

Laboratorio: comparar aproximaciones

Modificá el objetivo, la tolerancia y el presupuesto. Podés observar un método o ambos. La referencia exacta se usa para dibujar el error, no para calcular las aproximaciones.

PROYECTO 20

Aproximar √S y justificar el resultado

S = 2 · ε = 10⁻¹⁰

Los resultados aparecen debajo del gráfico.
MétodonAproximaciónCambio / cotaResiduoError validado
Newton5 iteraciones
Bisección32 iteraciones
Mejor aproximación1,414213562
VerificaciónResiduo aceptable

Ambos métodos alcanzaron su criterio dentro del presupuesto.

El eje vertical usa el logaritmo decimal del error absoluto validado. El piso representa errores cero o inferiores a la resolución mostrada.

Experimentos propuestos

  1. Compará las pendientes de error de ambos métodos. ¿Cuál gana cifras correctas más rápido?
  2. Reducí el máximo a 5. ¿Qué método alcanza la tolerancia 10⁻¹⁰ para S=2?
  3. Probá objetivos menores que 1 y mayores que 50. ¿Cómo cambia la cantidad de iteraciones?
  4. Llevá la tolerancia a 10⁻¹⁵. ¿Aparece estancamiento o un límite de precisión?

11 · Leer el resultado completo

Rapidez, garantía y costo

Para S=2, Newton suele alcanzar precisión cercana a la de Number en pocas iteraciones. Bisección necesita muchas más, pero cada paso reduce de manera garantizada el intervalo a la mitad.

Una comparación justa debe indicar:

  • el mismo objetivo y tolerancia;
  • qué criterio usa cada método;
  • cantidad de iteraciones y evaluaciones;
  • residuo final y, si existe, cota del error;
  • estado de finalización y precisión numérica disponible.

Contar solo iteraciones también puede ser insuficiente: una iteración costosa puede realizar más evaluaciones que varias iteraciones simples. En este proyecto ambas operaciones son baratas, pero la arquitectura deja espacio para registrar tiempo o evaluaciones.

12 · El informe también es parte del programa

Guardar un resultado reproducible

El informe puede exportarse como un objeto JSON con entrada, configuración, salidas y metadatos:

function crearInforme({ S, tolerancia, maxIteraciones, resultados }) {
  return {
    proyecto: 'aproximacion-raiz-cuadrada',
    creadoEn: new Date().toISOString(),
    entrada: { S },
    configuracion: { tolerancia, maxIteraciones },
    resultados: resultados.map(resultado => ({
      metodo: resultado.metodo,
      ok: resultado.ok,
      motivo: resultado.motivo,
      valor: resultado.valor,
      iteraciones: resultado.iteraciones,
      residuo: Math.abs(resultado.valor ** 2 - S)
    }))
  };
}

const texto = JSON.stringify(informe, null, 2);

La fecha no basta para reproducir si el código cambia. En un proyecto real conviene agregar versión, identificador de revisión, entorno y cualquier configuración relevante. La traza completa puede guardarse separadamente si el informe resumido debe ser pequeño.

La accesibilidad también comunica: controles con etiquetas, resultados textuales además del color, descripción del gráfico y estados anunciados permiten que el experimento no dependa exclusivamente de la visión.

13 · Extender y comprobar

Desafíos de integración

Desafío 1: validar entradas

Definí qué debe hacer la API ante S=-1, NaN, tolerancia negativa o máximo de iteraciones no entero.

Ver una política posible

Devolver un objeto con ok:false y un motivo específico para cada opción inválida, sin iniciar la iteración. Otra API podría lanzar excepciones; lo importante es documentar y aplicar consistentemente el contrato.

Desafío 2: estimar pasos de bisección

Si el intervalo inicial tiene ancho L, calculá cuántos pasos garantizan ancho no mayor que ε.

Ver solución

Después de n divisiones, el ancho es L/2ⁿ. Se necesita n≥log₂(L/ε); como n es entero, usamos Math.ceil(Math.log2(L/ε)).

Desafío 3: método híbrido

Proponé una estrategia que combine la garantía de bisección con la rapidez de Newton.

Ver diseño orientativo

Mantené un intervalo válido. Intentá un paso de Newton; si el candidato es finito y cae dentro del intervalo, aceptalo. Si sale fuera o no mejora, usá el punto medio. Después actualizá el intervalo según el signo. Así el método aprovecha pasos rápidos sin abandonar el encierro.

Desafío 4: ampliar el experimento

Agregá una raíz cúbica o una ecuación general y determiná qué componentes pueden reutilizarse.

Ver análisis

La validación específica, la función, el paso de Newton y la construcción del intervalo cambian. La traza, las métricas generales, el contrato de salida, la tabla, el gráfico, la exportación y gran parte de las pruebas pueden conservarse.

Desafío 5: evitar una prueba circular

Explicá por qué no debe usarse Math.sqrt(S) en la condición de parada del método.

Ver solución

Porque la condición conocería la respuesta que el método pretende aproximar. Puede usarse como oráculo en pruebas para medir el error, pero la operación real debe decidir mediante residuo, cambio o cota disponibles sin la solución.

14 · Cierre del recorrido

Del número aislado a una conclusión defendible

  • El proyecto comienza con requisitos y criterios de aceptación explícitos.
  • Formular x²−S=0 proporciona un residuo verificable.
  • Newton y bisección muestran intercambios entre rapidez y garantía.
  • Una traza convierte la ejecución en datos analizables.
  • Cambio, residuo, cota y error verdadero responden preguntas distintas.
  • La referencia exacta valida el experimento, pero no guía el algoritmo.
  • Tablas y gráficos aportan precisión local y visión global.
  • Los casos frontera y estados de fallo forman parte del resultado.
  • Separar cálculo, análisis y presentación mejora pruebas y reutilización.
  • Una conclusión responsable conserva condiciones, límites y evidencia.

Completaste la introducción

Ahora contás con un lenguaje para pensar cambio, proximidad, infinito, aproximación y error desde la programación. El siguiente paso no es memorizar más fórmulas, sino aplicar este ciclo a nuevos problemas: modelar, experimentar, medir, cuestionar y justificar.