01 · Punto de partida
Cuando conocer la fórmula no alcanza
En los cursos de matemática solemos buscar una respuesta exacta: una fracción, una raíz, una expresión algebraica o una función. En programación necesitamos además convertir esa respuesta en operaciones que una computadora pueda ejecutar con memoria y tiempo finitos.
Ese cambio de perspectiva abre preguntas nuevas:
- ¿Qué hacemos si el problema no tiene una fórmula cerrada?
- ¿Cómo representamos números con infinitos decimales?
- ¿Cuántas operaciones necesitamos para alcanzar una precisión determinada?
- ¿Cómo sabemos si las aproximaciones se están acercando a la solución?
- ¿Cuándo conviene detener el algoritmo?
El cálculo numérico responde estas preguntas mediante métodos que producen aproximaciones controladas. No busca simplemente “un número parecido”, sino un resultado acompañado por información sobre su error, su costo y las condiciones bajo las cuales podemos confiar en él.
02 · Definición y alcance
¿Qué estudia el cálculo numérico?
El cálculo numérico —también llamado análisis numérico cuando incluye el estudio teórico de los métodos— diseña, analiza e implementa algoritmos para resolver problemas matemáticos mediante números aproximados.
A lo largo del curso aplicaremos esta idea a diferentes familias de problemas:
Raíces
Encontrar valores que hacen cero una función con bisección, Newton-Raphson y otros métodos.
Aproximación
Construir funciones a partir de datos mediante interpolación, splines y mínimos cuadrados.
Cálculo
Aproximar derivadas e integrales cuando solo disponemos de muestras o cálculos finitos.
Sistemas lineales
Resolver ecuaciones acopladas con métodos directos e iterativos.
Ecuaciones diferenciales
Construir trayectorias aproximadas con Euler y Runge-Kutta.
Error y estabilidad
Medir la calidad, estudiar la convergencia y detectar algoritmos poco confiables.
Los métodos numéricos conectan matemática, algoritmos y experimentación. Para utilizarlos correctamente necesitamos comprender las tres áreas: la ecuación que modela el problema, el procedimiento que la aproxima y el comportamiento real del programa.
03 · Dos clases de resultado
Solución exacta y solución aproximada
Una solución exacta conserva toda la información matemática. Por ejemplo, la diagonal de un cuadrado de lado 1 es exactamente √2. Una solución aproximada reemplaza ese valor por uno cercano y representable, como 1.4142.
| Problema | Expresión exacta | Aproximación |
|---|---|---|
| Dividir una unidad en tres partes | 1/3 | 0.333333 |
| Diagonal de un cuadrado unitario | √2 | 1.414214 |
| Longitud de una circunferencia de radio 1 | 2π | 6.283185 |
Raíz de cos(x) − x = 0 | No tiene forma elemental | 0.739085… |
Una aproximación no es necesariamente inferior. Para mostrar una distancia en pantalla, simular un movimiento o resolver una ecuación física, un número con suficientes cifras correctas suele ser más útil que una expresión simbólica difícil de evaluar.
04 · Motivación
¿Por qué necesitamos métodos numéricos?
Sin fórmula cerrada
La solución existe, pero no puede despejarse
Ecuaciones como cos(x) = x requieren aproximar la raíz mediante iteraciones.
Demasiados datos
La solución exacta resulta costosa
Un sistema con miles de ecuaciones exige métodos y estructuras computacionales eficientes.
Datos medidos
La información ya es aproximada
Las mediciones de sensores incluyen resolución limitada, ruido e incertidumbre.
Modelo continuo
La computadora opera en pasos
Integrales y ecuaciones diferenciales deben convertirse en una cantidad finita de cálculos.
En cada situación aceptamos una aproximación a cambio de obtener un resultado computable. La pregunta práctica no es “¿hay error?”, porque casi siempre lo hay, sino “¿cuánto error hay y es aceptable para este problema?”.
05 · Método de trabajo
Del problema real al resultado
Un cálculo confiable comienza antes del código y termina después de obtener un número. El flujo completo puede organizarse en seis etapas:
- 1Definir el problema.
Precisar qué se conoce, qué se busca, las unidades y las restricciones.
- 2Construir el modelo matemático.
Representar las relaciones mediante funciones, ecuaciones o datos.
- 3Elegir un método numérico.
Considerar precisión, convergencia, estabilidad, costo y propiedades del problema.
- 4Implementar el algoritmo.
Traducir el método a código, validar entradas y registrar información útil.
- 5Verificar el cálculo.
Probar casos conocidos, estimar el error y comparar métodos o tamaños de paso.
- 6Interpretar el resultado.
Regresar al problema original y decidir si la respuesta es coherente y suficiente.
Un error en cualquiera de estas etapas puede producir una respuesta inútil. Un programa puede ejecutar perfectamente un algoritmo que resuelve la ecuación equivocada.
06 · Primer algoritmo iterativo
Aproximar √2 sin utilizar Math.sqrt
Buscamos un número x tal que x² = 2. Una estrategia antigua, conocida como método babilónico o de Herón, comienza con una estimación positiva y la mejora promediándola con 2/x:
Si empezamos con x₀ = 1, obtenemos:
| Iteración | Aproximación | Residuo |x² − 2| |
|---|---|---|
| 0 | 1 | 1 |
| 1 | 1.5 | 0.25 |
| 2 | 1.4166666667 | 0.0069444445 |
| 3 | 1.4142156863 | 0.0000060073 |
| 4 | 1.4142135624 | aprox. 4.5 × 10−12 |
Cada fila utiliza el resultado anterior para construir uno mejor. A esto lo llamamos método iterativo. La sucesión de aproximaciones parece estabilizarse rápidamente cerca de la raíz.
function aproximarRaizDeDos(iteraciones) {
let x = 1;
for (let i = 0; i < iteraciones; i++) {
x = (x + 2 / x) / 2;
}
return x;
}
console.log(aproximarRaizDeDos(4));
console.log(aproximarRaizDeDos(4) ** 2);
La segunda salida permite comprobar el resultado sin conocer previamente √2: si la aproximación es buena, su cuadrado debe estar muy cerca de 2.
07 · Calidad del resultado
Error, residuo y convergencia
Para evaluar un método necesitamos distinguir tres conceptos que aparecerán durante todo el curso:
- Error
- Diferencia entre la solución exacta
x*y la aproximaciónxₙ. En valor absoluto:|x* − xₙ|. - Residuo
- Cuánto incumple la aproximación la ecuación. Para
x² = 2:|xₙ² − 2|. - Convergencia
- Comportamiento por el cual las aproximaciones se acercan a una solución al continuar el proceso.
- Tolerancia
- Umbral que determina cuándo la aproximación se considera suficientemente buena.
El error verdadero requiere conocer la solución exacta, precisamente lo que muchas veces buscamos. El residuo puede calcularse directamente y es una señal útil, aunque un residuo pequeño no siempre implica un error pequeño. Estudiaremos esa diferencia con detalle al hablar de condicionamiento.
Detenerse por una condición, no por casualidad
En vez de ejecutar siempre cuatro iteraciones, podemos detener el proceso cuando el residuo sea menor que una tolerancia. También imponemos un máximo de iteraciones para evitar un ciclo interminable.
function raizCuadrada(numero, tolerancia = 1e-10, maxIteraciones = 100) {
if (numero < 0) throw new Error("Se requiere un número no negativo");
if (numero === 0) return { valor: 0, iteraciones: 0, residuo: 0 };
let x = numero >= 1 ? numero : 1;
for (let i = 1; i <= maxIteraciones; i++) {
const siguiente = (x + numero / x) / 2;
const residuo = Math.abs(siguiente ** 2 - numero);
if (residuo <= tolerancia) {
return { valor: siguiente, iteraciones: i, residuo };
}
x = siguiente;
}
throw new Error("El método no alcanzó la tolerancia solicitada");
}
console.log(raizCuadrada(2));
console.log(raizCuadrada(10, 1e-12));
08 · Fuentes de incertidumbre
¿De dónde provienen los errores?
El error final no tiene una única causa. Conviene identificar al menos cuatro niveles:
| Fuente | Qué ocurre | Ejemplo |
|---|---|---|
| Modelo | La formulación simplifica el fenómeno real. | Ignorar la resistencia del aire en una simulación. |
| Datos | Las entradas provienen de mediciones limitadas o ruidosas. | Un sensor informa 20.3 °C con resolución de 0.1 °C. |
| Truncamiento | Un proceso infinito se reemplaza por una cantidad finita de pasos. | Detener una iteración o usar una suma finita. |
| Redondeo | La computadora almacena números con precisión finita. | 0.1 + 0.2 no resulta exactamente 0.3. |
| Implementación | El código no representa correctamente el método. | Actualizar una variable en el orden equivocado. |
El análisis numérico se concentra especialmente en los errores de truncamiento y redondeo, pero un resultado profesional debe considerar toda la cadena. No tiene sentido pedir quince decimales al algoritmo si los datos fueron medidos con dos cifras significativas.
09 · Elegir un método
No existe un algoritmo mejor para todos los casos
Dos métodos pueden resolver el mismo problema y comportarse de manera muy diferente. Para compararlos utilizaremos varios criterios:
Exactitud
Calidad de la aproximación
Cuán cerca está el resultado de la solución que buscamos.
Eficiencia
Tiempo y memoria
Cuántas evaluaciones, operaciones y recursos necesita.
Robustez
Comportamiento ante casos difíciles
Si funciona con valores iniciales variados, datos extremos o pequeñas perturbaciones.
Estabilidad
Control de los errores
Si evita amplificar excesivamente las imprecisiones durante el cálculo.
Por ejemplo, un método para raíces puede ser muy rápido cerca de la solución pero fallar con una estimación inicial inadecuada. Otro puede ser más lento, aunque garantice convergencia bajo condiciones fáciles de comprobar. Elegir requiere conocer el problema y las fortalezas de cada alternativa.
10 · Exploración interactiva
Laboratorio: observar una sucesión de aproximaciones
Modificá el número, la estimación inicial y la cantidad de iteraciones. El gráfico muestra la distancia de cada aproximación respecto del valor calculado por Math.sqrt, usado aquí únicamente como referencia para estudiar el método.
Método babilónico
xₙ₊₁ = (xₙ + 2/xₙ) / 2
La aproximación mejora rápidamente durante las primeras iteraciones.
Preguntas para explorar
- ¿Cuántas iteraciones hacen falta para que las cifras visibles dejen de cambiar?
- ¿Qué sucede al comenzar con una estimación muy alejada de la raíz?
- Compará números menores y mayores que 1. ¿Cambia la velocidad de convergencia?
- ¿Seguir iterando mejora siempre el valor mostrado por JavaScript?
11 · Verificación computacional
Cómo comprobar un algoritmo numérico
Un único ejemplo exitoso no demuestra que el programa sea correcto. Conviene combinar varias estrategias:
- ACasos simples.
Probar valores cuya respuesta conocemos, como las raíces de 0, 1, 4 y 9.
- BPropiedades.
Verificar que el resultado al cuadrado se acerque al número original.
- CComparación.
Contrastar con otro algoritmo o con una función de referencia.
- DCasos límite.
Examinar cero, números muy pequeños, valores grandes y entradas inválidas.
- ESeguimiento.
Registrar iteraciones, residuos y condiciones de parada para explicar el resultado.
function comprobarRaiz(numero, aproximacion, tolerancia) {
const residuo = Math.abs(aproximacion ** 2 - numero);
return {
numero,
aproximacion,
residuo,
aceptada: residuo <= tolerancia
};
}
console.log(comprobarRaiz(2, 1.41421356237, 1e-9));
console.log(comprobarRaiz(9, 3, 1e-12));
12 · Comprensión
Confusiones frecuentes
«Aproximado significa incorrecto»
Una aproximación es útil cuando conocemos su calidad y satisface las necesidades del problema. Toda medición física y casi todo cálculo computacional contienen algún grado de aproximación.
«Más iteraciones siempre producen un resultado mejor»
Cuando se alcanza el límite de precisión de la representación, seguir iterando puede no cambiar el valor. En métodos inestables, incluso puede empeorarlo.
«Si el residuo es pequeño, el error también lo es»
No necesariamente. La relación depende de la sensibilidad del problema. Una función muy plana puede tener residuos pequeños lejos de la raíz.
«La computadora calcula con números reales exactos»
JavaScript utiliza principalmente números de punto flotante con una cantidad finita de bits. El tema siguiente estudia cómo se representan y qué consecuencias tiene.
«Un algoritmo que funciona una vez ya está validado»
Necesitamos casos conocidos, casos límite, propiedades matemáticas y diagnósticos. La validación debe corresponder al rango real de uso.
13 · Práctica guiada
Ejercicios
Ejercicio 1: clasificar resultados
Indicá si cada expresión conserva una solución exacta o presenta una aproximación:
π / 40.7854como valor deπ / 42 / 70.285714como valor de2 / 7
Ver solución
Las expresiones π/4 y 2/7 son exactas. Los decimales 0.7854 y 0.285714 son aproximaciones finitas.
Ejercicio 2: realizar dos iteraciones
Usá el método babilónico para aproximar √10 comenzando con x₀ = 3. Calculá x₁, x₂ y el residuo final |x₂² − 10|.
Ver solución razonada
x₁ = (3 + 10/3)/2 = 3.1666666667. Luego x₂ = (x₁ + 10/x₁)/2 ≈ 3.1622807018. El residuo es aproximadamente 0.0000192367.
Ejercicio 3: mejorar una función
El siguiente código puede ejecutar un ciclo infinito. Agregá validación de entradas, una tolerancia y un máximo de iteraciones.
function raiz(numero) {
let x = numero;
while (x * x !== numero) {
x = (x + numero / x) / 2;
}
return x;
}
Ver una posible solución
function raiz(numero, tolerancia = 1e-10, maxIteraciones = 100) {
if (!Number.isFinite(numero) || numero < 0) {
throw new Error("El número debe ser finito y no negativo");
}
if (numero === 0) return 0;
let x = numero >= 1 ? numero : 1;
for (let i = 0; i < maxIteraciones; i++) {
const siguiente = (x + numero / x) / 2;
if (Math.abs(siguiente ** 2 - numero) <= tolerancia) {
return siguiente;
}
x = siguiente;
}
throw new Error("No se alcanzó la tolerancia");
}
Ejercicio 4: diseñar pruebas
Proponé cinco casos de prueba para la función anterior e indicá qué propiedad comprobarías en cada uno.
Ver una posible respuesta
0: debe devolver exactamente 0 sin dividir por cero.1: debe devolver un valor cercano a 1.9: el resultado debe ser cercano a 3 y tener residuo pequeño.0.04: debe manejar correctamente números entre 0 y 1.-2: debe rechazar la entrada real inválida.- Opcionalmente,
NaNeInfinity: deben rechazarse como entradas no finitas.
14 · Síntesis
Ideas para recordar
- El cálculo numérico transforma problemas matemáticos en procedimientos finitos ejecutables.
- Una aproximación útil incluye un valor, una medida de calidad y un criterio de parada.
- Los métodos iterativos generan una sucesión de estimaciones que esperamos que converja.
- Error y residuo están relacionados, pero no son la misma cantidad.
- Los errores pueden provenir del modelo, los datos, el truncamiento, el redondeo o la implementación.
- Exactitud, eficiencia, robustez y estabilidad ayudan a elegir entre algoritmos.
- Todo resultado numérico debe verificarse e interpretarse dentro del problema original.
En el próximo tema estudiaremos cómo representa números una computadora: sistema binario, punto flotante, estándar IEEE 754, rango, precisión y comportamientos particulares del tipo Number de JavaScript.