Interpolación y datos · Tema 22

Splines cúbicos

Cómo unir polinomios locales con continuidad y curvatura suave, evitando que un único polinomio de grado alto domine toda la interpolación.

01 · Del modelo global al local

Una curva compuesta, no un polinomio enorme

Los métodos de Lagrange y Newton construyen un único polinomio que atraviesa todos los datos. Si hay muchos nodos, su grado crece y una modificación local puede cambiar la curva en todo el intervalo.

Un spline cúbico adopta otra estrategia: entre cada par de nodos consecutivos utiliza un polinomio de grado a lo sumo tres.

S(x)=Sᵢ(x),   x∈[xᵢ,xᵢ₊₁],   i=0,…,n−1

Las piezas no se eligen de manera independiente. Se imponen condiciones en sus uniones para que el resultado se comporte como una sola curva suave.

02 · Qué debe cumplir

Interpolación y suavidad C²

Dados nodos ordenados x₀<x₁<…<xₙ y valores yᵢ, cada tramo debe interpolar sus extremos:

Sᵢ(xᵢ)=yᵢ,    Sᵢ(xᵢ₊₁)=yᵢ₊₁

En cada nodo interior xᵢ, las dos piezas vecinas deben coincidir también en pendiente y curvatura:

Sᵢ₋₁(xᵢ)=Sᵢ(xᵢ)
S′ᵢ₋₁(xᵢ)=S′ᵢ(xᵢ)
S″ᵢ₋₁(xᵢ)=S″ᵢ(xᵢ)

Decimos que S∈C²: la función, su primera derivada y su segunda derivada son continuas. La tercera derivada puede saltar al pasar de un tramo a otro.

C⁰: sin saltos+C¹: sin esquinas+C²: curvatura continua

03 · Grado mínimo útil

¿Por qué polinomios cúbicos?

Una recta interpola dos extremos, pero su pendiente constante produce esquinas en los nodos. Una cuadrática admite curvatura, aunque no ofrece suficientes grados de libertad para coordinar cómodamente valor, pendiente y segunda derivada en todos los empalmes.

Un cúbico tiene cuatro coeficientes:

Sᵢ(x)=aᵢ+bᵢ(x−xᵢ)+cᵢ(x−xᵢ)²+dᵢ(x−xᵢ)³

Estos cuatro parámetros permiten interpolar los extremos y ajustar las derivadas necesarias. El uso de x−xᵢ como variable local simplifica las fórmulas y reduce magnitudes intermedias.

04 · Unicidad

Por qué faltan dos condiciones

Hay n tramos y cuatro coeficientes por tramo: en total, 4n incógnitas. Las restricciones aportan:

  • 2n ecuaciones para interpolar ambos extremos de cada tramo;
  • n−1 ecuaciones de continuidad de la primera derivada;
  • n−1 ecuaciones de continuidad de la segunda derivada.

La suma es 4n−2. Todavía hacen falta dos condiciones de frontera para obtener una solución única. La forma de elegirlas define el tipo de spline.

05 · Cerrar el sistema

Condiciones de frontera

Condiciones habituales en los extremos.
TipoCondicionesCuándo usarlo
NaturalS″(x₀)=S″(xₙ)=0No conocemos pendientes; extremos con curvatura nula.
Sujeto o clampedS′(x₀)=m₀, S′(xₙ)=mₙConocemos las pendientes de los extremos.
Not-a-knotContinuidad adicional de S‴ en el segundo y penúltimo nodoOpción predeterminada de varias bibliotecas.
PeriódicoDerivadas iguales al cerrar el intervaloDatos que representan un ciclo completo.

En este tema construiremos el spline natural. Es sencillo, frecuente y permite ver con claridad el sistema numérico central.

06 · Incógnitas convenientes

Resolver primero las curvaturas nodales

Definimos la longitud de cada intervalo y la segunda derivada en cada nodo:

hᵢ=xᵢ₊₁−xᵢ,    Mᵢ=S″(xᵢ)

En un spline natural, M₀=Mₙ=0. Para cada nodo interior, la continuidad de la primera derivada conduce a:

hᵢ₋₁Mᵢ₋₁+2(hᵢ₋₁+hᵢ)Mᵢ+hᵢMᵢ₊₁
=6[(yᵢ₊₁−yᵢ)/hᵢ−(yᵢ−yᵢ₋₁)/hᵢ₋₁]

El lado derecho mide cuánto cambia la pendiente entre dos intervalos vecinos. Si los datos son colineales, ese cambio es cero y todas las curvaturas resultan nulas.

07 · Estructura numérica

Un sistema tridiagonal

Cada ecuación interior contiene solo Mᵢ₋₁, Mᵢ y Mᵢ₊₁. La matriz tiene elementos únicamente en tres diagonales:

⎡1   0   0   ⋯   0⎤
⎢h₀   2(h₀+h₁)   h₁   ⋱   ⋮⎥
⎢0   h₁   2(h₁+h₂)   ⋱   0⎥
⎢⋮   ⋱   ⋱   ⋱   hₙ₋₁⎥
⎣0   ⋯   0   0   1⎦

Un sistema denso de tamaño n+1 costaría en general O(n³). El algoritmo de Thomas aprovecha esta estructura y necesita solo O(n) tiempo y memoria.

08 · De curvaturas a tramos

Fórmula de cada pieza

Una vez calculados Mᵢ y Mᵢ₊₁, la pieza sobre [xᵢ,xᵢ₊₁] es:

Sᵢ(x)=Mᵢ(xᵢ₊₁−x)³/(6hᵢ)+Mᵢ₊₁(x−xᵢ)³/(6hᵢ)
+(yᵢ−Mᵢhᵢ²/6)(xᵢ₊₁−x)/hᵢ
+(yᵢ₊₁−Mᵢ₊₁hᵢ²/6)(x−xᵢ)/hᵢ

También podemos guardar coeficientes locales aᵢ,bᵢ,cᵢ,dᵢ:

aᵢ=yᵢ
bᵢ=(yᵢ₊₁−yᵢ)/hᵢ−hᵢ(2Mᵢ+Mᵢ₊₁)/6
cᵢ=Mᵢ/2
dᵢ=(Mᵢ₊₁−Mᵢ)/(6hᵢ)

Entonces evaluamos con t=x−xᵢ mediante la forma anidada aᵢ+t(bᵢ+t(cᵢ+tdᵢ)).

09 · Cálculo manual

Tres puntos y dos cúbicas

Consideremos (0,0), (1,1) y (2,0). Tenemos h₀=h₁=1 y, por ser natural, M₀=M₂=0. La única ecuación interior es:

4M₁=6[(0−1)−(1−0)]=−12   ⇒   M₁=−3

Al sustituir en las fórmulas obtenemos:

S₀(x)=1.5x−0.5x³,   0≤x≤1
S₁(x)=1−1.5(x−1)²+0.5(x−1)³,   1≤x≤2

En x=1, ambas piezas valen 1, sus pendientes valen 0 y sus segundas derivadas valen −3. No hay salto, esquina ni cambio brusco de curvatura.

10 · Preprocesamiento

Construir un spline natural en JavaScript

La eliminación hacia adelante y la sustitución hacia atrás resuelven directamente el sistema tridiagonal. El resultado almacena un cúbico local por intervalo:

function splineNatural(puntos) {
  if (puntos.length < 2) throw new Error("Se requieren dos puntos");
  const datos = puntos.map(([x, y]) => [Number(x), Number(y)]);
  for (const [x, y] of datos) {
    if (!Number.isFinite(x) || !Number.isFinite(y)) {
      throw new Error("Todos los datos deben ser finitos");
    }
  }
  datos.sort((p, q) => p[0] - q[0]);

  const n = datos.length - 1;
  const x = datos.map(p => p[0]);
  const y = datos.map(p => p[1]);
  const h = Array(n);
  for (let i = 0; i < n; i++) {
    h[i] = x[i + 1] - x[i];
    if (h[i] === 0) throw new Error("Hay nodos duplicados");
  }

  const inferior = Array(n + 1).fill(0);
  const diagonal = Array(n + 1).fill(1);
  const superior = Array(n + 1).fill(0);
  const rhs = Array(n + 1).fill(0);

  for (let i = 1; i < n; i++) {
    inferior[i] = h[i - 1];
    diagonal[i] = 2 * (h[i - 1] + h[i]);
    superior[i] = h[i];
    rhs[i] = 6 * ((y[i + 1] - y[i]) / h[i]
      - (y[i] - y[i - 1]) / h[i - 1]);
  }

  for (let i = 1; i <= n; i++) {
    const factor = inferior[i] / diagonal[i - 1];
    diagonal[i] -= factor * superior[i - 1];
    rhs[i] -= factor * rhs[i - 1];
  }

  const M = Array(n + 1).fill(0);
  M[n] = rhs[n] / diagonal[n];
  for (let i = n - 1; i >= 0; i--) {
    M[i] = (rhs[i] - superior[i] * M[i + 1]) / diagonal[i];
  }

  const tramos = Array.from({ length: n }, (_, i) => ({
    x: x[i],
    a: y[i],
    b: (y[i + 1] - y[i]) / h[i] - h[i] * (2 * M[i] + M[i + 1]) / 6,
    c: M[i] / 2,
    d: (M[i + 1] - M[i]) / (6 * h[i])
  }));
  return { nodos: x, tramos, curvaturas: M };
}

const modelo = splineNatural([[0, 0], [1, 1], [2, 0]]);
console.log(modelo.curvaturas); // [0, -3, 0]

Ordenar copias de los datos hace que la función acepte entradas desordenadas sin modificar el arreglo original. Después de ordenar, un intervalo nulo revela nodos duplicados.

11 · Consulta eficiente

Localizar el tramo y aplicar Horner

Para evaluar, primero localizamos el intervalo mediante búsqueda binaria. Eso cuesta O(log n); evaluar el cúbico cuesta O(1).

function evaluarSpline(modelo, valorX) {
  const { nodos, tramos } = modelo;
  if (valorX < nodos[0] || valorX > nodos.at(-1)) {
    throw new RangeError("La consulta está fuera del intervalo");
  }

  let izquierda = 0;
  let derecha = nodos.length - 2;
  while (izquierda <= derecha) {
    const medio = Math.floor((izquierda + derecha) / 2);
    if (valorX < nodos[medio]) derecha = medio - 1;
    else if (valorX > nodos[medio + 1]) izquierda = medio + 1;
    else {
      const { x, a, b, c, d } = tramos[medio];
      const t = valorX - x;
      return a + t * (b + t * (c + t * d));
    }
  }
}

const spline = splineNatural([[0, 0], [1, 1], [2, 0]]);
console.log(evaluarSpline(spline, 0.5)); // 0.6875
console.log(evaluarSpline(spline, 1.5)); // 0.6875

En x=xₙ, la búsqueda selecciona el último tramo. La función rechaza la extrapolación deliberadamente: extender la última cúbica es posible, pero no conserva garantías fuera de los datos.

12 · Costos y actualizaciones

Qué ganamos y qué no

Comparación práctica de representaciones interpolantes.
AspectoPolinomio globalSpline cúbico
GradoHasta nComo máximo 3 por tramo
Preprocesamiento típicoO(n²) con NewtonO(n) tras ordenar
EvaluaciónO(n)O(log n)
Efecto de un datoGlobalPrincipalmente local, aunque las condiciones acoplan curvaturas
Oscilaciones con muchos nodosPueden crecer muchoGeneralmente moderadas

Agregar o modificar un nodo puede alterar varias curvaturas porque el sistema está conectado. “Por tramos” no significa que cada segmento sea independiente; significa que la representación y el comportamiento son mucho más locales.

13 · Precisión y forma

Error, ruido y preservación de forma

Para una función suficientemente suave y una malla con paso máximo h, el error del spline cúbico suele decrecer como O(h⁴) en el interior. Reducir a la mitad el espaciamiento puede disminuir el error aproximadamente por un factor de dieciséis.

Sin embargo, interpolar significa atravesar cada dato. Si las observaciones contienen ruido, el spline también lo seguirá. En ese caso puede convenir un spline de suavizado o el ajuste por mínimos cuadrados del próximo tema.

14 · Exploración interactiva

Laboratorio: spline local frente a polinomio global

Elegí un conjunto de datos y la cantidad de nodos. La curva turquesa es el spline natural; la dorada es el polinomio global de Newton construido con los mismos puntos.

EXPERIMENTO 22

Muchas cúbicas, una curva suave

f(x)=1/(1+25x²)

Los resultados numéricos aparecen debajo.
Spline S(x)—
Polinomio p(x)—
Error del spline—
Error del polinomio—

El spline mantiene grado tres aunque aumente la cantidad de nodos.

Preguntas para explorar

  1. En Runge, aumentá los nodos y compará ambas curvas cerca de x=±1.
  2. Mové la consulta exactamente sobre un nodo: ambos errores deben acercarse a cero.
  3. Observá que el spline pasa por cada muestra sin adquirir un grado global mayor.
  4. Probá el pico asimétrico y buscá pequeños excesos entre nodos.

15 · Comprensión

Confusiones frecuentes

«Cada tramo puede calcularse de manera aislada»

No. Las condiciones de derivadas en los nodos conectan los tramos y originan el sistema tridiagonal.

«Natural significa que la pendiente es cero en los extremos»

En un spline natural es cero la segunda derivada, no necesariamente la primera.

«C² significa que la curva tiene dos tramos»

C² describe continuidad hasta la derivada de orden dos; la cantidad de tramos depende de los nodos.

«El spline cúbico nunca oscila»

Suele oscilar mucho menos que un polinomio global de grado alto, pero puede sobrepasar datos o perder monotonicidad.

«Interpolar es lo mismo que suavizar ruido»

Un interpolante pasa por todas las muestras, incluido el ruido. Suavizar permite residuos para revelar una tendencia.

16 · Práctica guiada

Ejercicios

Ejercicio 1: cantidad de tramos

¿Cuántos polinomios cúbicos se necesitan para interpolar seis nodos distintos?

Ver solución

Cinco. Cada tramo corresponde a uno de los intervalos entre nodos consecutivos.

Ejercicio 2: condición natural

¿Qué valores toman M₀ y Mₙ en un spline natural?

Ver solución

M₀=Mₙ=0, porque representan las segundas derivadas en los extremos.

Ejercicio 3: datos lineales

Si todos los puntos pertenecen a una misma recta, ¿qué produce el spline natural?

Ver solución razonada

Las pendientes consecutivas son iguales, el lado derecho del sistema es cero y todas las curvaturas Mᵢ son cero. Cada cúbica se reduce a la misma recta.

Ejercicio 4: ejemplo manual

Para los puntos (0,0), (1,1) y (2,0), evaluá el spline natural en x=0.5.

Ver solución

En el primer tramo, S₀(x)=1.5x−0.5x³. Por lo tanto, S₀(0.5)=0.75−0.0625=0.6875.

Ejercicio 5: derivadas

Extendé el evaluador para devolver también S′(x) y S″(x).

Ver una posible solución
function evaluarTramoConDerivadas(tramo, valorX) {
  const { x, a, b, c, d } = tramo;
  const t = valorX - x;
  return {
    valor: a + t * (b + t * (c + t * d)),
    primera: b + t * (2 * c + 3 * d * t),
    segunda: 2 * c + 6 * d * t
  };
}

console.log(evaluarTramoConDerivadas(
  { x: 0, a: 0, b: 1.5, c: 0, d: -0.5 }, 0.5
));
// { valor: 0.6875, primera: 1.125, segunda: -1.5 }

17 · Síntesis

Ideas para recordar

  • Un spline cúbico utiliza un polinomio de grado a lo sumo tres en cada intervalo.
  • Las piezas interpolan los datos y coinciden en valor, pendiente y curvatura.
  • Se necesitan dos condiciones de frontera para obtener una solución única.
  • El spline natural impone segunda derivada nula en ambos extremos.
  • Las curvaturas interiores satisfacen un sistema tridiagonal.
  • El algoritmo de Thomas construye el modelo en tiempo lineal.
  • La búsqueda binaria y Horner permiten consultas en O(log n).
  • Los splines suelen controlar mejor las oscilaciones que un polinomio global.
  • Interpolar no elimina ruido ni garantiza monotonía.

En el próximo tema dejaremos de exigir que la curva atraviese todos los datos y estudiaremos el ajuste por mínimos cuadrados, apropiado para mediciones con ruido.