Fundamentos · Tema 01

Introducción al cálculo numérico

Cómo transformar un problema matemático en un algoritmo que produzca una aproximación útil, verificable y suficientemente precisa.

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:

f(x)=0

Raíces

Encontrar valores que hacen cero una función con bisección, Newton-Raphson y otros métodos.

p(x)

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.

Ax=b

Sistemas lineales

Resolver ecuaciones acopladas con métodos directos e iterativos.

y′=f

Ecuaciones diferenciales

Construir trayectorias aproximadas con Euler y Runge-Kutta.

|e|

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.

Ejemplos de representaciones exactas y aproximadas.
ProblemaExpresión exactaAproximación
Dividir una unidad en tres partes1/30.333333
Diagonal de un cuadrado unitario√21.414214
Longitud de una circunferencia de radio 12π6.283185
Raíz de cos(x) − x = 0No tiene forma elemental0.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:

  1. 1
    Definir el problema.

    Precisar qué se conoce, qué se busca, las unidades y las restricciones.

  2. 2
    Construir el modelo matemático.

    Representar las relaciones mediante funciones, ecuaciones o datos.

  3. 3
    Elegir un método numérico.

    Considerar precisión, convergencia, estabilidad, costo y propiedades del problema.

  4. 4
    Implementar el algoritmo.

    Traducir el método a código, validar entradas y registrar información útil.

  5. 5
    Verificar el cálculo.

    Probar casos conocidos, estimar el error y comparar métodos o tamaños de paso.

  6. 6
    Interpretar el resultado.

    Regresar al problema original y decidir si la respuesta es coherente y suficiente.

Problema→Modelo→Método→Código→Verificación

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:

Primeras aproximaciones de √2.
IteraciónAproximaciónResiduo |x² − 2|
011
11.50.25
21.41666666670.0069444445
31.41421568630.0000060073
41.4142135624aprox. 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ón xₙ. 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:

Fuentes de error en un cálculo computacional.
FuenteQué ocurreEjemplo
ModeloLa formulación simplifica el fenómeno real.Ignorar la resistencia del aire en una simulación.
DatosLas entradas provienen de mediciones limitadas o ruidosas.Un sensor informa 20.3 °C con resolución de 0.1 °C.
TruncamientoUn proceso infinito se reemplaza por una cantidad finita de pasos.Detener una iteración o usar una suma finita.
RedondeoLa computadora almacena números con precisión finita.0.1 + 0.2 no resulta exactamente 0.3.
ImplementaciónEl 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.

EXPERIMENTO 01

Método babilónico

xₙ₊₁ = (xₙ + 2/xₙ) / 2

Los resultados numéricos aparecen debajo.
Aproximación final1,4142135624
Valor de referencia1,4142135624
Error absoluto0
Residuo0

La aproximación mejora rápidamente durante las primeras iteraciones.

Preguntas para explorar

  1. ¿Cuántas iteraciones hacen falta para que las cifras visibles dejen de cambiar?
  2. ¿Qué sucede al comenzar con una estimación muy alejada de la raíz?
  3. Compará números menores y mayores que 1. ¿Cambia la velocidad de convergencia?
  4. ¿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:

  1. A
    Casos simples.

    Probar valores cuya respuesta conocemos, como las raíces de 0, 1, 4 y 9.

  2. B
    Propiedades.

    Verificar que el resultado al cuadrado se acerque al número original.

  3. C
    Comparación.

    Contrastar con otro algoritmo o con una función de referencia.

  4. D
    Casos límite.

    Examinar cero, números muy pequeños, valores grandes y entradas inválidas.

  5. E
    Seguimiento.

    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:

  1. π / 4
  2. 0.7854 como valor de π / 4
  3. 2 / 7
  4. 0.285714 como valor de 2 / 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, NaN e Infinity: 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.