Interpolación trigonométrica

Interpolación trigonométrica#

Sea \(\mathcal{T}_{n}\) el conjunto de todas las combinaciones lineales de las funciones \(\phi_{0}, \phi_{1}, \dots , \phi_{2n−1}\). Este conjunto se denomina conjunto de los polinomios trigonométricos de grado menor o igual a \(n\).

Para una función \(f \in C[−\pi, \pi]\), queremos hallar la aproximación continua por mínimos cuadrados mediante funciones de \(\mathcal{T}_{n}\) de la forma

\[ S_{n}(x) = \frac{a_{0}}{2} + a_{n}\cos(nx) + \sum_{k=1}^{n-1}(a_{k}\cos(kx) + b_{k}\sin(kx)). \]

Dado que el conjunto de funciones \(\{\phi_{0}, \phi_{1}, \dots , \phi_{2n−1}\}\) es ortogonal en \([−\pi, \pi]\) con respecto a \(w(x) \equiv 1\), la selección apropiada de coeficientes es

\[ a_{k} = \frac{\int_{-\pi}^{\pi}f(x)\cos(kx)~\mathrm{d}x}{\int_{-\pi}^{\pi}\cos(kx)^{2}~\mathrm{d}x} = \frac{1}{\pi} \int_{-\pi}^{\pi}f(x)\cos(kx)~\mathrm{d}x, \quad \text{para cada} \quad k=0,1,2,\dots,n, \]

y

\[ b_{k} = \frac{\int_{-\pi}^{\pi}f(x)\sin(kx)~\mathrm{d}x}{\int_{-\pi}^{\pi}\sin(kx)^{2}~\mathrm{d}x} = \frac{1}{\pi} \int_{-\pi}^{\pi}f(x)\sin(kx)~\mathrm{d}x, \quad \text{para cada} \quad k=1,2,\dots,n-1, \]

El límite de \(S_{n}(x)\) cuando \(n \to \infty\) se denomina serie de Fourier de \(f\).

Ejemplo 1. Determine el polinomio trigonométrico de \(\mathcal{T}_{n}\) que aproxime

\[ f(x) = |x|, \quad x \in (-\pi,\pi). \]

Aproximación trigonométrica discreta#

Suponga que se da un conjunto de \(2m\) pares de datos \(\{(x_{j}, y_{j})\}_{j=0}^{2m-1}\), donde los primeros elementos de los pares dividen equitativamente un intervalo cerrado. Por conveniencia, suponemos que el intervalo es \([-\pi, \pi]\)

\[ x_{j} = -\pi + \left( \frac{j}{m} \right)\pi, \quad \text{para cada} \quad j=0,1,\dots,2m-1. \]

Si no es \([-\pi, \pi]\), se podría utilizar una transformación lineal sencilla para convertir los datos a esta forma.

El objetivo en el caso discreto es determinar el polinomio trigonométrico \(S_{n}(x)\) en \(\mathcal{T}_{n}\) que minimice

\[ E(S_{n}) = \sum_{j=0}^{2m-1} \left[y_{j} - S_{n}(x_{j}) \right]^{2} \]

Teorema 15

Las constantes en la sumatoria

\[ S_{n}(x) = \frac{a_{0}}{2} + a_{n}\cos(nx) + \sum_{k=1}^{n-1}(a_{k}\cos(kx) + b_{k}\sin(kx)), \]

que minimizan la suma de los cuadrados

\[ E(a_{0},\dots,a_{n},b_{1},\dots,b_{n-1}) = \sum_{j=0}^{2m-1} \left(y_{j} - S_{n}(x_{j}) \right)^{2} \]

son

\[ a_{k} = \frac{1}{m} \sum_{j=0}^{2m-1} y_{j}\cos(kx_{j}), \quad \text{para cada} \quad k=0,1,\dots,n, \]

y

\[ b_{k} = \frac{1}{m} \sum_{j=0}^{2m-1} y_{j}\sin(kx_{j}), \quad \text{para cada} \quad k=1,2,\dots,n-1. \]

Ejemplo 2. Encuentre \(S_{2}(x)\), el polinomio trigonométrico de grado 2 de mínimos cuadrados discretos para

\[ f(x) = 2x^{2} − 9 \quad \text{cuando} \quad x \in [−\pi, \pi]. \]

Ejemplo 3. Halle la aproximación de mínimos cuadrados discretos \(S_{3} (x)\) para

\[ f(x) = x^{4} - 3x^{3} + 2x^{2} - \tan(x(x-2)), \]

utilizando los datos \(\{(x_{j}, y_{j})\}^{9}_{j=0}\), donde \(x_{j} = j/5\) y \(y_{j} = f(x_{j})\).

import numpy as np
import matplotlib.pyplot as plt

def interpolacion_trigonometrica_discreta(x_datos, y_datos, n):
    """
    Calcula los coeficientes y evalúa el polinomio trigonométrico S_n(x)
    de mínimos cuadrados discretos para un conjunto de 2m datos en [-pi, pi].

    Parámetros:
    - x_datos: array de nodos x_j (deben tener longitud 2m)
    - y_datos: array de valores y_j correspondientes
    - n: grado del polinomio trigonométrico (n <= m)
    """
    N_puntos = len(x_datos)
    if N_puntos % 2 != 0:
        raise ValueError("El número de puntos de datos (2m) debe ser par.")

    m = N_puntos // 2

    # Cálculo de a_k para k = 0, 1, ..., n
    a = np.zeros(n + 1)
    for k in range(n + 1):
        suma = 0.0
        for j in range(N_puntos):
            suma += y_datos[j] * np.cos(k * x_datos[j])
        a[k] = (1.0 / m) * suma

    # Cálculo de b_k para k = 1, 2, ..., n-1
    b = np.zeros(n) # b[0] no se usa, dejamos espacio por comodidad de índices
    for k in range(1, n):
        suma = 0.0
        for j in range(N_puntos):
            suma += y_datos[j] * np.sin(k * x_datos[j])
        b[k] = (1.0 / m) * suma

    # Función para evaluar el polinomio S_n(x) en cualquier punto o arreglo x
    def S_n(x):
        resultado = (a[0] / 2.0) + a[n] * np.cos(n * x)
        for k in range(1, n):
            resultado += a[k] * np.cos(k * x) + b[k] * np.sin(k * x)
        return resultado

    return a, b, S_n