Tutorial de métodos numéricos

Métodos de interpolación en Python

Guía práctica de Newton, Lagrange, interpolación baricéntrica, splines cúbicos, diferencias divididas, nodos de Chebyshev, fenómeno de Runge, gráficas, errores y código Python reutilizable.

Función de Runge, 11 nodos
Real Newton Nodos
Guía gratuita de interpolación. Si esta guía te ahorra tiempo, puedes apoyar más tutoriales, ejemplos y código abierto.

Qué aprenderás

Esta página está pensada para quienes buscan una explicación clara de cómo interpolar puntos en Python usando Newton o Lagrange.

Interpolación de Newton

Construye la tabla de diferencias divididas y evalúa el polinomio de Newton mediante multiplicación anidada.

Idea clave: diferencias divididas

Interpolación de Lagrange

Comprende la fórmula directa del polinomio interpolador y cómo usar SciPy en ejemplos educativos.

Idea clave: bases polinómicas

Nodos de Chebyshev

Compara nodos equiespaciados contra Chebyshev para entender por qué aparece el fenómeno de Runge.

Idea clave: mejor colocación de nodos

Interpolación baricéntrica

Compara un método de interpolación polinómica más estable para la evaluación numérica.

Idea clave: evaluación polinómica estable

Splines cúbicos

Observa por qué la interpolación por tramos evita muchas oscilaciones de los polinomios globales de grado alto.

Idea clave: interpolación suave por tramos

Nodos de Chebyshev vs nodos equiespaciados

La posición de los nodos puede importar tanto como la fórmula de interpolación. Con polinomios globales de grado alto, los nodos equiespaciados pueden crear oscilaciones grandes cerca de los extremos del intervalo. Los nodos de Chebyshev se concentran cerca de los extremos y suelen reducir ese comportamiento.

Nodos equiespaciados

Son fáciles de entender y aparecen en muchos ejemplos iniciales, pero pueden producir oscilaciones grandes en los extremos para funciones como la función de Runge.

x_nodes = np.linspace(-1, 1, n)

Nodos de Chebyshev

Están más concentrados cerca de los extremos del intervalo. En interpolación polinómica global, suelen dar un perfil de error mucho mejor que los nodos equiespaciados.

k = np.arange(1, n + 1)
x_nodes = np.cos((2*k - 1) * np.pi / (2*n))
Tipo de nodo Qué suele pasar Pruébalo en la demo
Equiespaciado Separación simple, pero más vulnerable al fenómeno de Runge. Usa la función de Runge con 11 o 21 nodos.
Chebyshev Menor oscilación en los extremos en muchos ejemplos globales. Cambia el tipo de nodo a Chebyshev y compara la curva.

Interpolación de Newton en Python

El método de Newton escribe el polinomio usando coeficientes calculados con una tabla de diferencias divididas. Es muy útil para aprender la estructura del polinomio interpolador.

Elegir los nodos de interpolación

Parte de puntos (x0, y0), (x1, y1), .... Los valores de x no deben repetirse.

Construir la tabla de diferencias divididas

La primera columna contiene los valores y. Las columnas siguientes calculan cocientes entre diferencias.

Evaluar el polinomio

La forma anidada permite evaluar el polinomio de Newton de manera compacta y eficiente.

import numpy as np
from polynomial_interpolation import (
    evaluate_newton_polynomial,
    newton_coefficients,
)

x_nodes = np.array([-1.0, -0.5, 0.0, 0.5, 1.0])
y_nodes = 1 / (1 + 25 * x_nodes**2)

coefficients = newton_coefficients(x_nodes, y_nodes)
value = evaluate_newton_polynomial(coefficients, x_nodes, 0.25)

print(float(value))

Interpolación de Lagrange en Python

Con los mismos nodos, Lagrange y Newton representan el mismo polinomio interpolador. Lagrange suele ser la fórmula más directa para entender la teoría.

import numpy as np
from scipy.interpolate import lagrange

x_nodes = np.array([-1.0, -0.5, 0.0, 0.5, 1.0])
y_nodes = 1 / (1 + 25 * x_nodes**2)

polynomial = lagrange(x_nodes, y_nodes)
print(polynomial(0.25))
Método Qué enseña Nota práctica
Newton Diferencias divididas e interpolación incremental Buen método para implementar desde cero.
Lagrange Fórmula directa del polinomio interpolador Muy claro matemáticamente, menos cómodo para actualizar.
Baricéntrico Evaluación estable de polinomios interpoladores Suele ser preferible en cálculo numérico real.
Spline cúbico Interpolación suave por tramos Evita muchos problemas de polinomios globales de grado alto.

Por dentro de la implementación en Python

El repositorio mantiene el método de Newton como funciones de NumPy pequeñas y legibles. Estas son las piezas principales, tomadas directamente de polynomial_interpolation.py.

Construir la tabla de diferencias divididas

La tabla empieza con los valores y en la primera columna. Cada columna siguiente divide la diferencia de la columna anterior entre la distancia entre los x-nodos correspondientes. Los coeficientes de Newton son simplemente la primera fila de la tabla terminada.

def divided_difference_table(x, y):
    n = len(x)
    table = np.zeros((n, n))
    table[:, 0] = y

    for order in range(1, n):
        for row in range(n - order):
            numerator = table[row + 1, order - 1] - table[row, order - 1]
            denominator = x[row + order] - x[row]
            table[row, order] = numerator / denominator

    return table

# Los coeficientes de Newton son la primera fila de la tabla:
coefficients = divided_difference_table(x, y)[0, :]

Evaluar con multiplicación anidada (esquema de Horner)

En lugar de expandir el polinomio, el evaluador recorre los coeficientes hacia atrás y multiplica sobre la marcha. Es numéricamente estable, funciona sobre un único punto o sobre un array completo de NumPy, y mantiene el coste lineal en el número de nodos.

def evaluate_newton_polynomial(coefficients, x_nodes, x_eval):
    result = np.full_like(x_eval, coefficients[-1], dtype=float)

    for i in range(len(coefficients) - 2, -1, -1):
        result = result * (x_eval - x_nodes[i]) + coefficients[i]

    return result

Comparar cuatro métodos con los mismos nodos

El experimento construye el polinomio de Newton de este repositorio y los interpoladores de Lagrange, baricéntrico y spline cúbico de SciPy, y luego mide el error máximo y L2 frente a la función real en una malla densa.

from scipy.interpolate import (
    BarycentricInterpolator,
    InterpolatedUnivariateSpline,
    lagrange,
)

# Newton (implementado en este repositorio)
coefficients = newton_coefficients(x_nodes, y_nodes)
y_newton = evaluate_newton_polynomial(coefficients, x_nodes, x_grid)

# Lagrange, baricéntrico y spline cúbico (SciPy)
y_lagrange = lagrange(x_nodes, y_nodes)(x_grid)
y_bary = BarycentricInterpolator(x_nodes, y_nodes)(x_grid)
y_spline = InterpolatedUnivariateSpline(x_nodes, y_nodes, k=3)(x_grid)

# Error frente a la función real en una malla densa
max_error = np.max(np.abs(y_newton - y_true))
l2_error = np.sqrt(np.trapezoid((y_newton - y_true)**2, x_grid))

Demo interactiva de interpolación

Cambia la función, el tipo de nodos y el punto de evaluación. La gráfica muestra cómo la elección de nodos afecta al error.

Gráfica del polinomio interpolador
Real Newton Nodos

Cómo ejecutar el repositorio

El archivo principal reproduce el experimento completo: Newton, Lagrange, método baricéntrico y spline cúbico.

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python polynomial_interpolation.py

Apoya el proyecto

Ayúdame a mantener esta guía gratis

Hice este recurso para quienes necesitan una referencia clara con código, gráficas y ejemplos. Si te ayudó, un café me ayuda a publicar más materiales de métodos numéricos.