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.
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:
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ᵢ)
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.
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:
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:
2necuaciones para interpolar ambos extremos de cada tramo;n−1ecuaciones de continuidad de la primera derivada;n−1ecuaciones 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
| Tipo | Condiciones | Cuándo usarlo |
|---|---|---|
| Natural | S″(x₀)=S″(xₙ)=0 | No conocemos pendientes; extremos con curvatura nula. |
| Sujeto o clamped | S′(x₀)=m₀, S′(xₙ)=mₙ | Conocemos las pendientes de los extremos. |
| Not-a-knot | Continuidad adicional de S‴ en el segundo y penúltimo nodo | Opción predeterminada de varias bibliotecas. |
| Periódico | Derivadas iguales al cerrar el intervalo | Datos 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:
En un spline natural, M₀=Mₙ=0. Para cada nodo interior, la continuidad de la primera derivada conduce a:
=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:
⎢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:
+(yᵢ−Mᵢhᵢ²/6)(xᵢ₊₁−x)/hᵢ
+(yᵢ₊₁−Mᵢ₊₁hᵢ²/6)(x−xᵢ)/hᵢ
También podemos guardar coeficientes locales aᵢ,bᵢ,cᵢ,dᵢ:
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:
Al sustituir en las fórmulas obtenemos:
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
| Aspecto | Polinomio global | Spline cúbico |
|---|---|---|
| Grado | Hasta n | Como máximo 3 por tramo |
| Preprocesamiento típico | O(n²) con Newton | O(n) tras ordenar |
| Evaluación | O(n) | O(log n) |
| Efecto de un dato | Global | Principalmente local, aunque las condiciones acoplan curvaturas |
| Oscilaciones con muchos nodos | Pueden crecer mucho | Generalmente 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.
Muchas cúbicas, una curva suave
f(x)=1/(1+25x²)
El spline mantiene grado tres aunque aumente la cantidad de nodos.
Preguntas para explorar
- En Runge, aumentá los nodos y compará ambas curvas cerca de
x=±1. - Mové la consulta exactamente sobre un nodo: ambos errores deben acercarse a cero.
- Observá que el spline pasa por cada muestra sin adquirir un grado global mayor.
- 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.