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.
Definir
Objetivo S, método, tolerancia y máximo de iteraciones.
Aproximar
Ejecutar Newton o bisección y conservar la trayectoria.
Evaluar
Calcular cambio, residuo, cota y error de validación.
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á:
- aceptar un número finito
S≥0; - implementar Newton y bisección de manera independiente;
- registrar aproximación, cambio, residuo, cota y error de validación;
- detenerse por tolerancia, estancamiento, fallo o máximo de iteraciones;
- mostrar una tabla y un gráfico comparables;
- distinguir una salida aceptada de una ejecución incompleta;
- funcionar con objetivos menores y mayores que 1.
Adoptaremos una escala mixta para no exigir la misma distancia absoluta en todos los tamaños:
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:
Esta formulación proporciona el residuo |x²−S|. También permite construir un intervalo inicial:
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.
| Propiedad | Newton | Bisección |
|---|---|---|
| Información usada | Fórmula específica para la raíz. | Orden y cambio de signo o encierro. |
| Velocidad típica | Muy rápida cerca de la solución. | El ancho se divide por 2. |
| Garantía natural | Residuo y cambio estimados. | La raíz permanece en [a,b]. |
| Riesgo general | Depende 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:
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)/2limita 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:
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:
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.
| Elemento | Decisión | Razón |
|---|---|---|
| Eje horizontal | Número de iteración | Compara costo en pasos. |
| Eje vertical | Error absoluto logarítmico | Muestra varios órdenes de magnitud. |
| Dos colores | Uno por método | Permite seguir trayectorias superpuestas. |
| Tabla recortada | Primeras y últimas filas | Evita 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:
| Entrada | Qué debería ocurrir | Qué pone a prueba |
|---|---|---|
S=0 | Resultado exacto 0 sin división problemática. | Caso especial. |
S=1 | Resultado exacto o inmediato. | Raíz representable. |
S=2 | Aproximación conocida y residuo pequeño. | Caso no exacto. |
S=0.01 | Resultado cercano a 0.1. | Escala menor que uno. |
S=10 000 | Resultado cercano a 100. | Escala grande. |
S<0 o infinito | Rechazo explícito. | Validación de entrada. |
| Máximo muy pequeño | Estado “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.
Aproximar √S y justificar el resultado
S = 2 · ε = 10⁻¹⁰
| Método | n | Aproximación | Cambio / cota | Residuo | Error validado |
|---|
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
- Compará las pendientes de error de ambos métodos. ¿Cuál gana cifras correctas más rápido?
- Reducí el máximo a 5. ¿Qué método alcanza la tolerancia
10⁻¹⁰paraS=2? - Probá objetivos menores que 1 y mayores que 50. ¿Cómo cambia la cantidad de iteraciones?
- 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=0proporciona 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.